summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/kodi-addon-dev-kit
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/kodi-addon-dev-kit')
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h1288
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/AudioEngine.h618
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/CMakeLists.txt16
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/Filesystem.h2321
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h834
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/Network.h282
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCodec.h126
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCrypto.h42
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioDecoder.h363
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioEncoder.h218
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/CMakeLists.txt16
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Game.h2360
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/ImageDecoder.h315
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Inputstream.h881
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PVR.h3423
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Peripheral.h847
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PeripheralUtils.h735
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Screensaver.h460
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VFS.h1265
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h246
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h789
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt13
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h271
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Channels.h518
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EDL.h90
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EPG.h500
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/General.h511
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h130
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Recordings.h520
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Stream.h330
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Timers.h896
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/CMakeLists.txt9
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt6
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h78
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr.h327
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt14
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channel_groups.h54
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channels.h104
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_defines.h61
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_edl.h62
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_epg.h653
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_general.h288
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_menu_hook.h72
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_recordings.h143
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_stream.h155
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_timers.h407
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon_base.h252
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/audio_engine.h308
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/filesystem.h299
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/general.h123
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/network.h43
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/CMakeLists.txt9
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/General.h175
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h366
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h909
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Button.h171
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/CMakeLists.txt16
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Edit.h275
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/FadeLabel.h153
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Image.h116
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Label.h121
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Progress.h114
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/RadioButton.h167
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Rendering.h205
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/SettingsSlider.h326
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Slider.h339
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Spin.h365
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/TextBox.h168
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h433
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt14
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h185
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h250
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/FileBrowser.h310
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h422
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h362
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/OK.h99
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Progress.h255
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h269
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/TextViewer.h108
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/YesNo.h188
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/CMakeLists.txt7
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GL.h111
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GLonDX.h369
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/Shader.h594
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/renderHelper.h78
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/platform/android/System.h114
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/CMakeLists.txt5
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/DllHelper.h211
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h482
89 files changed, 0 insertions, 33543 deletions
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
deleted file mode 100644
index b0fddda..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
+++ /dev/null
@@ -1,1288 +0,0 @@
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 "c-api/addon_base.h"
12#include "versions.h"
13
14#include <assert.h> /* assert */
15#include <cstdlib>
16#include <cstring>
17#include <ctime>
18#include <memory>
19#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
20#include <stdexcept>
21#include <string>
22#include <vector>
23
24namespace kodi
25{
26
27namespace gui
28{
29struct IRenderHelper;
30} // namespace gui
31
32//==============================================================================
33/// @ingroup cpp_kodi_addon_addonbase_Defs
34/// @defgroup cpp_kodi_addon_addonbase_Defs_CSettingValue class CSettingValue
35/// @brief Inside addon main instance used helper class to give settings value.
36///
37/// This is used on @ref addon::CAddonBase::SetSetting() to inform addon about
38/// settings change by used. This becomes then used to give the related value
39/// name.
40///
41/// ----------------------------------------------------------------------------
42///
43/// @copydetails cpp_kodi_addon_addonbase_Defs_CSettingValue_Help
44///
45/// ----------------------------------------------------------------------------
46///
47/// **Here is a code example how this is used:**
48///
49/// ~~~~~~~~~~~~~{.cpp}
50/// #include <kodi/AddonBase.h>
51///
52/// enum myEnumValue
53/// {
54/// valueA,
55/// valueB,
56/// valueC
57/// };
58///
59/// std::string m_myStringValue;
60/// int m_myIntegerValue;
61/// bool m_myBooleanValue;
62/// float m_myFloatingPointValue;
63/// myEnumValue m_myEnumValue;
64///
65///
66/// ADDON_STATUS CMyAddon::SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue)
67/// {
68/// if (settingName == "my_string_value")
69/// m_myStringValue = settingValue.GetString();
70/// else if (settingName == "my_integer_value")
71/// m_myIntegerValue = settingValue.GetInt();
72/// else if (settingName == "my_boolean_value")
73/// m_myBooleanValue = settingValue.GetBoolean();
74/// else if (settingName == "my_float_value")
75/// m_myFloatingPointValue = settingValue.GetFloat();
76/// else if (settingName == "my_enum_value")
77/// m_myEnumValue = settingValue.GetEnum<myEnumValue>();
78/// }
79/// ~~~~~~~~~~~~~
80///
81/// @note The asked type should match the type used on settings.xml.
82///
83///@{
84class ATTRIBUTE_HIDDEN CSettingValue
85{
86public:
87 explicit CSettingValue(const void* settingValue) : m_settingValue(settingValue) {}
88
89 bool empty() const { return (m_settingValue == nullptr) ? true : false; }
90
91 /// @defgroup cpp_kodi_addon_addonbase_Defs_CSettingValue_Help Value Help
92 /// @ingroup cpp_kodi_addon_addonbase_Defs_CSettingValue
93 ///
94 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_addonbase_Defs_CSettingValue :</b>
95 /// | Name | Type | Get call
96 /// |------|------|----------
97 /// | **Settings value as string** | `std::string` | @ref CSettingValue::GetString "GetString"
98 /// | **Settings value as integer** | `int` | @ref CSettingValue::GetInt "GetInt"
99 /// | **Settings value as unsigned integer** | `unsigned int` | @ref CSettingValue::GetUInt "GetUInt"
100 /// | **Settings value as boolean** | `bool` | @ref CSettingValue::GetBoolean "GetBoolean"
101 /// | **Settings value as floating point** | `float` | @ref CSettingValue::GetFloat "GetFloat"
102 /// | **Settings value as enum** | `enum` | @ref CSettingValue::GetEnum "GetEnum"
103
104 /// @addtogroup cpp_kodi_addon_addonbase_Defs_CSettingValue
105 ///@{
106
107 /// @brief To get settings value as string.
108 std::string GetString() const { return (const char*)m_settingValue; }
109
110 /// @brief To get settings value as integer.
111 int GetInt() const { return *(const int*)m_settingValue; }
112
113 /// @brief To get settings value as unsigned integer.
114 unsigned int GetUInt() const { return *(const unsigned int*)m_settingValue; }
115
116 /// @brief To get settings value as boolean.
117 bool GetBoolean() const { return *(const bool*)m_settingValue; }
118
119 /// @brief To get settings value as floating point.
120 float GetFloat() const { return *(const float*)m_settingValue; }
121
122 /// @brief To get settings value as enum.
123 /// @note Inside settings.xml them stored as integer.
124 template<typename enumType>
125 enumType GetEnum() const
126 {
127 return static_cast<enumType>(*(const int*)m_settingValue);
128 }
129
130 ///@}
131
132private:
133 const void* m_settingValue;
134};
135///@}
136//------------------------------------------------------------------------------
137
138namespace addon
139{
140
141//==============================================================================
142/*
143 * Internal class to control various instance types with general parts defined
144 * here.
145 *
146 * Mainly is this currently used to identify requested instance types.
147 *
148 * @note This class is not need to know during add-on development thats why
149 * commented with "*".
150 */
151class ATTRIBUTE_HIDDEN IAddonInstance
152{
153public:
154 explicit IAddonInstance(ADDON_TYPE type, const std::string& version)
155 : m_type(type), m_kodiVersion(version)
156 {
157 }
158 virtual ~IAddonInstance() = default;
159
160 virtual ADDON_STATUS CreateInstance(int instanceType,
161 const std::string& instanceID,
162 KODI_HANDLE instance,
163 const std::string& version,
164 KODI_HANDLE& addonInstance)
165 {
166 return ADDON_STATUS_NOT_IMPLEMENTED;
167 }
168
169 const ADDON_TYPE m_type;
170 const std::string m_kodiVersion;
171 std::string m_id;
172};
173
174/*
175 * Internally used helper class to manage processing of a "C" structure in "CPP"
176 * class.
177 *
178 * At constant, the "C" structure is copied, otherwise the given pointer is
179 * superseded and is changeable.
180 *
181 * -----------------------------------------------------------------------------
182 *
183 * Example:
184 *
185 * ~~~~~~~~~~~~~{.cpp}
186 * extern "C" typedef struct C_SAMPLE_DATA
187 * {
188 * unsigned int iUniqueId;
189 * } C_SAMPLE_DATA;
190 *
191 * class CPPSampleData : public CStructHdl<CPPSampleData, C_SAMPLE_DATA>
192 * {
193 * public:
194 * CPPSampleData() = default;
195 * CPPSampleData(const CPPSampleData& sample) : CStructHdl(sample) { }
196 * CPPSampleData(const C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
197 * CPPSampleData(C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
198 *
199 * void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; }
200 * unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; }
201 * };
202 *
203 * ~~~~~~~~~~~~~
204 *
205 * It also works with the following example:
206 *
207 * ~~~~~~~~~~~~~{.cpp}
208 * CPPSampleData test;
209 * // Some work
210 * C_SAMPLE_DATA* data = test;
211 * // Give "data" to Kodi
212 * ~~~~~~~~~~~~~
213 */
214template<class CPP_CLASS, typename C_STRUCT>
215class CStructHdl
216{
217public:
218 CStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true) {}
219
220 CStructHdl(const CPP_CLASS& cppClass)
221 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)), m_owner(true)
222 {
223 }
224
225 CStructHdl(const C_STRUCT* cStructure) : m_cStructure(new C_STRUCT(*cStructure)), m_owner(true) {}
226
227 CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
228
229 const CStructHdl& operator=(const CStructHdl& right)
230 {
231 assert(&right.m_cStructure);
232 if (m_cStructure && !m_owner)
233 {
234 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
235 }
236 else
237 {
238 if (m_owner)
239 delete m_cStructure;
240 m_owner = true;
241 m_cStructure = new C_STRUCT(*right.m_cStructure);
242 }
243 return *this;
244 }
245
246 const CStructHdl& operator=(const C_STRUCT& right)
247 {
248 assert(&right);
249 if (m_cStructure && !m_owner)
250 {
251 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
252 }
253 else
254 {
255 if (m_owner)
256 delete m_cStructure;
257 m_owner = true;
258 m_cStructure = new C_STRUCT(*right);
259 }
260 return *this;
261 }
262
263 virtual ~CStructHdl()
264 {
265 if (m_owner)
266 delete m_cStructure;
267 }
268
269 operator C_STRUCT*() { return m_cStructure; }
270 operator const C_STRUCT*() const { return m_cStructure; }
271
272 const C_STRUCT* GetCStructure() const { return m_cStructure; }
273
274protected:
275 C_STRUCT* m_cStructure = nullptr;
276
277private:
278 bool m_owner = false;
279};
280
281/// Add-on main instance class.
282class ATTRIBUTE_HIDDEN CAddonBase
283{
284public:
285 CAddonBase()
286 {
287 m_interface->toAddon->destroy = ADDONBASE_Destroy;
288 m_interface->toAddon->get_status = ADDONBASE_GetStatus;
289 m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
290 m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
291 m_interface->toAddon->set_setting = ADDONBASE_SetSetting;
292 }
293
294 virtual ~CAddonBase() = default;
295
296 virtual ADDON_STATUS Create() { return ADDON_STATUS_OK; }
297
298 virtual ADDON_STATUS GetStatus() { return ADDON_STATUS_OK; }
299
300 //============================================================================
301 /// @ingroup cpp_kodi_addon_addonbase
302 /// @brief To inform addon about changed settings values.
303 ///
304 /// This becomes called for every entry defined inside his settings.xml and
305 /// as **last** call the one where last in xml (to identify end of calls).
306 ///
307 /// --------------------------------------------------------------------------
308 ///
309 /// @copydetails cpp_kodi_addon_addonbase_Defs_CSettingValue_Help
310 ///
311 ///
312 /// --------------------------------------------------------------------------
313 ///
314 /// **Here is a code example how this is used:**
315 ///
316 /// ~~~~~~~~~~~~~{.cpp}
317 /// #include <kodi/AddonBase.h>
318 ///
319 /// enum myEnumValue
320 /// {
321 /// valueA,
322 /// valueB,
323 /// valueC
324 /// };
325 ///
326 /// std::string m_myStringValue;
327 /// int m_myIntegerValue;
328 /// bool m_myBooleanValue;
329 /// float m_myFloatingPointValue;
330 /// myEnumValue m_myEnumValue;
331 ///
332 ///
333 /// ADDON_STATUS CMyAddon::SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue)
334 /// {
335 /// if (settingName == "my_string_value")
336 /// m_myStringValue = settingValue.GetString();
337 /// else if (settingName == "my_integer_value")
338 /// m_myIntegerValue = settingValue.GetInt();
339 /// else if (settingName == "my_boolean_value")
340 /// m_myBooleanValue = settingValue.GetBoolean();
341 /// else if (settingName == "my_float_value")
342 /// m_myFloatingPointValue = settingValue.GetFloat();
343 /// else if (settingName == "my_enum_value")
344 /// m_myEnumValue = settingValue.GetEnum<myEnumValue>();
345 /// }
346 /// ~~~~~~~~~~~~~
347 ///
348 /// @note The asked type should match the type used on settings.xml.
349 ///
350 virtual ADDON_STATUS SetSetting(const std::string& settingName,
351 const kodi::CSettingValue& settingValue)
352 {
353 return ADDON_STATUS_UNKNOWN;
354 }
355 //----------------------------------------------------------------------------
356
357 //==========================================================================
358 /// @ingroup cpp_kodi_addon_addonbase
359 /// @brief Instance created
360 ///
361 /// @param[in] instanceType The requested type of required instance, see \ref ADDON_TYPE.
362 /// @param[in] instanceID An individual identification key string given by Kodi.
363 /// @param[in] instance The instance handler used by Kodi must be passed to
364 /// the classes created here. See in the example.
365 /// @param[in] version The from Kodi used version of instance. This can be
366 /// used to allow compatibility to older versions of
367 /// them. Further is this given to the parent instance
368 /// that it can handle differences.
369 /// @param[out] addonInstance The pointer to instance class created in addon.
370 /// Needed to be able to identify them on calls.
371 /// @return \ref ADDON_STATUS_OK if correct, for possible errors
372 /// see \ref ADDON_STATUS
373 ///
374 ///
375 /// --------------------------------------------------------------------------
376 ///
377 /// **Here is a code example how this is used:**
378 ///
379 /// ~~~~~~~~~~~~~{.cpp}
380 /// #include <kodi/AddonBase.h>
381 ///
382 /// ...
383 ///
384 /// /* If you use only one instance in your add-on, can be instanceType and
385 /// * instanceID ignored */
386 /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
387 /// const std::string& instanceID,
388 /// KODI_HANDLE instance,
389 /// const std::string& version,
390 /// KODI_HANDLE& addonInstance)
391 /// {
392 /// if (instanceType == ADDON_INSTANCE_SCREENSAVER)
393 /// {
394 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my Screensaver");
395 /// addonInstance = new CMyScreensaver(instance);
396 /// return ADDON_STATUS_OK;
397 /// }
398 /// else if (instanceType == ADDON_INSTANCE_VISUALIZATION)
399 /// {
400 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my Visualization");
401 /// addonInstance = new CMyVisualization(instance);
402 /// return ADDON_STATUS_OK;
403 /// }
404 /// else if (...)
405 /// {
406 /// ...
407 /// }
408 /// return ADDON_STATUS_UNKNOWN;
409 /// }
410 ///
411 /// ...
412 ///
413 /// ~~~~~~~~~~~~~
414 ///
415 virtual ADDON_STATUS CreateInstance(int instanceType,
416 const std::string& instanceID,
417 KODI_HANDLE instance,
418 const std::string& version,
419 KODI_HANDLE& addonInstance)
420 {
421 return ADDON_STATUS_NOT_IMPLEMENTED;
422 }
423 //--------------------------------------------------------------------------
424
425 //==========================================================================
426 /// @ingroup cpp_kodi_addon_addonbase
427 /// @brief Instance destroy
428 ///
429 /// This function is optional and intended to notify addon that the instance
430 /// is terminating.
431 ///
432 /// @param[in] instanceType The requested type of required instance, see \ref ADDON_TYPE.
433 /// @param[in] instanceID An individual identification key string given by Kodi.
434 /// @param[in] addonInstance The pointer to instance class created in addon.
435 ///
436 /// @warning This call is only used to inform that the associated instance
437 /// is terminated. The deletion is carried out in the background.
438 ///
439 virtual void DestroyInstance(int instanceType,
440 const std::string& instanceID,
441 KODI_HANDLE addonInstance)
442 {
443 }
444 //--------------------------------------------------------------------------
445
446 /* Background helper for GUI render systems, e.g. Screensaver or Visualization */
447 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
448
449 /* Global variables of class */
450 static AddonGlobalInterface*
451 m_interface; // Interface function table to hold addresses on add-on and from kodi
452
453 /*private:*/ /* Needed public as long the old call functions becomes used! */
454 static inline void ADDONBASE_Destroy()
455 {
456 delete static_cast<CAddonBase*>(m_interface->addonBase);
457 m_interface->addonBase = nullptr;
458 }
459
460 static inline ADDON_STATUS ADDONBASE_GetStatus()
461 {
462 return static_cast<CAddonBase*>(m_interface->addonBase)->GetStatus();
463 }
464
465 static inline ADDON_STATUS ADDONBASE_SetSetting(const char* settingName, const void* settingValue)
466 {
467 return static_cast<CAddonBase*>(m_interface->addonBase)
468 ->SetSetting(settingName, CSettingValue(settingValue));
469 }
470
471private:
472 static inline ADDON_STATUS ADDONBASE_CreateInstance(int instanceType,
473 const char* instanceID,
474 KODI_HANDLE instance,
475 const char* version,
476 KODI_HANDLE* addonInstance,
477 KODI_HANDLE parent)
478 {
479 CAddonBase* base = static_cast<CAddonBase*>(m_interface->addonBase);
480
481 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED;
482
483 /* Check about single instance usage:
484 * 1. The kodi side instance pointer must be equal to first one
485 * 2. The addon side instance pointer must be set
486 * 3. And the requested type must be equal with used add-on class
487 */
488 if (m_interface->firstKodiInstance == instance && m_interface->globalSingleInstance &&
489 static_cast<IAddonInstance*>(m_interface->globalSingleInstance)->m_type == instanceType)
490 {
491 /* The handling here is intended for the case of the add-on only one
492 * instance and this is integrated in the add-on base class.
493 */
494 *addonInstance = m_interface->globalSingleInstance;
495 status = ADDON_STATUS_OK;
496 }
497 else
498 {
499 /* Here it should use the CreateInstance instance function to allow
500 * creation of several on one addon.
501 */
502
503 /* Check first a parent is defined about (e.g. Codec within inputstream) */
504 if (parent != nullptr)
505 status = static_cast<IAddonInstance*>(parent)->CreateInstance(
506 instanceType, instanceID, instance, version, *addonInstance);
507
508 /* if no parent call the main instance creation function to get it */
509 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
510 {
511 status = base->CreateInstance(instanceType, instanceID, instance, version, *addonInstance);
512 }
513 }
514
515 if (*addonInstance == nullptr)
516 {
517 if (status == ADDON_STATUS_OK)
518 {
519 m_interface->toKodi->addon_log_msg(m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
520 "kodi::addon::CAddonBase CreateInstance returned an "
521 "empty instance pointer, but reported OK!");
522 return ADDON_STATUS_PERMANENT_FAILURE;
523 }
524 else
525 {
526 return status;
527 }
528 }
529
530 if (static_cast<IAddonInstance*>(*addonInstance)->m_type != instanceType)
531 {
532 m_interface->toKodi->addon_log_msg(
533 m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
534 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
535 delete static_cast<IAddonInstance*>(*addonInstance);
536 *addonInstance = nullptr;
537 return ADDON_STATUS_PERMANENT_FAILURE;
538 }
539
540 // Store the used ID inside instance, to have on destroy calls by addon to identify
541 static_cast<IAddonInstance*>(*addonInstance)->m_id = instanceID;
542
543 return status;
544 }
545
546 static inline void ADDONBASE_DestroyInstance(int instanceType, KODI_HANDLE instance)
547 {
548 CAddonBase* base = static_cast<CAddonBase*>(m_interface->addonBase);
549
550 if (m_interface->globalSingleInstance == nullptr && instance != base)
551 {
552 base->DestroyInstance(instanceType, static_cast<IAddonInstance*>(instance)->m_id, instance);
553 delete static_cast<IAddonInstance*>(instance);
554 }
555 }
556};
557
558} /* namespace addon */
559
560//==============================================================================
561/// @ingroup cpp_kodi_addon
562/// @brief To get used version inside Kodi itself about asked type.
563///
564/// This thought to allow a addon a handling of newer addon versions within
565/// older Kodi until the type min version not changed.
566///
567/// @param[in] type The wanted type of @ref ADDON_TYPE to ask
568/// @return The version string about type in MAJOR.MINOR.PATCH style.
569///
570inline std::string ATTRIBUTE_HIDDEN GetKodiTypeVersion(int type)
571{
572 using namespace kodi::addon;
573
574 char* str = CAddonBase::m_interface->toKodi->get_type_version(
575 CAddonBase::m_interface->toKodi->kodiBase, type);
576 std::string ret = str;
577 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
578 return ret;
579}
580//------------------------------------------------------------------------------
581
582//==============================================================================
583///
584inline std::string ATTRIBUTE_HIDDEN GetAddonPath(const std::string& append = "")
585{
586 using namespace kodi::addon;
587
588 char* str =
589 CAddonBase::m_interface->toKodi->get_addon_path(CAddonBase::m_interface->toKodi->kodiBase);
590 std::string ret = str;
591 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
592 if (!append.empty())
593 {
594 if (append.at(0) != '\\' && append.at(0) != '/')
595#ifdef TARGET_WINDOWS
596 ret.append("\\");
597#else
598 ret.append("/");
599#endif
600 ret.append(append);
601 }
602 return ret;
603}
604//------------------------------------------------------------------------------
605
606//==============================================================================
607///
608inline std::string ATTRIBUTE_HIDDEN GetBaseUserPath(const std::string& append = "")
609{
610 using namespace kodi::addon;
611
612 char* str = CAddonBase::m_interface->toKodi->get_base_user_path(
613 CAddonBase::m_interface->toKodi->kodiBase);
614 std::string ret = str;
615 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
616 if (!append.empty())
617 {
618 if (append.at(0) != '\\' && append.at(0) != '/')
619#ifdef TARGET_WINDOWS
620 ret.append("\\");
621#else
622 ret.append("/");
623#endif
624 ret.append(append);
625 }
626 return ret;
627}
628//------------------------------------------------------------------------------
629
630//==============================================================================
631///
632inline std::string ATTRIBUTE_HIDDEN GetLibPath()
633{
634 using namespace kodi::addon;
635
636 return CAddonBase::m_interface->libBasePath;
637}
638//------------------------------------------------------------------------------
639
640//==============================================================================
641/// @ingroup cpp_kodi
642/// @brief Add a message to Kodi's log.
643///
644/// @param[in] loglevel The log level of the message.
645/// @param[in] format The format of the message to pass to Kodi.
646/// @param[in] ... Additional text to insert in format text
647///
648///
649/// @note This method uses limited buffer (16k) for the formatted output.
650/// So data, which will not fit into it, will be silently discarded.
651///
652///
653/// ----------------------------------------------------------------------------
654///
655/// **Example:**
656/// ~~~~~~~~~~~~~{.cpp}
657/// #include <kodi/General.h>
658///
659/// kodi::Log(ADDON_LOG_ERROR, "%s: There is an error occurred!", __func__);
660///
661/// ~~~~~~~~~~~~~
662///
663inline void ATTRIBUTE_HIDDEN Log(const AddonLog loglevel, const char* format, ...)
664{
665 using namespace kodi::addon;
666
667 char buffer[16384];
668 va_list args;
669 va_start(args, format);
670 vsnprintf(buffer, sizeof(buffer), format, args);
671 va_end(args);
672 CAddonBase::m_interface->toKodi->addon_log_msg(CAddonBase::m_interface->toKodi->kodiBase,
673 loglevel, buffer);
674}
675//------------------------------------------------------------------------------
676
677//##############################################################################
678/// @ingroup cpp_kodi
679/// @defgroup cpp_kodi_settings 1. Setting control
680/// @brief **Functions to handle settings access**\n
681/// This can be used to get and set the addon related values inside his
682/// settings.xml.
683///
684/// The settings style is given with installed part on e.g.
685/// <b>`$HOME/.kodi/addons/myspecial.addon/resources/settings.xml`</b>. The
686/// related edit becomes then stored inside
687/// <b>`$HOME/.kodi/userdata/addon_data/myspecial.addon/settings.xml`</b>.
688///
689/*!@{*/
690
691//==============================================================================
692/// @brief Check the given setting name is set to default value.
693///
694/// The setting name relate to names used in his <b>settings.xml</b> file.
695///
696/// @param[in] settingName The name of asked setting
697/// @return true if setting is the default
698///
699inline bool ATTRIBUTE_HIDDEN IsSettingUsingDefault(const std::string& settingName)
700{
701 using namespace kodi::addon;
702 return CAddonBase::m_interface->toKodi->is_setting_using_default(
703 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str());
704}
705//------------------------------------------------------------------------------
706
707//==============================================================================
708/// @brief Check and get a string setting value.
709///
710/// The setting name relate to names used in his <b>settings.xml</b> file.
711///
712/// @param[in] settingName The name of asked setting
713/// @param[out] settingValue The given setting value
714/// @return true if setting was successfully found and "settingValue" is set
715///
716/// @note If returns false, the "settingValue" is not changed.
717///
718///
719/// ----------------------------------------------------------------------------
720///
721/// **Example:**
722/// ~~~~~~~~~~~~~{.cpp}
723/// #include <kodi/General.h>
724///
725/// std::string value;
726/// if (!kodi::CheckSettingString("my_string_value", value))
727/// value = "my_default_if_setting_not_work";
728/// ~~~~~~~~~~~~~
729///
730inline bool ATTRIBUTE_HIDDEN CheckSettingString(const std::string& settingName,
731 std::string& settingValue)
732{
733 using namespace kodi::addon;
734
735 char* buffer = nullptr;
736 bool ret = CAddonBase::m_interface->toKodi->get_setting_string(
737 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer);
738 if (buffer)
739 {
740 if (ret)
741 settingValue = buffer;
742 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, buffer);
743 }
744 return ret;
745}
746//------------------------------------------------------------------------------
747
748//==============================================================================
749/// @brief Get string setting value.
750///
751/// The setting name relate to names used in his <b>settings.xml</b> file.
752///
753/// @param[in] settingName The name of asked setting
754/// @param[in] defaultValue [opt] Default value if not found
755/// @return The value of setting, empty if not found;
756///
757///
758/// ----------------------------------------------------------------------------
759///
760/// **Example:**
761/// ~~~~~~~~~~~~~{.cpp}
762/// #include <kodi/General.h>
763///
764/// std::string value = kodi::GetSettingString("my_string_value");
765/// ~~~~~~~~~~~~~
766///
767inline std::string ATTRIBUTE_HIDDEN GetSettingString(const std::string& settingName,
768 const std::string& defaultValue = "")
769{
770 std::string settingValue = defaultValue;
771 CheckSettingString(settingName, settingValue);
772 return settingValue;
773}
774//------------------------------------------------------------------------------
775
776//==============================================================================
777/// @brief Set string setting of addon.
778///
779/// The setting name relate to names used in his <b>settings.xml</b> file.
780///
781/// @param[in] settingName The name of setting
782/// @param[in] settingValue The setting value to write
783///
784///
785/// ----------------------------------------------------------------------------
786///
787/// **Example:**
788/// ~~~~~~~~~~~~~{.cpp}
789/// #include <kodi/General.h>
790///
791/// std::string value = "my_new_name for";
792/// kodi::SetSettingString("my_string_value", value);
793/// ~~~~~~~~~~~~~
794///
795inline void ATTRIBUTE_HIDDEN SetSettingString(const std::string& settingName,
796 const std::string& settingValue)
797{
798 using namespace kodi::addon;
799
800 CAddonBase::m_interface->toKodi->set_setting_string(CAddonBase::m_interface->toKodi->kodiBase,
801 settingName.c_str(), settingValue.c_str());
802}
803//------------------------------------------------------------------------------
804
805//==============================================================================
806/// @brief Check and get a integer setting value.
807///
808/// The setting name relate to names used in his <b>settings.xml</b> file.
809///
810/// @param[in] settingName The name of asked setting
811/// @param[out] settingValue The given setting value
812/// @return true if setting was successfully found and "settingValue" is set
813///
814/// @note If returns false, the "settingValue" is not changed.
815///
816///
817/// ----------------------------------------------------------------------------
818///
819/// **Example:**
820/// ~~~~~~~~~~~~~{.cpp}
821/// #include <kodi/General.h>
822///
823/// int value = 0;
824/// if (!kodi::CheckSettingInt("my_integer_value", value))
825/// value = 123; // My default of them
826/// ~~~~~~~~~~~~~
827///
828inline bool ATTRIBUTE_HIDDEN CheckSettingInt(const std::string& settingName, int& settingValue)
829{
830 using namespace kodi::addon;
831
832 return CAddonBase::m_interface->toKodi->get_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
833 settingName.c_str(), &settingValue);
834}
835//------------------------------------------------------------------------------
836
837//==============================================================================
838/// @brief Get integer setting value.
839///
840/// The setting name relate to names used in his <b>settings.xml</b> file.
841///
842/// @param[in] settingName The name of asked setting
843/// @param[in] defaultValue [opt] Default value if not found
844/// @return The value of setting, <b>`0`</b> or defaultValue if not found
845///
846///
847/// ----------------------------------------------------------------------------
848///
849/// **Example:**
850/// ~~~~~~~~~~~~~{.cpp}
851/// #include <kodi/General.h>
852///
853/// int value = kodi::GetSettingInt("my_integer_value");
854/// ~~~~~~~~~~~~~
855///
856inline int ATTRIBUTE_HIDDEN GetSettingInt(const std::string& settingName, int defaultValue = 0)
857{
858 int settingValue = defaultValue;
859 CheckSettingInt(settingName, settingValue);
860 return settingValue;
861}
862//------------------------------------------------------------------------------
863
864//==============================================================================
865/// @brief Set integer setting of addon.
866///
867/// The setting name relate to names used in his <b>settings.xml</b> file.
868///
869/// @param[in] settingName The name of setting
870/// @param[in] settingValue The setting value to write
871///
872///
873/// ----------------------------------------------------------------------------
874///
875/// **Example:**
876/// ~~~~~~~~~~~~~{.cpp}
877/// #include <kodi/General.h>
878///
879/// int value = 123;
880/// kodi::SetSettingInt("my_integer_value", value);
881/// ~~~~~~~~~~~~~
882///
883inline void ATTRIBUTE_HIDDEN SetSettingInt(const std::string& settingName, int settingValue)
884{
885 using namespace kodi::addon;
886
887 CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
888 settingName.c_str(), settingValue);
889}
890//------------------------------------------------------------------------------
891
892//==============================================================================
893/// @brief Check and get a boolean setting value.
894///
895/// The setting name relate to names used in his <b>settings.xml</b> file.
896///
897/// @param[in] settingName The name of asked setting
898/// @param[out] settingValue The given setting value
899/// @return true if setting was successfully found and "settingValue" is set
900///
901/// @note If returns false, the "settingValue" is not changed.
902///
903///
904/// ----------------------------------------------------------------------------
905///
906/// **Example:**
907/// ~~~~~~~~~~~~~{.cpp}
908/// #include <kodi/General.h>
909///
910/// bool value = false;
911/// if (!kodi::CheckSettingBoolean("my_boolean_value", value))
912/// value = true; // My default of them
913/// ~~~~~~~~~~~~~
914///
915inline bool ATTRIBUTE_HIDDEN CheckSettingBoolean(const std::string& settingName, bool& settingValue)
916{
917 using namespace kodi::addon;
918
919 return CAddonBase::m_interface->toKodi->get_setting_bool(
920 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
921}
922//------------------------------------------------------------------------------
923
924//==============================================================================
925/// @brief Get boolean setting value.
926///
927/// The setting name relate to names used in his <b>settings.xml</b> file.
928///
929/// @param[in] settingName The name of asked setting
930/// @param[in] defaultValue [opt] Default value if not found
931/// @return The value of setting, <b>`false`</b> or defaultValue if not found
932///
933///
934/// ----------------------------------------------------------------------------
935///
936/// **Example:**
937/// ~~~~~~~~~~~~~{.cpp}
938/// #include <kodi/General.h>
939///
940/// bool value = kodi::GetSettingBoolean("my_boolean_value");
941/// ~~~~~~~~~~~~~
942///
943inline bool ATTRIBUTE_HIDDEN GetSettingBoolean(const std::string& settingName,
944 bool defaultValue = false)
945{
946 bool settingValue = defaultValue;
947 CheckSettingBoolean(settingName, settingValue);
948 return settingValue;
949}
950//------------------------------------------------------------------------------
951
952//==============================================================================
953/// @brief Set boolean setting of addon.
954///
955/// The setting name relate to names used in his <b>settings.xml</b> file.
956///
957/// @param[in] settingName The name of setting
958/// @param[in] settingValue The setting value to write
959///
960///
961/// ----------------------------------------------------------------------------
962///
963/// **Example:**
964/// ~~~~~~~~~~~~~{.cpp}
965/// #include <kodi/General.h>
966///
967/// bool value = true;
968/// kodi::SetSettingBoolean("my_boolean_value", value);
969/// ~~~~~~~~~~~~~
970///
971inline void ATTRIBUTE_HIDDEN SetSettingBoolean(const std::string& settingName, bool settingValue)
972{
973 using namespace kodi::addon;
974
975 CAddonBase::m_interface->toKodi->set_setting_bool(CAddonBase::m_interface->toKodi->kodiBase,
976 settingName.c_str(), settingValue);
977}
978//------------------------------------------------------------------------------
979
980//==============================================================================
981/// @brief Check and get a floating point setting value.
982///
983/// The setting name relate to names used in his <b>settings.xml</b> file.
984///
985/// @param[in] settingName The name of asked setting
986/// @param[out] settingValue The given setting value
987/// @return true if setting was successfully found and "settingValue" is set
988///
989/// @note If returns false, the "settingValue" is not changed.
990///
991///
992/// ----------------------------------------------------------------------------
993///
994/// **Example:**
995/// ~~~~~~~~~~~~~{.cpp}
996/// #include <kodi/General.h>
997///
998/// float value = 0.0f;
999/// if (!kodi::CheckSettingBoolean("my_float_value", value))
1000/// value = 1.0f; // My default of them
1001/// ~~~~~~~~~~~~~
1002///
1003inline bool ATTRIBUTE_HIDDEN CheckSettingFloat(const std::string& settingName, float& settingValue)
1004{
1005 using namespace kodi::addon;
1006
1007 return CAddonBase::m_interface->toKodi->get_setting_float(
1008 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1009}
1010//------------------------------------------------------------------------------
1011
1012//==============================================================================
1013/// @brief Get floating point setting value.
1014///
1015/// The setting name relate to names used in his <b>settings.xml</b> file.
1016///
1017/// @param[in] settingName The name of asked setting
1018/// @param[in] defaultValue [opt] Default value if not found
1019/// @return The value of setting, <b>`0.0`</b> or defaultValue if not found
1020///
1021///
1022/// ----------------------------------------------------------------------------
1023///
1024/// **Example:**
1025/// ~~~~~~~~~~~~~{.cpp}
1026/// #include <kodi/General.h>
1027///
1028/// float value = kodi::GetSettingFloat("my_float_value");
1029/// ~~~~~~~~~~~~~
1030///
1031inline float ATTRIBUTE_HIDDEN GetSettingFloat(const std::string& settingName,
1032 float defaultValue = 0.0f)
1033{
1034 float settingValue = defaultValue;
1035 CheckSettingFloat(settingName, settingValue);
1036 return settingValue;
1037}
1038//------------------------------------------------------------------------------
1039
1040//==============================================================================
1041/// @brief Set floating point setting of addon.
1042///
1043/// The setting name relate to names used in his <b>settings.xml</b> file.
1044///
1045/// @param[in] settingName The name of setting
1046/// @param[in] settingValue The setting value to write
1047///
1048///
1049/// ----------------------------------------------------------------------------
1050///
1051/// **Example:**
1052/// ~~~~~~~~~~~~~{.cpp}
1053/// #include <kodi/General.h>
1054///
1055/// float value = 1.0f;
1056/// kodi::SetSettingFloat("my_float_value", value);
1057/// ~~~~~~~~~~~~~
1058///
1059inline void ATTRIBUTE_HIDDEN SetSettingFloat(const std::string& settingName, float settingValue)
1060{
1061 using namespace kodi::addon;
1062
1063 CAddonBase::m_interface->toKodi->set_setting_float(CAddonBase::m_interface->toKodi->kodiBase,
1064 settingName.c_str(), settingValue);
1065}
1066//------------------------------------------------------------------------------
1067
1068//==============================================================================
1069/// @brief Check and get a enum setting value.
1070///
1071/// The setting name relate to names used in his <b>settings.xml</b> file.
1072///
1073/// @param[in] settingName The name of asked setting
1074/// @param[out] settingValue The given setting value
1075/// @return true if setting was successfully found and "settingValue" is set
1076///
1077/// @remark The enums are used as integer inside settings.xml.
1078/// @note If returns false, the "settingValue" is not changed.
1079///
1080///
1081/// ----------------------------------------------------------------------------
1082///
1083/// **Example:**
1084/// ~~~~~~~~~~~~~{.cpp}
1085/// #include <kodi/General.h>
1086///
1087/// enum myEnumValue
1088/// {
1089/// valueA,
1090/// valueB,
1091/// valueC
1092/// };
1093///
1094/// myEnumValue value;
1095/// if (!kodi::CheckSettingEnum<myEnumValue>("my_enum_value", value))
1096/// value = valueA; // My default of them
1097/// ~~~~~~~~~~~~~
1098///
1099template<typename enumType>
1100inline bool ATTRIBUTE_HIDDEN CheckSettingEnum(const std::string& settingName,
1101 enumType& settingValue)
1102{
1103 using namespace kodi::addon;
1104
1105 int settingValueInt = static_cast<int>(settingValue);
1106 bool ret = CAddonBase::m_interface->toKodi->get_setting_int(
1107 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt);
1108 if (ret)
1109 settingValue = static_cast<enumType>(settingValueInt);
1110 return ret;
1111}
1112//------------------------------------------------------------------------------
1113
1114//==============================================================================
1115/// @brief Get enum setting value.
1116///
1117/// The setting name relate to names used in his <b>settings.xml</b> file.
1118///
1119/// @param[in] settingName The name of asked setting
1120/// @param[in] defaultValue [opt] Default value if not found
1121/// @return The value of setting, forced to <b>`0`</b> or defaultValue if not found
1122///
1123/// @remark The enums are used as integer inside settings.xml.
1124///
1125///
1126/// ----------------------------------------------------------------------------
1127///
1128/// **Example:**
1129/// ~~~~~~~~~~~~~{.cpp}
1130/// #include <kodi/General.h>
1131///
1132/// enum myEnumValue
1133/// {
1134/// valueA,
1135/// valueB,
1136/// valueC
1137/// };
1138///
1139/// myEnumValue value = kodi::GetSettingEnum<myEnumValue>("my_enum_value");
1140/// ~~~~~~~~~~~~~
1141///
1142template<typename enumType>
1143inline enumType ATTRIBUTE_HIDDEN GetSettingEnum(const std::string& settingName,
1144 enumType defaultValue = static_cast<enumType>(0))
1145{
1146 enumType settingValue = defaultValue;
1147 CheckSettingEnum(settingName, settingValue);
1148 return settingValue;
1149}
1150//------------------------------------------------------------------------------
1151
1152//==============================================================================
1153/// @brief Set enum setting of addon.
1154///
1155/// The setting name relate to names used in his <b>settings.xml</b> file.
1156///
1157/// @param[in] settingName The name of setting
1158/// @param[in] settingValue The setting value to write
1159///
1160/// @remark The enums are used as integer inside settings.xml.
1161///
1162///
1163/// ----------------------------------------------------------------------------
1164///
1165/// **Example:**
1166/// ~~~~~~~~~~~~~{.cpp}
1167/// #include <kodi/General.h>
1168///
1169/// enum myEnumValue
1170/// {
1171/// valueA,
1172/// valueB,
1173/// valueC
1174/// };
1175///
1176/// myEnumValue value = valueA;
1177/// kodi::SetSettingEnum<myEnumValue>("my_enum_value", value);
1178/// ~~~~~~~~~~~~~
1179///
1180template<typename enumType>
1181inline void ATTRIBUTE_HIDDEN SetSettingEnum(const std::string& settingName, enumType settingValue)
1182{
1183 using namespace kodi::addon;
1184
1185 CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
1186 settingName.c_str(),
1187 static_cast<int>(settingValue));
1188}
1189//------------------------------------------------------------------------------
1190
1191/*!@}*/
1192
1193//============================================================================
1194///
1195inline std::string ATTRIBUTE_HIDDEN TranslateAddonStatus(ADDON_STATUS status)
1196{
1197 switch (status)
1198 {
1199 case ADDON_STATUS_OK:
1200 return "OK";
1201 case ADDON_STATUS_LOST_CONNECTION:
1202 return "Lost Connection";
1203 case ADDON_STATUS_NEED_RESTART:
1204 return "Need Restart";
1205 case ADDON_STATUS_NEED_SETTINGS:
1206 return "Need Settings";
1207 case ADDON_STATUS_UNKNOWN:
1208 return "Unknown error";
1209 case ADDON_STATUS_PERMANENT_FAILURE:
1210 return "Permanent failure";
1211 case ADDON_STATUS_NOT_IMPLEMENTED:
1212 return "Not implemented";
1213 default:
1214 break;
1215 }
1216 return "Unknown";
1217}
1218//----------------------------------------------------------------------------
1219
1220//==============================================================================
1221/// @ingroup cpp_kodi
1222/// @brief Returns a function table to a named interface
1223///
1224/// @return pointer to struct containing interface functions
1225///
1226///
1227/// ------------------------------------------------------------------------
1228///
1229/// **Example:**
1230/// ~~~~~~~~~~~~~{.cpp}
1231/// #include <kodi/General.h>
1232/// #include <kodi/platform/foo.h>
1233/// ...
1234/// FuncTable_foo *table = kodi::GetPlatformInfo(foo_name, foo_version);
1235/// ...
1236/// ~~~~~~~~~~~~~
1237///
1238inline void* GetInterface(const std::string& name, const std::string& version)
1239{
1240 using namespace kodi::addon;
1241
1242 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
1243
1244 return toKodi->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1245}
1246//----------------------------------------------------------------------------
1247
1248} /* namespace kodi */
1249
1250/*! addon creation macro
1251 * @todo cleanup this stupid big macro
1252 * This macro includes now all for add-on's needed functions. This becomes a bigger
1253 * rework after everything is done on Kodi itself, currently is this way needed
1254 * to have compatibility with not reworked interfaces.
1255 *
1256 * Becomes really cleaned up soon :D
1257 */
1258#define ADDONCREATOR(AddonClass) \
1259 extern "C" __declspec(dllexport) ADDON_STATUS ADDON_Create( \
1260 KODI_HANDLE addonInterface, const char* /*globalApiVersion*/, void* /*unused*/) \
1261 { \
1262 kodi::addon::CAddonBase::m_interface = static_cast<AddonGlobalInterface*>(addonInterface); \
1263 kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \
1264 return static_cast<kodi::addon::CAddonBase*>(kodi::addon::CAddonBase::m_interface->addonBase) \
1265 ->Create(); \
1266 } \
1267 extern "C" __declspec(dllexport) void ADDON_Destroy() \
1268 { \
1269 kodi::addon::CAddonBase::ADDONBASE_Destroy(); \
1270 } \
1271 extern "C" __declspec(dllexport) ADDON_STATUS ADDON_GetStatus() \
1272 { \
1273 return kodi::addon::CAddonBase::ADDONBASE_GetStatus(); \
1274 } \
1275 extern "C" __declspec(dllexport) ADDON_STATUS ADDON_SetSetting(const char* settingName, \
1276 const void* settingValue) \
1277 { \
1278 return kodi::addon::CAddonBase::ADDONBASE_SetSetting(settingName, settingValue); \
1279 } \
1280 extern "C" __declspec(dllexport) const char* ADDON_GetTypeVersion(int type) \
1281 { \
1282 return kodi::addon::GetTypeVersion(type); \
1283 } \
1284 extern "C" __declspec(dllexport) const char* ADDON_GetTypeMinVersion(int type) \
1285 { \
1286 return kodi::addon::GetTypeMinVersion(type); \
1287 } \
1288 AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr;
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AudioEngine.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/AudioEngine.h
deleted file mode 100644
index 0cfefac..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AudioEngine.h
+++ /dev/null
@@ -1,618 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 "AddonBase.h"
12#include "c-api/audio_engine.h"
13
14#ifdef __cplusplus
15
16namespace kodi
17{
18namespace audioengine
19{
20
21//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
22// Main page text for audio engine group by Doxygen.
23//{{{
24
25//==============================================================================
26///
27/// @defgroup cpp_kodi_audioengine Interface - kodi::audioengine
28/// @ingroup cpp
29/// @brief **Audio engine functions**\n
30/// This interface contains auxiliary functions and classes which allow an addon
31/// to play their own individual audio stream in Kodi.
32///
33/// Using @ref cpp_kodi_audioengine_CAEStream "kodi::audioengine::CAEStream",
34/// a class can be created in this regard, about which the necessary stream data and
35/// information are given to Kodi.
36///
37/// Via @ref kodi::audioengine::GetCurrentSinkFormat(), the audio formats currently
38/// processed in Kodi can be called up beforehand in order to adapt your own stream
39/// to them.
40///
41/// However, the created stream can also differ from this because Kodi changes
42/// it to suit it.
43///
44///
45/// ------------------------------------------------------------------------
46///
47/// **Example:**
48/// ~~~~~~~~~~~~~{.cpp}
49///
50/// #include <kodi/AudioEngine.h>
51///
52/// ...
53///
54/// kodi::audioengine::AudioEngineFormat format;
55/// if (!kodi::audioengine::GetCurrentSinkFormat(format))
56/// return false;
57///
58/// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP);
59/// format.SetChannelLayout(std::vector<AudioEngineChannel>(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR));
60///
61/// unsigned int myUsedSampleRate = format.GetSampleRate();
62///
63/// ...
64///
65/// kodi::audioengine::CAEStream* stream = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_AUTOSTART);
66///
67/// ~~~~~~~~~~~~~
68///
69/// ------------------------------------------------------------------------
70///
71/// It has the header \ref AudioEngine.h "#include <kodi/AudioEngine.h>" be included
72/// to enjoy it.
73///
74//------------------------------------------------------------------------------
75
76//==============================================================================
77///
78/// @defgroup cpp_kodi_audioengine_Defs Definitions, structures and enumerators
79/// @ingroup cpp_kodi_audioengine
80/// @brief **Library definition values**\n
81/// All audio engine functions associated data structures.
82///
83//------------------------------------------------------------------------------
84
85//}}}
86
87//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
88// "C++" related audio engine definitions
89//{{{
90
91//==============================================================================
92/// @defgroup cpp_kodi_audioengine_Defs_AudioEngineFormat class AudioEngineFormat
93/// @ingroup cpp_kodi_audioengine_Defs
94/// @brief **Audio format structure**\n
95/// The audio format structure that fully defines a stream's audio
96/// information.
97///
98/// With the help of this format information, Kodi adjusts its processing
99/// accordingly.
100///
101//@{
102class ATTRIBUTE_HIDDEN AudioEngineFormat
103 : public addon::CStructHdl<AudioEngineFormat, AUDIO_ENGINE_FORMAT>
104{
105public:
106 /*! \cond PRIVATE */
107 AudioEngineFormat()
108 {
109 m_cStructure->m_dataFormat = AUDIOENGINE_FMT_INVALID;
110 m_cStructure->m_sampleRate = 0;
111 m_cStructure->m_encodedRate = 0;
112 m_cStructure->m_frames = 0;
113 m_cStructure->m_frameSize = 0;
114 m_cStructure->m_channelCount = 0;
115
116 for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch)
117 m_cStructure->m_channels[ch] = AUDIOENGINE_CH_NULL;
118 }
119 AudioEngineFormat(const AudioEngineFormat& channel) : CStructHdl(channel) {}
120 AudioEngineFormat(const AUDIO_ENGINE_FORMAT* channel) : CStructHdl(channel) {}
121 AudioEngineFormat(AUDIO_ENGINE_FORMAT* channel) : CStructHdl(channel) {}
122 /*! \endcond */
123
124 /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineFormat_Help *Value Help*
125 /// @ingroup cpp_kodi_audioengine_Defs_AudioEngineFormat
126 ///
127 /// <b>The following table contains values that can be set with @ref cpp_kodi_audioengine_Defs_AudioEngineFormat :</b>
128 /// | Name | Type | Set call | Get call
129 /// |------|------|----------|----------
130 /// | **Data format**, see @ref AudioEngineDataFormat for available types | enum | @ref AudioEngineFormat::SetDataFormat "SetDataFormat" | @ref AudioEngineFormat::GetDataFormat "GetDataFormat"
131 /// | **Sample rate** | unsigned int | @ref AudioEngineFormat::SetSampleRate "SetSampleRate" | @ref AudioEngineFormat::GetSampleRate "GetSampleRate"
132 /// | **Encoded rate** | unsigned int | @ref AudioEngineFormat::SetEncodedRate "SetEncodedRate" | @ref AudioEngineFormat::GetEncodedRate "GetEncodedRate"
133 /// | **Channel layout**, see @ref AudioEngineChannel for available types | std::vector<enum AudioEngineChannel> | @ref AudioEngineFormat::SetChannelLayout "SetChannelLayout" | @ref AudioEngineFormat::GetChannelLayout "GetChannelLayout"
134 /// | **Frames amount** | unsigned int | @ref AudioEngineFormat::SetFramesAmount "SetFramesAmount" | @ref AudioEngineFormat::GetFramesAmount "GetFramesAmount"
135 /// | **Frame size** | unsigned int | @ref AudioEngineFormat::SetFrameSize "SetFrameSize" | @ref AudioEngineFormat::GetFrameSize "GetFrameSize"
136 ///
137 /// Further is @ref AudioEngineFormat::CompareFormat "CompareFormat" included to compare this class with another.
138 ///
139
140 /// @addtogroup cpp_kodi_audioengine_Defs_AudioEngineFormat
141 /// @copydetails cpp_kodi_audioengine_Defs_AudioEngineFormat_Help
142 //@{
143
144 /// @brief The stream's data format (eg, AUDIOENGINE_FMT_S16LE)
145 void SetDataFormat(enum AudioEngineDataFormat format) { m_cStructure->m_dataFormat = format; }
146
147 /// @brief To get with @ref SetDataFormat changed values.
148 enum AudioEngineDataFormat GetDataFormat() const { return m_cStructure->m_dataFormat; }
149
150 /// @brief The stream's sample rate (eg, 48000)
151 void SetSampleRate(unsigned int rate) { m_cStructure->m_sampleRate = rate; }
152
153 /// @brief To get with @ref SetSampleRate changed values.
154 unsigned int GetSampleRate() const { return m_cStructure->m_sampleRate; }
155
156 /// @brief The encoded streams sample rate if a bitstream, otherwise undefined
157 void SetEncodedRate(unsigned int rate) { m_cStructure->m_encodedRate = rate; }
158
159 /// @brief To get with @ref SetEncodedRate changed values.
160 unsigned int GetEncodedRate() const { return m_cStructure->m_encodedRate; }
161
162 /// @brief The stream's channel layout
163 void SetChannelLayout(const std::vector<enum AudioEngineChannel>& layout)
164 {
165 // Reset first all to empty values to AUDIOENGINE_CH_NULL, in case given list is empty
166 m_cStructure->m_channelCount = 0;
167 for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch)
168 m_cStructure->m_channels[ch] = AUDIOENGINE_CH_NULL;
169
170 for (size_t ch = 0; ch < layout.size() && ch < AUDIOENGINE_CH_MAX; ++ch)
171 {
172 m_cStructure->m_channels[ch] = layout[ch];
173 m_cStructure->m_channelCount++;
174 }
175 }
176
177 /// @brief To get with @ref SetChannelLayout changed values.
178 std::vector<enum AudioEngineChannel> GetChannelLayout() const
179 {
180 std::vector<enum AudioEngineChannel> channels;
181 for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch)
182 {
183 if (m_cStructure->m_channels[ch] == AUDIOENGINE_CH_NULL)
184 break;
185
186 channels.push_back(m_cStructure->m_channels[ch]);
187 }
188 return channels;
189 }
190
191 /// @brief The number of frames per period
192 void SetFramesAmount(unsigned int frames) { m_cStructure->m_frames = frames; }
193
194 /// @brief To get with @ref SetFramesAmount changed values.
195 unsigned int GetFramesAmount() const { return m_cStructure->m_frames; }
196
197 /// @brief The size of one frame in bytes
198 void SetFrameSize(unsigned int frameSize) { m_cStructure->m_frameSize = frameSize; }
199
200 /// @brief To get with @ref SetFrameSize changed values.
201 unsigned int GetFrameSize() const { return m_cStructure->m_frameSize; }
202
203 /// @brief Function to compare the format structure with another
204 bool CompareFormat(const AudioEngineFormat* fmt)
205 {
206 if (!fmt)
207 {
208 return false;
209 }
210
211 if (m_cStructure->m_dataFormat != fmt->m_cStructure->m_dataFormat ||
212 m_cStructure->m_sampleRate != fmt->m_cStructure->m_sampleRate ||
213 m_cStructure->m_encodedRate != fmt->m_cStructure->m_encodedRate ||
214 m_cStructure->m_frames != fmt->m_cStructure->m_frames ||
215 m_cStructure->m_frameSize != fmt->m_cStructure->m_frameSize ||
216 m_cStructure->m_channelCount != fmt->m_cStructure->m_channelCount)
217 {
218 return false;
219 }
220
221 for (unsigned int ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch)
222 {
223 if (fmt->m_cStructure->m_channels[ch] != m_cStructure->m_channels[ch])
224 {
225 return false;
226 }
227 }
228
229 return true;
230 }
231};
232//@}
233//----------------------------------------------------------------------------
234
235//}}}
236
237//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
238// "C++" AudioEngine addon interface
239//{{{
240
241//============================================================================
242///
243/// @defgroup cpp_kodi_audioengine_CAEStream class CAEStream
244/// @ingroup cpp_kodi_audioengine
245/// @brief **Audio Engine Stream Class**\n
246/// Class that can be created by the addon in order to be able to transfer
247/// audiostream data processed on the addon to Kodi and output it audibly.
248///
249/// This can create individually several times and performed in different
250/// processes simultaneously.
251///
252/// It has the header @ref AudioEngine.h "#include <kodi/AudioEngine.h>" be
253/// included to enjoy it.
254///
255//----------------------------------------------------------------------------
256class ATTRIBUTE_HIDDEN CAEStream
257{
258public:
259 //==========================================================================
260 /// @ingroup cpp_kodi_audioengine_CAEStream
261 /// @brief Contructs new class to an Kodi IAEStream in the format specified.
262 ///
263 /// @param[in] format The data format the incoming audio will be in
264 /// (e.g. \ref AUDIOENGINE_FMT_S16LE)
265 /// @param[in] options [opt] A bit field of stream options (see: enum \ref AudioEngineStreamOptions)
266 ///
267 ///
268 /// ------------------------------------------------------------------------
269 ///
270 /// @copydetails cpp_kodi_audioengine_Defs_AudioEngineFormat_Help
271 ///
272 /// ------------------------------------------------------------------------
273 ///
274 /// **Bit options to pass (on Kodi by <c>IAE::MakeStream</c>)**
275 ///
276 /// | enum AEStreamOptions | Value: | Description:
277 /// |----------------------------:|:------:|:-----------------------------------
278 /// | AUDIO_STREAM_FORCE_RESAMPLE | 1 << 0 | Force resample even if rates match
279 /// | AUDIO_STREAM_PAUSED | 1 << 1 | Create the stream paused
280 /// | AUDIO_STREAM_AUTOSTART | 1 << 2 | Autostart the stream when enough data is buffered
281 ///
282 ///
283 /// ------------------------------------------------------------------------
284 ///
285 /// **Example:**
286 /// ~~~~~~~~~~~~~{.cpp}
287 ///
288 /// #include <kodi/AudioEngine.h>
289 ///
290 /// ...
291 ///
292 /// kodi::audioengine::AudioEngineFormat format;
293 ///
294 /// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP); /* The stream's data format (eg, AUDIOENGINE_FMT_S16LE) */
295 /// format.SetChannelLayout(std::vector<AudioEngineChannel>(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR)); /* The stream's channel layout */
296 /// format.SetSampleRate(48000); /* The stream's sample rate (eg, 48000) */
297 /// format.SetFrameSize(sizeof(float)*2); /* The size of one frame in bytes */
298 /// format.SetFramesAmount(882); /* The number of samples in one frame */
299 ///
300 /// kodi::audioengine::CAEStream* stream = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_AUTOSTART);
301 ///
302 /// ~~~~~~~~~~~~~
303 ///
304 CAEStream(AudioEngineFormat& format, unsigned int options = 0)
305 : m_kodiBase(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase),
306 m_cb(::kodi::addon::CAddonBase::m_interface->toKodi->kodi_audioengine)
307 {
308 m_StreamHandle = m_cb->make_stream(m_kodiBase, format, options);
309 if (m_StreamHandle == nullptr)
310 {
311 kodi::Log(ADDON_LOG_FATAL, "CAEStream: make_stream failed!");
312 }
313 }
314 //--------------------------------------------------------------------------
315
316 //==========================================================================
317 /// @ingroup cpp_kodi_audioengine_CAEStream
318 /// @brief Class destructor.
319 ///
320 ~CAEStream()
321 {
322 if (m_StreamHandle)
323 {
324 m_cb->free_stream(m_kodiBase, m_StreamHandle);
325 m_StreamHandle = nullptr;
326 }
327 }
328 //--------------------------------------------------------------------------
329
330 //==========================================================================
331 /// @ingroup cpp_kodi_audioengine_CAEStream
332 /// @brief Returns the amount of space available in the stream.
333 ///
334 /// @return The number of bytes AddData will consume
335 ///
336 unsigned int GetSpace() { return m_cb->aestream_get_space(m_kodiBase, m_StreamHandle); }
337 //--------------------------------------------------------------------------
338
339 //==========================================================================
340 /// @ingroup cpp_kodi_audioengine_CAEStream
341 /// @brief Add planar or interleaved PCM data to the stream.
342 ///
343 /// @param[in] data array of pointers to the planes
344 /// @param[in] offset to frame in frames
345 /// @param[in] frames number of frames
346 /// @param[in] pts [opt] presentation timestamp, default is 0
347 /// @param[in] hasDownmix [opt] set true if downmix is present, default is false
348 /// @param[in] centerMixLevel [opt] level to mix left and right to center default is 1.0
349 /// @return The number of frames consumed
350 ///
351 unsigned int AddData(uint8_t* const* data,
352 unsigned int offset,
353 unsigned int frames,
354 double pts = 0,
355 bool hasDownmix = false,
356 double centerMixLevel = 1.0)
357 {
358 return m_cb->aestream_add_data(m_kodiBase, m_StreamHandle, data, offset, frames, pts,
359 hasDownmix, centerMixLevel);
360 }
361 //--------------------------------------------------------------------------
362
363 //==========================================================================
364 /// @ingroup cpp_kodi_audioengine_CAEStream
365 /// @brief Returns the time in seconds that it will take for the next added
366 /// packet to be heard from the speakers.
367 ///
368 /// @return seconds
369 ///
370 double GetDelay() { return m_cb->aestream_get_delay(m_kodiBase, m_StreamHandle); }
371 //--------------------------------------------------------------------------
372
373 //==========================================================================
374 /// @ingroup cpp_kodi_audioengine_CAEStream
375 /// @brief Returns if the stream is buffering.
376 ///
377 /// @return True if the stream is buffering
378 ///
379 bool IsBuffering() { return m_cb->aestream_is_buffering(m_kodiBase, m_StreamHandle); }
380 //--------------------------------------------------------------------------
381
382 //==========================================================================
383 /// @ingroup cpp_kodi_audioengine_CAEStream
384 /// @brief Returns the time in seconds of the stream's cached audio samples.
385 /// Engine buffers excluded.
386 ///
387 /// @return seconds
388 ///
389 double GetCacheTime() { return m_cb->aestream_get_cache_time(m_kodiBase, m_StreamHandle); }
390 //--------------------------------------------------------------------------
391
392 //==========================================================================
393 /// @ingroup cpp_kodi_audioengine_CAEStream
394 /// @brief Returns the total time in seconds of the cache.
395 ///
396 /// @return seconds
397 ///
398 double GetCacheTotal() { return m_cb->aestream_get_cache_total(m_kodiBase, m_StreamHandle); }
399 //--------------------------------------------------------------------------
400
401 //==========================================================================
402 /// @ingroup cpp_kodi_audioengine_CAEStream
403 /// @brief Pauses the stream playback.
404 ///
405 void Pause() { return m_cb->aestream_pause(m_kodiBase, m_StreamHandle); }
406 //--------------------------------------------------------------------------
407
408 //==========================================================================
409 /// @ingroup cpp_kodi_audioengine_CAEStream
410 /// @brief Resumes the stream after pausing
411 ///
412 void Resume() { return m_cb->aestream_resume(m_kodiBase, m_StreamHandle); }
413 //--------------------------------------------------------------------------
414
415 //==========================================================================
416 /// @ingroup cpp_kodi_audioengine_CAEStream
417 /// @brief Start draining the stream.
418 ///
419 /// @param[in] wait [opt] Wait until drain is finished if set to true,
420 /// otherwise it returns direct
421 ///
422 /// @note Once called AddData will not consume more data.
423 ///
424 void Drain(bool wait = true) { return m_cb->aestream_drain(m_kodiBase, m_StreamHandle, wait); }
425 //--------------------------------------------------------------------------
426
427 //==========================================================================
428 /// @ingroup cpp_kodi_audioengine_CAEStream
429 /// @brief Returns true if the is stream draining.
430 ///
431 bool IsDraining() { return m_cb->aestream_is_draining(m_kodiBase, m_StreamHandle); }
432 //--------------------------------------------------------------------------
433
434 //==========================================================================
435 /// @ingroup cpp_kodi_audioengine_CAEStream
436 /// @brief Returns true if the is stream has finished draining.
437 ///
438 bool IsDrained() { return m_cb->aestream_is_drained(m_kodiBase, m_StreamHandle); }
439 //--------------------------------------------------------------------------
440
441 //==========================================================================
442 /// @ingroup cpp_kodi_audioengine_CAEStream
443 /// @brief Flush all buffers dropping the audio data.
444 ///
445 void Flush() { return m_cb->aestream_flush(m_kodiBase, m_StreamHandle); }
446 //--------------------------------------------------------------------------
447
448 //==========================================================================
449 /// @ingroup cpp_kodi_audioengine_CAEStream
450 /// @brief Return the stream's current volume level.
451 ///
452 /// @return The volume level between 0.0 and 1.0
453 ///
454 float GetVolume() { return m_cb->aestream_get_volume(m_kodiBase, m_StreamHandle); }
455 //--------------------------------------------------------------------------
456
457 //==========================================================================
458 /// @ingroup cpp_kodi_audioengine_CAEStream
459 /// @brief Set the stream's volume level.
460 ///
461 /// @param[in] volume The new volume level between 0.0 and 1.0
462 ///
463 void SetVolume(float volume)
464 {
465 return m_cb->aestream_set_volume(m_kodiBase, m_StreamHandle, volume);
466 }
467 //--------------------------------------------------------------------------
468
469 //==========================================================================
470 /// @ingroup cpp_kodi_audioengine_CAEStream
471 /// @brief Gets the stream's volume amplification in linear units.
472 ///
473 /// @return The volume amplification factor between 1.0 and 1000.0
474 ///
475 float GetAmplification() { return m_cb->aestream_get_amplification(m_kodiBase, m_StreamHandle); }
476 //--------------------------------------------------------------------------
477
478 //==========================================================================
479 /// @ingroup cpp_kodi_audioengine_CAEStream
480 /// @brief Sets the stream's volume amplification in linear units.
481 ///
482 /// @param[in] amplify The volume amplification factor between 1.0 and 1000.0
483 ///
484 void SetAmplification(float amplify)
485 {
486 return m_cb->aestream_set_amplification(m_kodiBase, m_StreamHandle, amplify);
487 }
488 //--------------------------------------------------------------------------
489
490 //==========================================================================
491 /// @ingroup cpp_kodi_audioengine_CAEStream
492 /// @brief Returns the size of one audio frame in bytes (channelCount * resolution).
493 ///
494 /// @return The size in bytes of one frame
495 ///
496 unsigned int GetFrameSize() const
497 {
498 return m_cb->aestream_get_frame_size(m_kodiBase, m_StreamHandle);
499 }
500 //--------------------------------------------------------------------------
501
502 //==========================================================================
503 /// @ingroup cpp_kodi_audioengine_CAEStream
504 /// @brief Returns the number of channels the stream is configured to accept.
505 ///
506 /// @return The channel count
507 ///
508 unsigned int GetChannelCount() const
509 {
510 return m_cb->aestream_get_channel_count(m_kodiBase, m_StreamHandle);
511 }
512 //--------------------------------------------------------------------------
513
514 //==========================================================================
515 /// @ingroup cpp_kodi_audioengine_CAEStream
516 /// @brief Returns the stream's sample rate, if the stream is using a dynamic
517 /// sample rate, this value will NOT reflect any changes made by calls to
518 /// SetResampleRatio().
519 ///
520 /// @return The stream's sample rate (eg, 48000)
521 ///
522 unsigned int GetSampleRate() const
523 {
524 return m_cb->aestream_get_sample_rate(m_kodiBase, m_StreamHandle);
525 }
526 //--------------------------------------------------------------------------
527
528 //==========================================================================
529 /// @ingroup cpp_kodi_audioengine_CAEStream
530 /// @brief Return the data format the stream has been configured with.
531 ///
532 /// @return The stream's data format (eg, AUDIOENGINE_FMT_S16LE)
533 ///
534 AudioEngineDataFormat GetDataFormat() const
535 {
536 return m_cb->aestream_get_data_format(m_kodiBase, m_StreamHandle);
537 }
538 //--------------------------------------------------------------------------
539
540 //==========================================================================
541 /// @ingroup cpp_kodi_audioengine_CAEStream
542 /// @brief Return the resample ratio.
543 ///
544 /// @note This will return an undefined value if the stream is not resampling.
545 ///
546 /// @return the current resample ratio or undefined if the stream is not resampling
547 ///
548 double GetResampleRatio()
549 {
550 return m_cb->aestream_get_resample_ratio(m_kodiBase, m_StreamHandle);
551 }
552 //--------------------------------------------------------------------------
553
554 //==========================================================================
555 /// @ingroup cpp_kodi_audioengine_CAEStream
556 /// @brief Sets the resample ratio.
557 ///
558 /// @note This function may return false if the stream is not resampling, if
559 /// you wish to use this be sure to set the AESTREAM_FORCE_RESAMPLE option.
560 ///
561 /// @param[in] ratio the new sample rate ratio, calculated by
562 /// ((double)desiredRate / (double)GetSampleRate())
563 ///
564 void SetResampleRatio(double ratio)
565 {
566 m_cb->aestream_set_resample_ratio(m_kodiBase, m_StreamHandle, ratio);
567 }
568 //--------------------------------------------------------------------------
569
570private:
571 void* m_kodiBase;
572 AddonToKodiFuncTable_kodi_audioengine* m_cb;
573 AEStreamHandle* m_StreamHandle;
574};
575//----------------------------------------------------------------------------
576
577//============================================================================
578/// @ingroup cpp_kodi_audioengine
579/// @brief Get the current sink data format.
580///
581/// @param[in] format Current sink data format. For more details see AudioEngineFormat.
582/// @return Returns true on success, else false.
583///
584///
585/// ------------------------------------------------------------------------
586///
587/// **Example:**
588/// ~~~~~~~~~~~~~{.cpp}
589///
590/// #include <kodi/AudioEngine.h>
591///
592/// ...
593///
594/// kodi::audioengine::AudioEngineFormat format;
595/// if (!kodi::audioengine::GetCurrentSinkFormat(format))
596/// return false;
597///
598/// std::vector<AudioEngineChannel> layout = format.GetChannelLayout();
599///
600/// ...
601/// return true;
602///
603/// ~~~~~~~~~~~~~
604///
605inline bool ATTRIBUTE_HIDDEN GetCurrentSinkFormat(AudioEngineFormat& format)
606{
607 using namespace kodi::addon;
608 return CAddonBase::m_interface->toKodi->kodi_audioengine->get_current_sink_format(
609 CAddonBase::m_interface->toKodi->kodiBase, format);
610}
611//----------------------------------------------------------------------------
612
613//}}}
614
615} // namespace audioengine
616} // namespace kodi
617
618#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/CMakeLists.txt
deleted file mode 100644
index de7cb3e..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
1set(HEADERS AddonBase.h
2 AudioEngine.h
3 Filesystem.h
4 General.h
5 Network.h
6 StreamCodec.h
7 StreamCrypto.h
8 versions.h)
9
10if(CORE_SYSTEM_NAME STREQUAL android)
11 list(APPEND SOURCES platform/android/System.h)
12endif()
13
14if(NOT ENABLE_STATIC_LIBS)
15 core_add_library(addons_kodi-addon-dev-kit_include_kodi)
16endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/Filesystem.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/Filesystem.h
deleted file mode 100644
index 2054ce6..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/Filesystem.h
+++ /dev/null
@@ -1,2321 +0,0 @@
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 "AddonBase.h"
12#include "c-api/filesystem.h"
13
14#ifdef __cplusplus
15
16#include <cstring>
17#include <map>
18#include <vector>
19
20namespace kodi
21{
22namespace vfs
23{
24
25//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
26// Main page text for filesystem group by Doxygen.
27//{{{
28
29//==============================================================================
30///
31/// @defgroup cpp_kodi_vfs Interface - kodi::vfs
32/// @ingroup cpp
33/// @brief **Virtual filesystem functions**\n
34/// Offers classes and functions for access to the Virtual File Server (VFS)
35/// which you can use to manipulate files and folders.
36///
37/// This system allow the use of ["Special Protocol"](https://kodi.wiki/view/Special_protocol)
38/// where is Kodi's solution to platform dependent directories. Common directory
39/// names are assigned a <b>`special://[name]`</b> path which is passed around
40/// inside Kodi and then translated to the platform specific path before the
41/// operating system sees it. This helps keep most of the platform mess
42/// centralized in the code.\n
43/// To become a correct path back can be @ref TranslateSpecialProtocol() used.
44///
45/// It has the header @ref Filesystem.h "#include <kodi/Filesystem.h>" be
46/// included to enjoy it.
47///
48//------------------------------------------------------------------------------
49
50//==============================================================================
51/// @defgroup cpp_kodi_vfs_Defs Definitions, structures and enumerators
52/// @ingroup cpp_kodi_vfs
53/// @brief **Virtual file Server definition values**\n
54/// All to VFS system functions associated data structures.
55///
56//------------------------------------------------------------------------------
57
58//==============================================================================
59/// @defgroup cpp_kodi_vfs_Directory 1. Directory functions
60/// @ingroup cpp_kodi_vfs
61/// @brief **Globally available directories related functions**\n
62/// Used to perform typical operations with it.
63///
64//------------------------------------------------------------------------------
65
66//==============================================================================
67/// @defgroup cpp_kodi_vfs_File 2. File functions
68/// @ingroup cpp_kodi_vfs
69/// @brief **Globally available file related functions**\n
70/// Used to perform typical operations with it.
71///
72//------------------------------------------------------------------------------
73
74//==============================================================================
75/// @defgroup cpp_kodi_vfs_General 3. General functions
76/// @ingroup cpp_kodi_vfs
77/// @brief **Other globally available functions**\n
78/// Used to perform typical operations with it.
79///
80//------------------------------------------------------------------------------
81
82//}}}
83
84//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
85// "C++" related filesystem definitions
86//{{{
87
88//==============================================================================
89/// @defgroup cpp_kodi_vfs_Defs_FileStatus class FileStatus
90/// @ingroup cpp_kodi_vfs_Defs
91/// @brief **File information status**\n
92/// Used on kodi::vfs::StatFile() to get detailed information about a file.
93///
94//@{
95class ATTRIBUTE_HIDDEN FileStatus : public kodi::addon::CStructHdl<FileStatus, STAT_STRUCTURE>
96{
97public:
98 /*! \cond PRIVATE */
99 FileStatus() { memset(m_cStructure, 0, sizeof(STAT_STRUCTURE)); }
100 FileStatus(const FileStatus& channel) : CStructHdl(channel) {}
101 FileStatus(const STAT_STRUCTURE* channel) : CStructHdl(channel) {}
102 FileStatus(STAT_STRUCTURE* channel) : CStructHdl(channel) {}
103 /*! \endcond */
104
105 /// @defgroup cpp_kodi_vfs_Defs_FileStatus_Help *Value Help*
106 /// @ingroup cpp_kodi_vfs_Defs_FileStatus
107 /// ----------------------------------------------------------------------------
108 ///
109 /// <b>The following table contains values that can be set with @ref cpp_kodi_vfs_Defs_FileStatus :</b>
110 /// | Name | Type | Set call | Get call
111 /// |------|------|----------|----------
112 /// | **ID of device containing file** | `uint32_t` | @ref FileStatus::SetDeviceId "SetDeviceId" | @ref FileStatus::GetDeviceId "GetDeviceId"
113 /// | **Total size, in bytes** | `uint64_t` | @ref FileStatus::SetSize "SetSize" | @ref FileStatus::GetSize "GetSize"
114 /// | **Time of last access** | `time_t` | @ref FileStatus::SetAccessTime "SetAccessTime" | @ref FileStatus::GetAccessTime "GetAccessTime"
115 /// | **Time of last modification** | `time_t` | @ref FileStatus::SetModificationTime "SetModificationTime" | @ref FileStatus::GetModificationTime "GetModificationTime"
116 /// | **Time of last status change** | `time_t` | @ref FileStatus::SetStatusTime "SetStatusTime" | @ref FileStatus::GetStatusTime "GetStatusTime"
117 /// | **Stat url is a directory** | `bool` | @ref FileStatus::SetIsDirectory "SetIsDirectory" | @ref FileStatus::GetIsDirectory "GetIsDirectory"
118 /// | **Stat url as a symbolic link** | `bool` | @ref FileStatus::SetIsSymLink "SetIsSymLink" | @ref FileStatus::GetIsSymLink "GetIsSymLink"
119 ///
120
121 /// @addtogroup cpp_kodi_vfs_Defs_FileStatus
122 /// @copydetails cpp_kodi_vfs_Defs_FileStatus_Help
123 //@{
124
125 /// @brief Set ID of device containing file.
126 void SetDeviceId(uint32_t deviceId) { m_cStructure->deviceId = deviceId; }
127
128 /// @brief Get ID of device containing file.
129 uint32_t GetDeviceId() const { return m_cStructure->deviceId; }
130
131 /// @brief Set total size, in bytes.
132 void SetSize(uint64_t size) { m_cStructure->size = size; }
133
134 /// @brief Get total size, in bytes.
135 uint64_t GetSize() const { return m_cStructure->size; }
136
137 /// @brief Set time of last access.
138 void SetAccessTime(time_t accessTime) { m_cStructure->accessTime = accessTime; }
139
140 /// @brief Get time of last access.
141 time_t GetAccessTime() const { return m_cStructure->accessTime; }
142
143 /// @brief Set time of last modification.
144 void SetModificationTime(time_t modificationTime)
145 {
146 m_cStructure->modificationTime = modificationTime;
147 }
148
149 /// @brief Get time of last modification.
150 time_t GetModificationTime() const { return m_cStructure->modificationTime; }
151
152 /// @brief Set time of last status change.
153 void SetStatusTime(time_t statusTime) { m_cStructure->statusTime = statusTime; }
154
155 /// @brief Get time of last status change.
156 time_t GetStatusTime() const { return m_cStructure->statusTime; }
157
158 /// @brief Set the stat url is a directory.
159 void SetIsDirectory(bool isDirectory) { m_cStructure->isDirectory = isDirectory; }
160
161 /// @brief The stat url is a directory if returns true.
162 bool GetIsDirectory() const { return m_cStructure->isDirectory; }
163
164 /// @brief Set stat url as a symbolic link.
165 void SetIsSymLink(bool isSymLink) { m_cStructure->isSymLink = isSymLink; }
166
167 /// @brief Get stat url is a symbolic link.
168 bool GetIsSymLink() const { return m_cStructure->isSymLink; }
169
170 //@}
171};
172//@}
173//------------------------------------------------------------------------------
174
175//==============================================================================
176/// @defgroup cpp_kodi_vfs_Defs_CacheStatus class CacheStatus
177/// @ingroup cpp_kodi_vfs_Defs
178/// @brief **Cache information status**\n
179/// Used on kodi::vfs::CFile::IoControlGetCacheStatus() to get running cache
180/// status of proccessed stream.
181///
182//@{
183class ATTRIBUTE_HIDDEN CacheStatus
184 : public kodi::addon::CStructHdl<CacheStatus, VFS_CACHE_STATUS_DATA>
185{
186public:
187 /*! \cond PRIVATE */
188 CacheStatus() { memset(m_cStructure, 0, sizeof(VFS_CACHE_STATUS_DATA)); }
189 CacheStatus(const CacheStatus& channel) : CStructHdl(channel) {}
190 CacheStatus(const VFS_CACHE_STATUS_DATA* channel) : CStructHdl(channel) {}
191 CacheStatus(VFS_CACHE_STATUS_DATA* channel) : CStructHdl(channel) {}
192 /*! \endcond */
193
194 /// @defgroup cpp_kodi_vfs_Defs_CacheStatus_Help *Value Help*
195 /// @ingroup cpp_kodi_vfs_Defs_CacheStatus
196 /// ----------------------------------------------------------------------------
197 ///
198 /// <b>The following table contains values that can be set with @ref cpp_kodi_vfs_Defs_CacheStatus :</b>
199 /// | Name | Type | Set call | Get call
200 /// |------|------|----------|----------
201 /// | **Number of bytes cached** | `uint64_t` | @ref CacheStatus::SetForward "SetForward" | @ref CacheStatus::GetForward "GetForward"
202 /// | **Maximum number of bytes per second** | `unsigned int` | @ref CacheStatus::SetMaxRate "SetMaxRate" | @ref CacheStatus::GetMaxRate "GetMaxRate"
203 /// | **Average read rate from source file** | `unsigned int` | @ref CacheStatus::SetCurrentRate "SetCurrentRate" | @ref CacheStatus::GetCurrentRate "GetCurrentRate"
204 /// | **Cache low speed condition detected** | `bool` | @ref CacheStatus::SetLowspeed "SetLowspeed" | @ref CacheStatus::GetLowspeed "GetLowspeed"
205 ///
206
207 /// @addtogroup cpp_kodi_vfs_Defs_CacheStatus
208 /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help
209 //@{
210
211 /// @brief Set number of bytes cached forward of current position.
212 void SetForward(uint64_t forward) { m_cStructure->forward = forward; }
213
214 /// @brief Get number of bytes cached forward of current position.
215 uint64_t GetForward() { return m_cStructure->forward; }
216
217 /// @brief Set maximum number of bytes per second cache is allowed to fill.
218 void SetMaxRate(unsigned int maxrate) { m_cStructure->maxrate = maxrate; }
219
220 /// @brief Set maximum number of bytes per second cache is allowed to fill.
221 unsigned int GetMaxRate() { return m_cStructure->maxrate; }
222
223 /// @brief Set average read rate from source file since last position change.
224 void SetCurrentRate(unsigned int currate) { m_cStructure->currate = currate; }
225
226 /// @brief Get average read rate from source file since last position change.
227 unsigned int GetCurrentRate() { return m_cStructure->currate; }
228
229 /// @brief Set cache low speed condition detected.
230 void SetLowspeed(bool lowspeed) { m_cStructure->lowspeed = lowspeed; }
231
232 /// @brief Get cache low speed condition detected.
233 bool GetLowspeed() { return m_cStructure->lowspeed; }
234
235 //@}
236};
237//@}
238//------------------------------------------------------------------------------
239
240//==============================================================================
241/// @defgroup cpp_kodi_vfs_Defs_HttpHeader class HttpHeader
242/// @ingroup cpp_kodi_vfs_Defs
243/// @brief **HTTP header information**\n
244/// The class used to access HTTP header information and get his information.
245///
246/// Used on @ref kodi::vfs::GetHttpHeader().
247///
248/// ----------------------------------------------------------------------------
249///
250/// @copydetails cpp_kodi_vfs_Defs_HttpHeader_Help
251///
252///@{
253class ATTRIBUTE_HIDDEN HttpHeader
254{
255public:
256 //==========================================================================
257 /// @brief Http header parser class constructor.
258 ///
259 HttpHeader()
260 {
261 using namespace ::kodi::addon;
262
263 CAddonBase::m_interface->toKodi->kodi_filesystem->http_header_create(
264 CAddonBase::m_interface->toKodi->kodiBase, &m_handle);
265 }
266 //--------------------------------------------------------------------------
267
268 //==========================================================================
269 /// @brief Class destructor.
270 ///
271 ~HttpHeader()
272 {
273 using namespace ::kodi::addon;
274
275 CAddonBase::m_interface->toKodi->kodi_filesystem->http_header_free(
276 CAddonBase::m_interface->toKodi->kodiBase, &m_handle);
277 }
278 //--------------------------------------------------------------------------
279
280 /// @defgroup cpp_kodi_vfs_Defs_HttpHeader_Help *Value Help*
281 /// @ingroup cpp_kodi_vfs_Defs_HttpHeader
282 ///
283 /// <b>The following table contains values that can be get with @ref cpp_kodi_vfs_Defs_HttpHeader :</b>
284 /// | Description | Type | Get call
285 /// |-------------|------|------------
286 /// | **Get the value associated with this parameter of these HTTP headers** | `std::string` | @ref HttpHeader::GetValue "GetValue"
287 /// | **Get the values as list associated with this parameter of these HTTP headers** | `std::vector<std::string>` | @ref HttpHeader::GetValues "GetValues"
288 /// | **Get the full header string associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetHeader "GetHeader"
289 /// | **Get the mime type associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetMimeType "GetMimeType"
290 /// | **Get the charset associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetCharset "GetCharset"
291 /// | **The protocol line associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetProtoLine "GetProtoLine"
292 ///
293
294 /// @addtogroup cpp_kodi_vfs_Defs_HttpHeader
295 ///@{
296
297 //==========================================================================
298 /// @brief Get the value associated with this parameter of these HTTP
299 /// headers.
300 ///
301 /// @param[in] param The name of the parameter a value is required for
302 /// @return The value found
303 ///
304 std::string GetValue(const std::string& param) const
305 {
306 using namespace ::kodi::addon;
307
308 if (!m_handle.handle)
309 return "";
310
311 std::string protoLine;
312 char* string = m_handle.get_value(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle,
313 param.c_str());
314 if (string != nullptr)
315 {
316 protoLine = string;
317 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
318 string);
319 }
320 return protoLine;
321 }
322 //--------------------------------------------------------------------------
323
324 //==========================================================================
325 /// @brief Get the values as list associated with this parameter of these
326 /// HTTP headers.
327 ///
328 /// @param[in] param The name of the parameter values are required for
329 /// @return The values found
330 ///
331 std::vector<std::string> GetValues(const std::string& param) const
332 {
333 using namespace kodi::addon;
334
335 if (!m_handle.handle)
336 return std::vector<std::string>();
337
338 int numValues = 0;
339 char** res(m_handle.get_values(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle,
340 param.c_str(), &numValues));
341 if (res)
342 {
343 std::vector<std::string> vecReturn;
344 for (int i = 0; i < numValues; ++i)
345 {
346 vecReturn.emplace_back(res[i]);
347 }
348 CAddonBase::m_interface->toKodi->free_string_array(CAddonBase::m_interface->toKodi->kodiBase,
349 res, numValues);
350 return vecReturn;
351 }
352 return std::vector<std::string>();
353 }
354 //--------------------------------------------------------------------------
355
356 //==========================================================================
357 /// @brief Get the full header string associated with these HTTP headers.
358 ///
359 /// @return The header as a string
360 ///
361 std::string GetHeader() const
362 {
363 using namespace ::kodi::addon;
364
365 if (!m_handle.handle)
366 return "";
367
368 std::string header;
369 char* string = m_handle.get_header(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle);
370 if (string != nullptr)
371 {
372 header = string;
373 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
374 string);
375 }
376 return header;
377 }
378 //--------------------------------------------------------------------------
379
380 //==========================================================================
381 /// @brief Get the mime type associated with these HTTP headers.
382 ///
383 /// @return The mime type
384 ///
385 std::string GetMimeType() const
386 {
387 using namespace ::kodi::addon;
388
389 if (!m_handle.handle)
390 return "";
391
392 std::string protoLine;
393 char* string =
394 m_handle.get_mime_type(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle);
395 if (string != nullptr)
396 {
397 protoLine = string;
398 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
399 string);
400 }
401 return protoLine;
402 }
403 //--------------------------------------------------------------------------
404
405 //==========================================================================
406 /// @brief Get the charset associated with these HTTP headers.
407 ///
408 /// @return The charset
409 ///
410 std::string GetCharset() const
411 {
412 using namespace ::kodi::addon;
413
414 if (!m_handle.handle)
415 return "";
416
417 std::string protoLine;
418 char* string = m_handle.get_charset(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle);
419 if (string != nullptr)
420 {
421 protoLine = string;
422 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
423 string);
424 }
425 return protoLine;
426 }
427 //--------------------------------------------------------------------------
428
429 //==========================================================================
430 /// @brief The protocol line associated with these HTTP headers.
431 ///
432 /// @return The protocol line
433 ///
434 std::string GetProtoLine() const
435 {
436 using namespace ::kodi::addon;
437
438 if (!m_handle.handle)
439 return "";
440
441 std::string protoLine;
442 char* string =
443 m_handle.get_proto_line(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle);
444 if (string != nullptr)
445 {
446 protoLine = string;
447 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
448 string);
449 }
450 return protoLine;
451 }
452 //--------------------------------------------------------------------------
453
454 ///@}
455
456 KODI_HTTP_HEADER m_handle;
457};
458///@}
459//----------------------------------------------------------------------------
460
461//==============================================================================
462/// @defgroup cpp_kodi_vfs_CDirEntry class CDirEntry
463/// @ingroup cpp_kodi_vfs_Defs
464///
465/// @brief **Virtual file server directory entry**\n
466/// This class is used as an entry for files and folders in
467/// kodi::vfs::GetDirectory().
468///
469///
470/// ------------------------------------------------------------------------
471///
472/// **Example:**
473/// ~~~~~~~~~~~~~{.cpp}
474/// #include <kodi/Filesystem.h>
475///
476/// ...
477///
478/// std::vector<kodi::vfs::CDirEntry> items;
479/// kodi::vfs::GetDirectory("special://temp", "", items);
480///
481/// fprintf(stderr, "Directory have %lu entries\n", items.size());
482/// for (unsigned long i = 0; i < items.size(); i++)
483/// {
484/// char buff[20];
485/// time_t now = items[i].DateTime();
486/// strftime(buff, 20, "%Y-%m-%d %H:%M:%S", gmtime(&now));
487/// fprintf(stderr, " - %04lu -- Folder: %s -- Name: %s -- Path: %s -- Time: %s\n",
488/// i+1,
489/// items[i].IsFolder() ? "yes" : "no ",
490/// items[i].Label().c_str(),
491/// items[i].Path().c_str(),
492/// buff);
493/// }
494/// ~~~~~~~~~~~~~
495///
496/// It has the header @ref Filesystem.h "#include <kodi/Filesystem.h>" be included
497/// to enjoy it.
498///
499//@{
500class ATTRIBUTE_HIDDEN CDirEntry
501{
502public:
503 //============================================================================
504 /// @ingroup cpp_kodi_vfs_CDirEntry
505 /// @brief Constructor for VFS directory entry
506 ///
507 /// @param[in] label [opt] Name to use for entry
508 /// @param[in] path [opt] Used path of the entry
509 /// @param[in] folder [opt] If set entry used as folder
510 /// @param[in] size [opt] If used as file, his size defined there
511 /// @param[in] dateTime [opt] Date time of the entry
512 ///
513 CDirEntry(const std::string& label = "",
514 const std::string& path = "",
515 bool folder = false,
516 int64_t size = -1,
517 time_t dateTime = 0)
518 : m_label(label), m_path(path), m_folder(folder), m_size(size), m_dateTime(dateTime)
519 {
520 }
521 //----------------------------------------------------------------------------
522
523 //============================================================================
524 // @note Not for addon development itself needed, thats why below is
525 // disabled for doxygen!
526 //
527 // @ingroup cpp_kodi_vfs_CDirEntry
528 // @brief Constructor to create own copy
529 //
530 // @param[in] dirEntry pointer to own class type
531 //
532 explicit CDirEntry(const VFSDirEntry& dirEntry)
533 : m_label(dirEntry.label ? dirEntry.label : ""),
534 m_path(dirEntry.path ? dirEntry.path : ""),
535 m_folder(dirEntry.folder),
536 m_size(dirEntry.size),
537 m_dateTime(dirEntry.date_time)
538 {
539 }
540 //----------------------------------------------------------------------------
541
542 /// @defgroup cpp_kodi_vfs_CDirEntry_Help *Value Help*
543 /// @ingroup cpp_kodi_vfs_CDirEntry
544 /// --------------------------------------------------------------------------
545 ///
546 /// <b>The following table contains values that can be set with @ref cpp_kodi_vfs_CDirEntry :</b>
547 /// | Name | Type | Set call | Get call | Clear call |
548 /// |------|------|----------|----------|------------|
549 /// | **Directory entry name** | `std::string` | @ref CDirEntry::SetLabel "SetLabel" | @ref CDirEntry::Label "Label" | |
550 /// | **Title of entry** | `std::string` | @ref CDirEntry::SetTitle "SetTitle" | @ref CDirEntry::Title "Title" | |
551 /// | **Path of the entry** | `std::string` | @ref CDirEntry::SetPath "SetPath" | @ref CDirEntry::Path "Path" | |
552 /// | **Entry is folder** | `bool` | @ref CDirEntry::SetFolder "SetFolder" | @ref CDirEntry::IsFolder "IsFolder" | |
553 /// | **The size of the file** | `int64_t` | @ref CDirEntry::SetSize "SetSize" | @ref CDirEntry::Size "Size" | |
554 /// | **File time and date** | `time_t` | @ref CDirEntry::SetDateTime "SetDateTime" | @ref CDirEntry::DateTime "DateTime" | |
555 /// | **Property entries** | `std::string, std::string` | @ref CDirEntry::AddProperty "AddProperty" | @ref CDirEntry::GetProperties "GetProperties" | @ref CDirEntry::ClearProperties "ClearProperties"
556 ///
557
558 /// @addtogroup cpp_kodi_vfs_CDirEntry
559 /// @copydetails cpp_kodi_vfs_CDirEntry_Help
560 //@{
561
562 //============================================================================
563 /// @brief Get the directory entry name.
564 ///
565 /// @return Name of the entry
566 ///
567 const std::string& Label(void) const { return m_label; }
568 //----------------------------------------------------------------------------
569
570 //============================================================================
571 /// @brief Get the optional title of entry.
572 ///
573 /// @return Title of the entry, if exists
574 ///
575 const std::string& Title(void) const { return m_title; }
576 //----------------------------------------------------------------------------
577
578 //============================================================================
579 /// @brief Get the path of the entry.
580 ///
581 /// @return File system path of the entry
582 ///
583 const std::string& Path(void) const { return m_path; }
584 //----------------------------------------------------------------------------
585
586 //============================================================================
587 /// @brief Used to check entry is folder.
588 ///
589 /// @return true if entry is a folder
590 ///
591 bool IsFolder(void) const { return m_folder; }
592 //----------------------------------------------------------------------------
593
594 //============================================================================
595 /// @brief If file, the size of the file.
596 ///
597 /// @return Defined file size
598 ///
599 int64_t Size(void) const { return m_size; }
600 //----------------------------------------------------------------------------
601
602 //============================================================================
603 /// @brief Get file time and date for a new entry.
604 ///
605 /// @return The with time_t defined date and time of file
606 ///
607 time_t DateTime() { return m_dateTime; }
608 //----------------------------------------------------------------------------
609
610 //============================================================================
611 /// @brief Set the label name.
612 ///
613 /// @param[in] label name of entry
614 ///
615 void SetLabel(const std::string& label) { m_label = label; }
616 //----------------------------------------------------------------------------
617
618 //============================================================================
619 /// @brief Set the title name.
620 ///
621 /// @param[in] title title name of entry
622 ///
623 void SetTitle(const std::string& title) { m_title = title; }
624 //----------------------------------------------------------------------------
625
626 //============================================================================
627 /// @brief Set the path of the entry.
628 ///
629 /// @param[in] path path of entry
630 ///
631 void SetPath(const std::string& path) { m_path = path; }
632 //----------------------------------------------------------------------------
633
634 //============================================================================
635 /// @brief Set the entry defined as folder.
636 ///
637 /// @param[in] folder If true becomes entry defined as folder
638 ///
639 void SetFolder(bool folder) { m_folder = folder; }
640 //----------------------------------------------------------------------------
641
642 //============================================================================
643 /// @brief Set a file size for a new entry.
644 ///
645 /// @param[in] size Size to set for dir entry
646 ///
647 void SetSize(int64_t size) { m_size = size; }
648 //----------------------------------------------------------------------------
649
650 //============================================================================
651 /// @brief Set file time and date for a new entry.
652 ///
653 /// @param[in] dateTime The with time_t defined date and time of file
654 ///
655 void SetDateTime(time_t dateTime) { m_dateTime = dateTime; }
656 //----------------------------------------------------------------------------
657
658 //============================================================================
659 /// @brief Add a by string defined property entry to directory entry.
660 ///
661 /// @note A property can be used to add some special information about a file
662 /// or directory entry, this can be used on other places to do the right work
663 /// of them.
664 ///
665 /// @param[in] id Identification name of property
666 /// @param[in] value The property value to add by given id
667 ///
668 void AddProperty(const std::string& id, const std::string& value) { m_properties[id] = value; }
669 //----------------------------------------------------------------------------
670
671 //============================================================================
672 /// @brief Clear all present properties.
673 ///
674 void ClearProperties() { m_properties.clear(); }
675 //----------------------------------------------------------------------------
676
677 //============================================================================
678 /// @brief Get the present properties list on directory entry.
679 ///
680 /// @return map with all present properties
681 ///
682 const std::map<std::string, std::string>& GetProperties() const { return m_properties; }
683 //----------------------------------------------------------------------------
684
685 //@}
686
687private:
688 std::string m_label;
689 std::string m_title;
690 std::string m_path;
691 std::map<std::string, std::string> m_properties;
692 bool m_folder;
693 int64_t m_size;
694 time_t m_dateTime;
695};
696//@}
697//------------------------------------------------------------------------------
698
699//}}}
700
701//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
702// "C++" Directory related functions
703//{{{
704
705//==============================================================================
706/// @ingroup cpp_kodi_vfs_Directory
707/// @brief Make a directory.
708///
709/// The kodi::vfs::CreateDirectory() function shall create a
710/// new directory with name path.
711///
712/// The newly created directory shall be an empty directory.
713///
714/// @param[in] path Path to the directory.
715/// @return Upon successful completion, CreateDirectory() shall return true.
716/// Otherwise false shall be returned, no directory shall be created.
717///
718///
719/// -------------------------------------------------------------------------
720///
721/// **Example:**
722/// ~~~~~~~~~~~~~{.cpp}
723/// #include <kodi/Filesystem.h>
724/// ...
725/// std::string directory = "C:\\my_dir";
726/// bool ret = kodi::vfs::CreateDirectory(directory);
727/// fprintf(stderr, "Directory '%s' successfull created: %s\n", directory.c_str(), ret ? "yes" : "no");
728/// ...
729/// ~~~~~~~~~~~~~
730///
731inline bool ATTRIBUTE_HIDDEN CreateDirectory(const std::string& path)
732{
733 using namespace kodi::addon;
734
735 return CAddonBase::m_interface->toKodi->kodi_filesystem->create_directory(
736 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
737}
738//------------------------------------------------------------------------------
739
740//==============================================================================
741/// @ingroup cpp_kodi_vfs_Directory
742/// @brief Verifying the Existence of a Directory.
743///
744/// The kodi::vfs::DirectoryExists() method determines whether
745/// a specified folder exists.
746///
747/// @param[in] path Path to the directory.
748/// @return True when it exists, false otherwise.
749///
750///
751/// -------------------------------------------------------------------------
752///
753/// **Example:**
754/// ~~~~~~~~~~~~~{.cpp}
755/// #include <kodi/Filesystem.h>
756/// ...
757/// std::string directory = "C:\\my_dir";
758/// bool ret = kodi::vfs::DirectoryExists(directory);
759/// fprintf(stderr, "Directory '%s' present: %s\n", directory.c_str(), ret ? "yes" : "no");
760/// ...
761/// ~~~~~~~~~~~~~
762///
763inline bool ATTRIBUTE_HIDDEN DirectoryExists(const std::string& path)
764{
765 using namespace kodi::addon;
766
767 return CAddonBase::m_interface->toKodi->kodi_filesystem->directory_exists(
768 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
769}
770//------------------------------------------------------------------------------
771
772//==============================================================================
773/// @ingroup cpp_kodi_vfs_Directory
774/// @brief Removes a directory.
775///
776/// The kodi::vfs::RemoveDirectory() function shall remove a
777/// directory whose name is given by path.
778///
779/// @param[in] path Path to the directory.
780/// @return Upon successful completion, the function RemoveDirectory() shall
781/// return true. Otherwise, false shall be returned, and errno set
782/// to indicate the error. If false is returned, the named directory
783/// shall not be changed.
784///
785///
786/// -------------------------------------------------------------------------
787///
788/// **Example:**
789/// ~~~~~~~~~~~~~{.cpp}
790/// #include <kodi/Filesystem.h>
791/// ...
792/// bool ret = kodi::vfs::RemoveDirectory("C:\\my_dir");
793/// ...
794/// ~~~~~~~~~~~~~
795///
796inline bool ATTRIBUTE_HIDDEN RemoveDirectory(const std::string& path)
797{
798 using namespace kodi::addon;
799
800 return CAddonBase::m_interface->toKodi->kodi_filesystem->remove_directory(
801 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
802}
803//------------------------------------------------------------------------------
804
805//==============================================================================
806/// @ingroup cpp_kodi_vfs_Directory
807/// @brief Lists a directory.
808///
809/// Return the list of files and directories which have been found in the
810/// specified directory and which respect the given constraint.
811///
812/// It can handle the normal OS dependent paths and also the special virtual
813/// filesystem from Kodi what starts with \b special://.
814///
815/// @param[in] path The path in which the files and directories are located.
816/// @param[in] mask Mask to filter out requested files, e.g. "*.avi|*.mpg" to
817/// files with this ending.
818/// @param[out] items The returned list directory entries.
819/// @return True if listing was successful, false otherwise.
820///
821///
822/// -------------------------------------------------------------------------
823///
824/// **Example:**
825/// ~~~~~~~~~~~~~{.cpp}
826/// #include <kodi/Filesystem.h>
827///
828/// std::vector<kodi::vfs::CDirEntry> items;
829/// kodi::vfs::GetDirectory("special://temp", "", items);
830///
831/// fprintf(stderr, "Directory have %lu entries\n", items.size());
832/// for (unsigned long i = 0; i < items.size(); i++)
833/// {
834/// fprintf(stderr, " - %04lu -- Folder: %s -- Name: %s -- Path: %s\n",
835/// i+1,
836/// items[i].IsFolder() ? "yes" : "no ",
837/// items[i].Label().c_str(),
838/// items[i].Path().c_str());
839/// }
840/// ~~~~~~~~~~~~~
841inline bool ATTRIBUTE_HIDDEN GetDirectory(const std::string& path,
842 const std::string& mask,
843 std::vector<kodi::vfs::CDirEntry>& items)
844{
845 using namespace kodi::addon;
846
847 VFSDirEntry* dir_list = nullptr;
848 unsigned int num_items = 0;
849 if (CAddonBase::m_interface->toKodi->kodi_filesystem->get_directory(
850 CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), mask.c_str(), &dir_list,
851 &num_items))
852 {
853 if (dir_list)
854 {
855 for (unsigned int i = 0; i < num_items; ++i)
856 items.emplace_back(dir_list[i]);
857
858 CAddonBase::m_interface->toKodi->kodi_filesystem->free_directory(
859 CAddonBase::m_interface->toKodi->kodiBase, dir_list, num_items);
860 }
861
862 return true;
863 }
864 return false;
865}
866//------------------------------------------------------------------------------
867
868//}}}
869
870//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
871// "C++" File related functions
872//{{{
873
874//==============================================================================
875/// @ingroup cpp_kodi_vfs_File
876/// @brief Check if a file exists.
877///
878/// @param[in] filename The filename to check.
879/// @param[in] usecache Check in file cache.
880/// @return true if the file exists false otherwise.
881///
882///
883/// -------------------------------------------------------------------------
884///
885/// **Example:**
886/// ~~~~~~~~~~~~~{.cpp}
887/// #include <kodi/Filesystem.h>
888/// ...
889/// bool exists = kodi::vfs::FileExists("special://temp/kodi.log");
890/// fprintf(stderr, "Log file should be always present, is it present? %s\n", exists ? "yes" : "no");
891/// ~~~~~~~~~~~~~
892///
893inline bool ATTRIBUTE_HIDDEN FileExists(const std::string& filename, bool usecache = false)
894{
895 using namespace kodi::addon;
896
897 return CAddonBase::m_interface->toKodi->kodi_filesystem->file_exists(
898 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), usecache);
899}
900//------------------------------------------------------------------------------
901
902//==============================================================================
903/// @ingroup cpp_kodi_vfs_File
904/// @brief Get file status.
905///
906/// These function return information about a file. Execute (search)
907/// permission is required on all of the directories in path that
908/// lead to the file.
909///
910/// The call return a stat structure, which contains the on
911/// @ref cpp_kodi_vfs_Defs_FileStatus defined values.
912///
913/// @warning Not all of the OS file systems implement all of the time fields.
914///
915/// @param[in] filename The filename to read the status from.
916/// @param[out] buffer The file status is written into this buffer.
917/// @return On success, trur is returned. On error, false is returned
918///
919///
920/// @copydetails cpp_kodi_vfs_Defs_FileStatus_Help
921///
922/// -------------------------------------------------------------------------
923///
924/// **Example:**
925/// ~~~~~~~~~~~~~{.cpp}
926/// #include <kodi/Filesystem.h>
927/// ...
928/// kodi::vfs::FileStatus statFile;
929/// int ret = kodi::vfs::StatFile("special://temp/kodi.log", statFile);
930/// fprintf(stderr, "deviceId (ID of device containing file) = %u\n"
931/// "size (total size, in bytes) = %lu\n"
932/// "accessTime (time of last access) = %lu\n"
933/// "modificationTime (time of last modification) = %lu\n"
934/// "statusTime (time of last status change) = %lu\n"
935/// "isDirectory (The stat url is a directory) = %s\n"
936/// "isSymLink (The stat url is a symbolic link) = %s\n"
937/// "Return value = %i\n",
938/// statFile.GetDeviceId(),
939/// statFile.GetSize(),
940/// statFile.GetAccessTime(),
941/// statFile.GetModificationTime(),
942/// statFile.GetStatusTime(),
943/// statFile.GetIsDirectory() ? "true" : "false",
944/// statFile.GetIsSymLink() ? "true" : "false",
945/// ret);
946/// ~~~~~~~~~~~~~
947///
948inline bool ATTRIBUTE_HIDDEN StatFile(const std::string& filename, kodi::vfs::FileStatus& buffer)
949{
950 using namespace kodi::addon;
951
952 return CAddonBase::m_interface->toKodi->kodi_filesystem->stat_file(
953 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), buffer);
954}
955//------------------------------------------------------------------------------
956
957//==============================================================================
958/// @ingroup cpp_kodi_vfs_File
959/// @brief Deletes a file.
960///
961/// @param[in] filename The filename to delete.
962/// @return The file was successfully deleted.
963///
964///
965/// -------------------------------------------------------------------------
966///
967/// **Example:**
968/// ~~~~~~~~~~~~~{.cpp}
969/// #include <kodi/Filesystem.h>
970/// #include <kodi/gui/DialogFileBrowser.h>
971/// #include <kodi/gui/DialogOK.h>
972/// ...
973/// std::string filename;
974/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "",
975/// "Test File selection and delete of them!",
976/// filename))
977/// {
978/// bool successed = kodi::vfs::DeleteFile(filename);
979/// if (!successed)
980/// kodi::gui::DialogOK::ShowAndGetInput("Error", "Delete of File", filename, "failed!");
981/// else
982/// kodi::gui::DialogOK::ShowAndGetInput("Information", "Delete of File", filename, "successfull done.");
983/// }
984/// ~~~~~~~~~~~~~
985///
986inline bool ATTRIBUTE_HIDDEN DeleteFile(const std::string& filename)
987{
988 using namespace kodi::addon;
989
990 return CAddonBase::m_interface->toKodi->kodi_filesystem->delete_file(
991 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str());
992}
993//------------------------------------------------------------------------------
994
995//==============================================================================
996/// @ingroup cpp_kodi_vfs_File
997/// @brief Rename a file name.
998///
999/// @param[in] filename The filename to copy.
1000/// @param[in] newFileName The new filename
1001/// @return true if successfully renamed
1002///
1003///
1004inline bool ATTRIBUTE_HIDDEN RenameFile(const std::string& filename, const std::string& newFileName)
1005{
1006 using namespace kodi::addon;
1007
1008 return CAddonBase::m_interface->toKodi->kodi_filesystem->rename_file(
1009 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), newFileName.c_str());
1010}
1011//------------------------------------------------------------------------------
1012
1013//==============================================================================
1014/// @ingroup cpp_kodi_vfs_File
1015/// @brief Copy a file from source to destination.
1016///
1017/// @param[in] filename The filename to copy.
1018/// @param[in] destination The destination to copy file to
1019/// @return true if successfully copied
1020///
1021///
1022inline bool ATTRIBUTE_HIDDEN CopyFile(const std::string& filename, const std::string& destination)
1023{
1024 using namespace kodi::addon;
1025
1026 return CAddonBase::m_interface->toKodi->kodi_filesystem->copy_file(
1027 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), destination.c_str());
1028}
1029//------------------------------------------------------------------------------
1030
1031//}}}
1032
1033//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1034// "C++" General filesystem functions
1035//{{{
1036
1037//==============================================================================
1038/// @ingroup cpp_kodi_vfs_General
1039/// @brief Retrieve MD5sum of a file.
1040///
1041/// @param[in] path Path to the file to MD5sum
1042/// @return MD5 sum of the file
1043///
1044///
1045/// -------------------------------------------------------------------------
1046///
1047/// **Example:**
1048/// ~~~~~~~~~~~~~{.cpp}
1049/// #include <kodi/Filesystem.h>
1050/// #include <kodi/gui/DialogFileBrowser.h>
1051/// ...
1052/// std::string md5;
1053/// std::string filename;
1054/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "*.avi|*.mpg|*.mp4",
1055/// "Test File selection to get MD5",
1056/// filename))
1057/// {
1058/// md5 = kodi::vfs::GetFileMD5(filename);
1059/// fprintf(stderr, "MD5 of file '%s' is %s\n", md5.c_str(), filename.c_str());
1060/// }
1061/// ~~~~~~~~~~~~~
1062///
1063inline std::string ATTRIBUTE_HIDDEN GetFileMD5(const std::string& path)
1064{
1065 using namespace kodi::addon;
1066
1067 std::string strReturn;
1068 char* strMd5 = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_md5(
1069 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1070 if (strMd5 != nullptr)
1071 {
1072 if (std::strlen(strMd5))
1073 strReturn = strMd5;
1074 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, strMd5);
1075 }
1076 return strReturn;
1077}
1078//------------------------------------------------------------------------------
1079
1080//==============================================================================
1081/// @ingroup cpp_kodi_vfs_General
1082/// @brief Returns a thumb cache filename.
1083///
1084/// @param[in] filename Path to file
1085/// @return Cache filename
1086///
1087///
1088/// ------------------------------------------------------------------------
1089///
1090/// **Example:**
1091/// ~~~~~~~~~~~~~{.cpp}
1092/// #include <kodi/Filesystem.h>
1093/// #include <kodi/gui/DialogFileBrowser.h>
1094/// ...
1095/// std::string thumb;
1096/// std::string filename;
1097/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "*.avi|*.mpg|*.mp4",
1098/// "Test File selection to get Thumnail",
1099/// filename))
1100/// {
1101/// thumb = kodi::vfs::GetCacheThumbName(filename);
1102/// fprintf(stderr, "Thumb name of file '%s' is %s\n", thumb.c_str(), filename.c_str());
1103/// }
1104/// ~~~~~~~~~~~~~
1105///
1106inline std::string ATTRIBUTE_HIDDEN GetCacheThumbName(const std::string& filename)
1107{
1108 using namespace kodi::addon;
1109
1110 std::string strReturn;
1111 char* strThumbName = CAddonBase::m_interface->toKodi->kodi_filesystem->get_cache_thumb_name(
1112 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str());
1113 if (strThumbName != nullptr)
1114 {
1115 if (std::strlen(strThumbName))
1116 strReturn = strThumbName;
1117 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1118 strThumbName);
1119 }
1120 return strReturn;
1121}
1122//------------------------------------------------------------------------------
1123
1124//==============================================================================
1125/// @ingroup cpp_kodi_vfs_General
1126/// @brief Make filename valid.
1127///
1128/// Function to replace not valid characters with '_'. It can be also
1129/// compared with original before in a own loop until it is equal
1130/// (no invalid characters).
1131///
1132/// @param[in] filename Filename to check and fix
1133/// @return The legal filename
1134///
1135///
1136/// ------------------------------------------------------------------------
1137///
1138/// **Example:**
1139/// ~~~~~~~~~~~~~{.cpp}
1140/// #include <kodi/Filesystem.h>
1141/// ...
1142/// std::string fileName = "///\\jk???lj????.mpg";
1143/// std::string legalName = kodi::vfs::MakeLegalFileName(fileName);
1144/// fprintf(stderr, "Legal name of '%s' is '%s'\n", fileName.c_str(), legalName.c_str());
1145///
1146/// /* Returns as legal: 'jk___lj____.mpg' */
1147/// ~~~~~~~~~~~~~
1148///
1149inline std::string ATTRIBUTE_HIDDEN MakeLegalFileName(const std::string& filename)
1150{
1151 using namespace kodi::addon;
1152
1153 std::string strReturn;
1154 char* strLegalFileName = CAddonBase::m_interface->toKodi->kodi_filesystem->make_legal_filename(
1155 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str());
1156 if (strLegalFileName != nullptr)
1157 {
1158 if (std::strlen(strLegalFileName))
1159 strReturn = strLegalFileName;
1160 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1161 strLegalFileName);
1162 }
1163 return strReturn;
1164}
1165//------------------------------------------------------------------------------
1166
1167//==============================================================================
1168/// @ingroup cpp_kodi_vfs_General
1169/// @brief Make directory name valid.
1170///
1171/// Function to replace not valid characters with '_'. It can be also
1172/// compared with original before in a own loop until it is equal
1173/// (no invalid characters).
1174///
1175/// @param[in] path Directory name to check and fix
1176/// @return The legal directory name
1177///
1178///
1179/// ------------------------------------------------------------------------
1180///
1181/// **Example:**
1182/// ~~~~~~~~~~~~~{.cpp}
1183/// #include <kodi/Filesystem.h>
1184/// ...
1185/// std::string path = "///\\jk???lj????\\hgjkg";
1186/// std::string legalPath = kodi::vfs::MakeLegalPath(path);
1187/// fprintf(stderr, "Legal name of '%s' is '%s'\n", path.c_str(), legalPath.c_str());
1188///
1189/// /* Returns as legal: '/jk___lj____/hgjkg' */
1190/// ~~~~~~~~~~~~~
1191///
1192inline std::string ATTRIBUTE_HIDDEN MakeLegalPath(const std::string& path)
1193{
1194 using namespace kodi::addon;
1195
1196 std::string strReturn;
1197 char* strLegalPath = CAddonBase::m_interface->toKodi->kodi_filesystem->make_legal_path(
1198 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1199 if (strLegalPath != nullptr)
1200 {
1201 if (std::strlen(strLegalPath))
1202 strReturn = strLegalPath;
1203 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1204 strLegalPath);
1205 }
1206 return strReturn;
1207}
1208//------------------------------------------------------------------------------
1209
1210//==============================================================================
1211/// @ingroup cpp_kodi_vfs_General
1212/// @brief Returns the translated path.
1213///
1214/// @param[in] source String or unicode - Path to format
1215/// @return A human-readable string suitable for logging
1216///
1217/// @note Only useful if you are coding for both Linux and Windows. e.g.
1218/// Converts 'special://masterprofile/script_data' ->
1219/// '/home/user/.kodi/UserData/script_data' on Linux.
1220///
1221///
1222/// ------------------------------------------------------------------------
1223///
1224/// **Example:**
1225/// ~~~~~~~~~~~~~{.cpp}
1226/// #include <kodi/Filesystem.h>
1227/// ...
1228/// std::string path = kodi::vfs::TranslateSpecialProtocol("special://masterprofile/script_data");
1229/// fprintf(stderr, "Translated path is: %s\n", path.c_str());
1230/// ...
1231/// ~~~~~~~~~~~~~
1232/// or
1233/// ~~~~~~~~~~~~~{.cpp}
1234/// #include <kodi/Filesystem.h>
1235/// ...
1236/// fprintf(stderr, "Directory 'special://temp' is '%s'\n", kodi::vfs::TranslateSpecialProtocol("special://temp").c_str());
1237/// ...
1238/// ~~~~~~~~~~~~~
1239///
1240inline std::string ATTRIBUTE_HIDDEN TranslateSpecialProtocol(const std::string& source)
1241{
1242 using namespace kodi::addon;
1243
1244 std::string strReturn;
1245 char* protocol = CAddonBase::m_interface->toKodi->kodi_filesystem->translate_special_protocol(
1246 CAddonBase::m_interface->toKodi->kodiBase, source.c_str());
1247 if (protocol != nullptr)
1248 {
1249 if (std::strlen(protocol))
1250 strReturn = protocol;
1251 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1252 protocol);
1253 }
1254 return strReturn;
1255}
1256//------------------------------------------------------------------------------
1257
1258//==============================================================================
1259/// @ingroup cpp_kodi_vfs_General
1260/// @brief Retrieves information about the amount of space that is available on
1261/// a disk volume.
1262///
1263/// Path can be also with Kodi's special protocol.
1264///
1265/// @param[in] path Path for where to check
1266/// @param[out] capacity The total number of bytes in the file system
1267/// @param[out] free The total number of free bytes in the file system
1268/// @param[out] available The total number of free bytes available to a
1269/// non-privileged process
1270/// @return true if successfully done and set
1271///
1272/// @warning This only works with paths belonging to OS. If <b>"special://"</b>
1273/// is used, it must point to a place on your own OS.
1274///
1275///
1276/// ------------------------------------------------------------------------
1277///
1278/// **Example:**
1279/// ~~~~~~~~~~~~~{.cpp}
1280/// #include <climits> // for ULLONG_MAX
1281/// #include <kodi/Filesystem.h>
1282/// ...
1283/// std::string path = "special://temp";
1284/// uint64_t capacity = ULLONG_MAX;
1285/// uint64_t free = ULLONG_MAX;
1286/// uint64_t available = ULLONG_MAX;
1287/// kodi::vfs::GetDiskSpace(path, capacity, free, available);
1288/// fprintf(stderr, "Path '%s' sizes:\n", path.c_str());
1289/// fprintf(stderr, " - capacity: %lu MByte\n", capacity / 1024 / 1024);
1290/// fprintf(stderr, " - free: %lu MByte\n", free / 1024 / 1024);
1291/// fprintf(stderr, " - available: %lu MByte\n", available / 1024 / 1024);
1292/// ~~~~~~~~~~~~~
1293///
1294inline bool ATTRIBUTE_HIDDEN GetDiskSpace(const std::string& path,
1295 uint64_t& capacity,
1296 uint64_t& free,
1297 uint64_t& available)
1298{
1299 using namespace kodi::addon;
1300
1301 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_disk_space(
1302 CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), &capacity, &free, &available);
1303}
1304//------------------------------------------------------------------------------
1305
1306//==============================================================================
1307/// @ingroup cpp_kodi_vfs_General
1308/// @brief Return the file name from given complate path string.
1309///
1310/// @param[in] path The complete path include file and directory
1311/// @return Filename from path
1312///
1313///
1314/// ------------------------------------------------------------------------
1315///
1316/// **Example:**
1317/// ~~~~~~~~~~~~~{.cpp}
1318/// #include <kodi/Filesystem.h>
1319/// ...
1320/// std::string fileName = kodi::vfs::GetFileName("special://temp/kodi.log");
1321/// fprintf(stderr, "File name is '%s'\n", fileName.c_str());
1322/// ~~~~~~~~~~~~~
1323///
1324inline std::string ATTRIBUTE_HIDDEN GetFileName(const std::string& path)
1325{
1326 /* find the last slash */
1327 const size_t slash = path.find_last_of("/\\");
1328 return path.substr(slash + 1);
1329}
1330//------------------------------------------------------------------------------
1331
1332//==============================================================================
1333/// @ingroup cpp_kodi_vfs_General
1334/// @brief Return the directory name from given complate path string.
1335///
1336/// @param[in] path The complete path include file and directory
1337/// @return Directory name from path
1338///
1339///
1340/// ------------------------------------------------------------------------
1341///
1342/// **Example:**
1343/// ~~~~~~~~~~~~~{.cpp}
1344/// #include <kodi/Filesystem.h>
1345/// ...
1346/// std::string dirName = kodi::vfs::GetDirectoryName("special://temp/kodi.log");
1347/// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str());
1348/// ~~~~~~~~~~~~~
1349///
1350inline std::string ATTRIBUTE_HIDDEN GetDirectoryName(const std::string& path)
1351{
1352 // Will from a full filename return the directory the file resides in.
1353 // Keeps the final slash at end and possible |option=foo options.
1354
1355 size_t iPosSlash = path.find_last_of("/\\");
1356 if (iPosSlash == std::string::npos)
1357 return ""; // No slash, so no path (ignore any options)
1358
1359 size_t iPosBar = path.rfind('|');
1360 if (iPosBar == std::string::npos)
1361 return path.substr(0, iPosSlash + 1); // Only path
1362
1363 return path.substr(0, iPosSlash + 1) + path.substr(iPosBar); // Path + options
1364}
1365//------------------------------------------------------------------------------
1366
1367//==============================================================================
1368/// @ingroup cpp_kodi_vfs_General
1369/// @brief Remove the slash on given path name.
1370///
1371/// @param[in,out] path The complete path
1372///
1373///
1374/// ------------------------------------------------------------------------
1375///
1376/// **Example:**
1377/// ~~~~~~~~~~~~~{.cpp}
1378/// #include <kodi/Filesystem.h>
1379/// ...
1380/// std::string dirName = "special://temp/";
1381/// kodi::vfs::RemoveSlashAtEnd(dirName);
1382/// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str());
1383/// ~~~~~~~~~~~~~
1384///
1385inline void ATTRIBUTE_HIDDEN RemoveSlashAtEnd(std::string& path)
1386{
1387 if (!path.empty())
1388 {
1389 char last = path[path.size() - 1];
1390 if (last == '/' || last == '\\')
1391 path.erase(path.size() - 1);
1392 }
1393}
1394//------------------------------------------------------------------------------
1395
1396//==============================================================================
1397/// @ingroup cpp_kodi_vfs_General
1398/// @brief Return a size aligned to the chunk size at least as large as the
1399/// chunk size.
1400///
1401/// @param[in] chunk The chunk size
1402/// @param[in] minimum The minimum size (or maybe the minimum number of chunks?)
1403/// @return The aligned size
1404///
1405inline unsigned int ATTRIBUTE_HIDDEN GetChunkSize(unsigned int chunk, unsigned int minimum)
1406{
1407 if (chunk)
1408 return chunk * ((minimum + chunk - 1) / chunk);
1409 else
1410 return minimum;
1411}
1412//------------------------------------------------------------------------------
1413
1414//==============================================================================
1415/// @ingroup cpp_kodi_vfs_General
1416/// @brief Checks the given path contains a known internet protocol.
1417///
1418/// About following protocols are the path checked:
1419/// | Protocol | Return true condition | Protocol | Return true condition
1420/// |----------|-----------------------|----------|-----------------------
1421/// | **dav** | strictCheck = true | **rtmps** | always
1422/// | **davs** | strictCheck = true | **rtmpt** | always
1423/// | **ftp** | strictCheck = true | **rtmpte** | always
1424/// | **ftps** | strictCheck = true | **rtp** | always
1425/// | **http** | always | **rtsp** | always
1426/// | **https**| always | **sdp** | always
1427/// | **mms** | always | **sftp** | strictCheck = true
1428/// | **mmsh** | always | **stack** | always
1429/// | **mmst** | always | **tcp** | always
1430/// | **rtmp** | always | **udp** | always
1431/// | **rtmpe**| always | | |
1432///
1433/// @param[in] path To checked path/URL
1434/// @param[in] strictCheck [opt] If True the set of protocols used will be
1435/// extended to include ftp, ftps, dav, davs and sftp.
1436/// @return True if path is to a internet stream, false otherwise
1437///
1438///
1439/// ------------------------------------------------------------------------
1440///
1441/// **Example:**
1442/// ~~~~~~~~~~~~~{.cpp}
1443/// #include <kodi/Filesystem.h>
1444/// ...
1445/// // Check should return false
1446/// fprintf(stderr, "File name 1 is internet stream '%s' (should no)\n",
1447/// kodi::vfs::IsInternetStream("D:/my-file.mkv") ? "yes" : "no");
1448///
1449/// // Check should return true
1450/// fprintf(stderr, "File name 2 is internet stream '%s' (should yes)\n",
1451/// kodi::vfs::IsInternetStream("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4") ? "yes" : "no");
1452///
1453/// // Check should return false
1454/// fprintf(stderr, "File name 1 is internet stream '%s' (should no)\n",
1455/// kodi::vfs::IsInternetStream("ftp://do-somewhere.com/the-file.mkv") ? "yes" : "no", false);
1456///
1457/// // Check should return true
1458/// fprintf(stderr, "File name 1 is internet stream '%s' (should yes)\n",
1459/// kodi::vfs::IsInternetStream("ftp://do-somewhere.com/the-file.mkv") ? "yes" : "no", true);
1460/// ~~~~~~~~~~~~~
1461///
1462inline bool ATTRIBUTE_HIDDEN IsInternetStream(const std::string& path, bool strictCheck = false)
1463{
1464 using namespace kodi::addon;
1465
1466 return CAddonBase::m_interface->toKodi->kodi_filesystem->is_internet_stream(
1467 CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), strictCheck);
1468}
1469//------------------------------------------------------------------------------
1470
1471//==============================================================================
1472/// @ingroup cpp_kodi_vfs_General
1473/// @brief Checks whether the specified path refers to a local network.
1474///
1475/// In difference to @ref IsHostOnLAN() include this more deeper checks where
1476/// also handle Kodi's special protocol and stacks.
1477///
1478/// @param[in] path To checked path
1479/// @return True if path is on LAN, false otherwise
1480///
1481/// @note Check includes @ref IsHostOnLAN() too.
1482///
1483///
1484/// ------------------------------------------------------------------------
1485///
1486/// **Example:**
1487/// ~~~~~~~~~~~~~{.cpp}
1488/// #include <kodi/Filesystem.h>
1489/// ...
1490/// // Check should return true
1491/// bool lan = kodi::vfs::IsOnLAN("smb://path/to/file");
1492/// ~~~~~~~~~~~~~
1493///
1494inline bool ATTRIBUTE_HIDDEN IsOnLAN(const std::string& path)
1495{
1496 using namespace kodi::addon;
1497
1498 return CAddonBase::m_interface->toKodi->kodi_filesystem->is_on_lan(
1499 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1500}
1501//------------------------------------------------------------------------------
1502
1503//==============================================================================
1504/// @ingroup cpp_kodi_vfs_General
1505/// @brief Checks specified path for external network.
1506///
1507/// @param[in] path To checked path
1508/// @return True if path is remote, false otherwise
1509///
1510/// @note This does not apply to the local network.
1511///
1512///
1513/// ------------------------------------------------------------------------
1514///
1515/// **Example:**
1516/// ~~~~~~~~~~~~~{.cpp}
1517/// #include <kodi/Filesystem.h>
1518/// ...
1519/// // Check should return true
1520/// bool remote = kodi::vfs::IsRemote("http://path/to/file");
1521/// ~~~~~~~~~~~~~
1522///
1523inline bool ATTRIBUTE_HIDDEN IsRemote(const std::string& path)
1524{
1525 using namespace kodi::addon;
1526
1527 return CAddonBase::m_interface->toKodi->kodi_filesystem->is_remote(
1528 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1529}
1530//------------------------------------------------------------------------------
1531
1532//==============================================================================
1533/// @ingroup cpp_kodi_vfs_General
1534/// @brief Checks whether the given path refers to the own system.
1535///
1536/// @param[in] path To checked path
1537/// @return True if path is local, false otherwise
1538///
1539inline bool ATTRIBUTE_HIDDEN IsLocal(const std::string& path)
1540{
1541 using namespace kodi::addon;
1542
1543 return CAddonBase::m_interface->toKodi->kodi_filesystem->is_local(
1544 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1545}
1546//------------------------------------------------------------------------------
1547
1548//==============================================================================
1549/// @ingroup cpp_kodi_vfs_General
1550/// @brief Checks specified path is a regular URL, e.g. "someprotocol://path/to/file"
1551///
1552/// @return True if file item is URL, false otherwise
1553///
1554///
1555/// ------------------------------------------------------------------------
1556///
1557/// **Example:**
1558/// ~~~~~~~~~~~~~{.cpp}
1559/// #include <kodi/Filesystem.h>
1560/// ...
1561///
1562/// bool isURL;
1563/// // Check should return true
1564/// isURL = kodi::vfs::IsURL("someprotocol://path/to/file");
1565///
1566/// // Check should return false
1567/// isURL = kodi::vfs::IsURL("/path/to/file");
1568/// ~~~~~~~~~~~~~
1569///
1570inline bool ATTRIBUTE_HIDDEN IsURL(const std::string& path)
1571{
1572 using namespace kodi::addon;
1573
1574 return CAddonBase::m_interface->toKodi->kodi_filesystem->is_url(
1575 CAddonBase::m_interface->toKodi->kodiBase, path.c_str());
1576}
1577//--------------------------------------------------------------------------
1578
1579//============================================================================
1580/// @ingroup cpp_kodi_vfs_General
1581/// @brief To get HTTP header information.
1582///
1583/// @param[in] url URL source of the data
1584/// @param[out] header The @ref cpp_kodi_vfs_Defs_HttpHeader
1585/// @return true if successfully done, otherwise false
1586///
1587///
1588/// ------------------------------------------------------------------------
1589///
1590/// @copydetails cpp_kodi_vfs_Defs_HttpHeader_Help
1591///
1592/// ------------------------------------------------------------------------
1593///
1594/// **Example:**
1595/// ~~~~~~~~~~~~~{.cpp}
1596/// #include <kodi/Filesystem.h>
1597/// ...
1598/// kodi::vfs::HttpHeader header;
1599/// bool ret = kodi::vfs::GetHttpHeader(url, header);
1600/// ...
1601/// ~~~~~~~~~~~~~
1602///
1603inline bool ATTRIBUTE_HIDDEN GetHttpHeader(const std::string& url, HttpHeader& header)
1604{
1605 using namespace ::kodi::addon;
1606
1607 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_http_header(
1608 CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &header.m_handle);
1609}
1610//----------------------------------------------------------------------------
1611
1612//============================================================================
1613/// @ingroup cpp_kodi_vfs_General
1614/// @brief Get file mime type.
1615///
1616/// @param[in] url URL source of the data
1617/// @param[out] mimeType the mime type of the URL
1618/// @param[in] useragent to be used when retrieving the MimeType [opt]
1619/// @return true if successfully done, otherwise false
1620///
1621///
1622/// ------------------------------------------------------------------------
1623///
1624/// **Example:**
1625/// ~~~~~~~~~~~~~{.cpp}
1626/// #include <kodi/Filesystem.h>
1627/// ...
1628/// std::string mimeType;.
1629/// if (kodi::vfs::GetMimeType(url, mimeType))
1630/// fprintf(stderr, "The mime type is '%s'\n", mimeType.c_str());
1631/// ...
1632/// ~~~~~~~~~~~~~
1633///
1634inline bool ATTRIBUTE_HIDDEN GetMimeType(const std::string& url,
1635 std::string& mimeType,
1636 const std::string& useragent = "")
1637{
1638 using namespace ::kodi::addon;
1639
1640 char* cMimeType = nullptr;
1641 bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_mime_type(
1642 CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cMimeType, useragent.c_str());
1643 if (cMimeType != nullptr)
1644 {
1645 mimeType = cMimeType;
1646 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1647 cMimeType);
1648 }
1649 return ret;
1650}
1651//----------------------------------------------------------------------------
1652
1653//============================================================================
1654/// @ingroup cpp_kodi_vfs_General
1655/// @brief Get file content-type.
1656///
1657/// @param[in] url URL source of the data
1658/// @param[out] content The returned type
1659/// @param[in] useragent to be used when retrieving the MimeType [opt]
1660/// @return true if successfully done, otherwise false
1661///
1662///
1663/// ------------------------------------------------------------------------
1664///
1665/// **Example:**
1666/// ~~~~~~~~~~~~~{.cpp}
1667/// #include <kodi/Filesystem.h>
1668/// ...
1669/// std::string content;.
1670/// if (kodi::vfs::GetContentType(url, content))
1671/// fprintf(stderr, "The content type is '%s'\n", content.c_str());
1672/// ...
1673/// ~~~~~~~~~~~~~
1674///
1675inline bool ATTRIBUTE_HIDDEN GetContentType(const std::string& url,
1676 std::string& content,
1677 const std::string& useragent = "")
1678{
1679 using namespace ::kodi::addon;
1680
1681 char* cContent = nullptr;
1682 bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_content_type(
1683 CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cContent, useragent.c_str());
1684 if (cContent != nullptr)
1685 {
1686 content = cContent;
1687 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1688 cContent);
1689 }
1690 return ret;
1691}
1692//----------------------------------------------------------------------------
1693
1694//============================================================================
1695/// @ingroup cpp_kodi_vfs_General
1696/// @brief Get cookies stored by CURL in RFC 2109 format.
1697///
1698/// @param[in] url URL source of the data
1699/// @param[out] cookies The text list of available cookies
1700/// @return true if successfully done, otherwise false
1701///
1702///
1703/// ------------------------------------------------------------------------
1704///
1705/// **Example:**
1706/// ~~~~~~~~~~~~~{.cpp}
1707/// #include <kodi/Filesystem.h>
1708/// ...
1709/// std::string url = "";
1710/// std::string cookies;
1711/// bool ret = kodi::vfs::GetCookies(url, cookies);
1712/// fprintf(stderr, "Cookies from URL '%s' are '%s' (return was %s)\n",
1713/// url.c_str(), cookies.c_str(), ret ? "true" : "false");
1714/// ...
1715/// ~~~~~~~~~~~~~
1716///
1717inline bool ATTRIBUTE_HIDDEN GetCookies(const std::string& url, std::string& cookies)
1718{
1719 using namespace ::kodi::addon;
1720
1721 char* cCookies = nullptr;
1722 bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_cookies(
1723 CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cCookies);
1724 if (cCookies != nullptr)
1725 {
1726 cookies = cCookies;
1727 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
1728 cCookies);
1729 }
1730 return ret;
1731}
1732//----------------------------------------------------------------------------
1733
1734//}}}
1735
1736//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1737// "C++" CFile class
1738//{{{
1739
1740//==============================================================================
1741/// @defgroup cpp_kodi_vfs_CFile 4. class CFile
1742/// @ingroup cpp_kodi_vfs
1743///
1744/// @brief **Creatable class for virtual file server control**\n
1745/// To perform file read/write with Kodi's filesystem parts.
1746///
1747/// CFile is the class used for handling Files in Kodi. This class can be used
1748/// for creating, reading, writing and modifying files. It directly provides unbuffered, binary disk input/output services
1749///
1750/// It has the header @ref Filesystem.h "#include <kodi/Filesystem.h>" be included
1751/// to enjoy it.
1752///
1753///
1754/// ------------------------------------------------------------------------
1755///
1756/// **Example:**
1757/// ~~~~~~~~~~~~~{.cpp}
1758/// #include <kodi/Filesystem.h>
1759///
1760/// ...
1761///
1762/// /* Create the needed file handle class */
1763/// kodi::vfs::CFile myFile();
1764///
1765/// /* In this example we use the user path for the add-on */
1766/// std::string file = kodi::GetUserPath() + "/myFile.txt";
1767///
1768/// /* Now create and open the file or overwrite if present */
1769/// myFile.OpenFileForWrite(file, true);
1770///
1771/// const char* str = "I love Kodi!";
1772///
1773/// /* write string */
1774/// myFile.Write(str, sizeof(str));
1775///
1776/// /* On this way the Close() is not needed to call, becomes done from destructor */
1777///
1778/// ~~~~~~~~~~~~~
1779///
1780//@{
1781class ATTRIBUTE_HIDDEN CFile
1782{
1783public:
1784 //============================================================================
1785 /// @ingroup cpp_kodi_vfs_CFile
1786 /// @brief Construct a new, unopened file.
1787 ///
1788 CFile() = default;
1789 //----------------------------------------------------------------------------
1790
1791 //============================================================================
1792 /// @ingroup cpp_kodi_vfs_CFile
1793 /// @brief <b>`Close()`</b> is called from the destructor, so explicitly
1794 /// closing the file isn't required.
1795 ///
1796 virtual ~CFile() { Close(); }
1797 //--------------------------------------------------------------------------
1798
1799 //==========================================================================
1800 /// @ingroup cpp_kodi_vfs_CFile
1801 /// @brief Open the file with filename via Kodi's @ref cpp_kodi_vfs_CFile
1802 /// "CFile". Needs to be closed by calling Close() when done.
1803 ///
1804 /// @param[in] filename The filename to open.
1805 /// @param[in] flags [opt] The flags to pass, see @ref OpenFileFlags
1806 /// @return True on success or false on failure
1807 ///
1808 bool OpenFile(const std::string& filename, unsigned int flags = 0)
1809 {
1810 using namespace kodi::addon;
1811
1812 Close();
1813 m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file(
1814 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), flags);
1815 return m_file != nullptr;
1816 }
1817 //--------------------------------------------------------------------------
1818
1819 //==========================================================================
1820 /// @ingroup cpp_kodi_vfs_CFile
1821 /// @brief Open the file with filename via Kodi's @ref cpp_kodi_vfs_CFile
1822 /// "CFile" in write mode. Needs to be closed by calling Close() when
1823 /// done.
1824 ///
1825 /// @note Related folders becomes created if not present.
1826 ///
1827 /// @param[in] filename The filename to open.
1828 /// @param[in] overwrite True to overwrite, false otherwise.
1829 /// @return True on success or false on failure
1830 ///
1831 bool OpenFileForWrite(const std::string& filename, bool overwrite = false)
1832 {
1833 using namespace kodi::addon;
1834
1835 Close();
1836
1837 // Try to open the file. If it fails, check if we need to create the directory first
1838 // This way we avoid checking if the directory exists every time
1839 m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file_for_write(
1840 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), overwrite);
1841 if (!m_file)
1842 {
1843 std::string cacheDirectory = kodi::vfs::GetDirectoryName(filename);
1844 if (CAddonBase::m_interface->toKodi->kodi_filesystem->directory_exists(
1845 CAddonBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str()) ||
1846 CAddonBase::m_interface->toKodi->kodi_filesystem->create_directory(
1847 CAddonBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str()))
1848 m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file_for_write(
1849 CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), overwrite);
1850 }
1851 return m_file != nullptr;
1852 }
1853 //--------------------------------------------------------------------------
1854
1855 //==========================================================================
1856 /// @ingroup cpp_kodi_vfs_CFile
1857 /// @brief Check file is opened.
1858 ///
1859 /// @return True on open or false on closed or failure
1860 ///
1861 bool IsOpen() const { return m_file != nullptr; }
1862 //--------------------------------------------------------------------------
1863
1864 //==========================================================================
1865 /// @ingroup cpp_kodi_vfs_CFile
1866 /// @brief Close an open file.
1867 ///
1868 void Close()
1869 {
1870 using namespace kodi::addon;
1871
1872 if (!m_file)
1873 return;
1874 CAddonBase::m_interface->toKodi->kodi_filesystem->close_file(
1875 CAddonBase::m_interface->toKodi->kodiBase, m_file);
1876 m_file = nullptr;
1877 }
1878 //--------------------------------------------------------------------------
1879
1880 //==========================================================================
1881 /// @ingroup cpp_kodi_vfs_CFile
1882 /// @brief Create a Curl representation
1883 ///
1884 /// @param[in] url The URL of the Type.
1885 /// @return True on success or false on failure
1886 ///
1887 bool CURLCreate(const std::string& url)
1888 {
1889 using namespace kodi::addon;
1890
1891 m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->curl_create(
1892 CAddonBase::m_interface->toKodi->kodiBase, url.c_str());
1893 return m_file != nullptr;
1894 }
1895 //--------------------------------------------------------------------------
1896
1897 //==========================================================================
1898 /// @ingroup cpp_kodi_vfs_CFile
1899 /// @brief Add options to the curl file created with CURLCreate.
1900 ///
1901 /// @param[in] type Option type to set, see @ref CURLOptiontype
1902 /// @param[in] name Name of the option
1903 /// @param[in] value Value of the option
1904 /// @return True on success or false on failure
1905 ///
1906 bool CURLAddOption(CURLOptiontype type, const std::string& name, const std::string& value)
1907 {
1908 using namespace kodi::addon;
1909
1910 if (!m_file)
1911 {
1912 kodi::Log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!");
1913 return false;
1914 }
1915 return CAddonBase::m_interface->toKodi->kodi_filesystem->curl_add_option(
1916 CAddonBase::m_interface->toKodi->kodiBase, m_file, type, name.c_str(), value.c_str());
1917 }
1918 //--------------------------------------------------------------------------
1919
1920 //==========================================================================
1921 /// @ingroup cpp_kodi_vfs_CFile
1922 /// @brief Open the curl file created with CURLCreate.
1923 ///
1924 /// @param[in] flags [opt] The flags to pass, see @ref OpenFileFlags
1925 /// @return True on success or false on failure
1926 ///
1927 bool CURLOpen(unsigned int flags = 0)
1928 {
1929 using namespace kodi::addon;
1930
1931 if (!m_file)
1932 {
1933 kodi::Log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!");
1934 return false;
1935 }
1936 return CAddonBase::m_interface->toKodi->kodi_filesystem->curl_open(
1937 CAddonBase::m_interface->toKodi->kodiBase, m_file, flags);
1938 }
1939 //--------------------------------------------------------------------------
1940
1941 //==========================================================================
1942 /// @ingroup cpp_kodi_vfs_CFile
1943 /// @brief Read from an open file.
1944 ///
1945 /// @param[in] ptr The buffer to store the data in.
1946 /// @param[in] size The size of the buffer.
1947 /// @return number of successfully read bytes if any bytes were read and
1948 /// stored in buffer, zero if no bytes are available to read (end of
1949 /// file was reached) or undetectable error occur, -1 in case of any
1950 /// explicit error
1951 ///
1952 ssize_t Read(void* ptr, size_t size)
1953 {
1954 using namespace kodi::addon;
1955
1956 if (!m_file)
1957 return -1;
1958 return CAddonBase::m_interface->toKodi->kodi_filesystem->read_file(
1959 CAddonBase::m_interface->toKodi->kodiBase, m_file, ptr, size);
1960 }
1961 //--------------------------------------------------------------------------
1962
1963 //==========================================================================
1964 /// @ingroup cpp_kodi_vfs_CFile
1965 /// @brief Read a string from an open file.
1966 ///
1967 /// @param[out] line The buffer to store the data in.
1968 /// @return True when a line was read, false otherwise.
1969 ///
1970 bool ReadLine(std::string& line)
1971 {
1972 using namespace kodi::addon;
1973
1974 line.clear();
1975 if (!m_file)
1976 return false;
1977 // TODO: Read 1024 chars into buffer. If file position advanced that many
1978 // chars, we didn't hit a newline. Otherwise, if file position is 1 or 2
1979 // past the number of bytes read, we read (and skipped) a newline sequence.
1980 char buffer[1025];
1981 if (CAddonBase::m_interface->toKodi->kodi_filesystem->read_file_string(
1982 CAddonBase::m_interface->toKodi->kodiBase, m_file, buffer, sizeof(buffer)))
1983 {
1984 line = buffer;
1985 return !line.empty();
1986 }
1987 return false;
1988 }
1989 //--------------------------------------------------------------------------
1990
1991 //==========================================================================
1992 /// @ingroup cpp_kodi_vfs_CFile
1993 /// @brief Write to a file opened in write mode.
1994 ///
1995 /// @param[in] ptr Pointer to the data to write, converted to a <b>`const void*`</b>.
1996 /// @param[in] size Size of the data to write.
1997 /// @return number of successfully written bytes if any bytes were written,
1998 /// zero if no bytes were written and no detectable error occur,-1
1999 /// in case of any explicit error
2000 ///
2001 ssize_t Write(const void* ptr, size_t size)
2002 {
2003 using namespace kodi::addon;
2004
2005 if (!m_file)
2006 return -1;
2007 return CAddonBase::m_interface->toKodi->kodi_filesystem->write_file(
2008 CAddonBase::m_interface->toKodi->kodiBase, m_file, ptr, size);
2009 }
2010 //--------------------------------------------------------------------------
2011
2012 //==========================================================================
2013 /// @ingroup cpp_kodi_vfs_CFile
2014 /// @brief Flush buffered data.
2015 ///
2016 /// If the given stream was open for writing (or if it was open for updating
2017 /// and the last i/o operation was an output operation) any unwritten data
2018 /// in its output buffer is written to the file.
2019 ///
2020 /// The stream remains open after this call.
2021 ///
2022 /// When a file is closed, either because of a call to close or because the
2023 /// class is destructed, all the buffers associated with it are
2024 /// automatically flushed.
2025 ///
2026 void Flush()
2027 {
2028 using namespace kodi::addon;
2029
2030 if (!m_file)
2031 return;
2032 CAddonBase::m_interface->toKodi->kodi_filesystem->flush_file(
2033 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2034 }
2035 //--------------------------------------------------------------------------
2036
2037 //==========================================================================
2038 /// @ingroup cpp_kodi_vfs_CFile
2039 /// @brief Set the file's current position.
2040 ///
2041 /// The whence argument is optional and defaults to SEEK_SET (0)
2042 ///
2043 /// @param[in] position the position that you want to seek to
2044 /// @param[in] whence [optional] offset relative to You can set the value of
2045 /// whence to one of three things:
2046 /// | Value | int | Description |
2047 /// |:--------:|:---:|:----------------------------------------------------|
2048 /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence.
2049 /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes."
2050 /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion.
2051 ///
2052 /// @return Returns the resulting offset location as measured in bytes from
2053 /// the beginning of the file. On error, the value -1 is returned.
2054 ///
2055 int64_t Seek(int64_t position, int whence = SEEK_SET)
2056 {
2057 using namespace kodi::addon;
2058
2059 if (!m_file)
2060 return -1;
2061 return CAddonBase::m_interface->toKodi->kodi_filesystem->seek_file(
2062 CAddonBase::m_interface->toKodi->kodiBase, m_file, position, whence);
2063 }
2064 //--------------------------------------------------------------------------
2065
2066 //==========================================================================
2067 /// @ingroup cpp_kodi_vfs_CFile
2068 /// @brief Truncate a file to the requested size.
2069 ///
2070 /// @param[in] size The new max size.
2071 /// @return New size? On error, the value -1 is returned.
2072 ///
2073 int Truncate(int64_t size)
2074 {
2075 using namespace kodi::addon;
2076
2077 if (!m_file)
2078 return -1;
2079 return CAddonBase::m_interface->toKodi->kodi_filesystem->truncate_file(
2080 CAddonBase::m_interface->toKodi->kodiBase, m_file, size);
2081 }
2082 //--------------------------------------------------------------------------
2083
2084 //==========================================================================
2085 /// @ingroup cpp_kodi_vfs_CFile
2086 /// @brief The current offset in an open file.
2087 ///
2088 /// @return The requested offset. On error, the value -1 is returned.
2089 ///
2090 int64_t GetPosition() const
2091 {
2092 using namespace kodi::addon;
2093
2094 if (!m_file)
2095 return -1;
2096 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_position(
2097 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2098 }
2099 //--------------------------------------------------------------------------
2100
2101 //==========================================================================
2102 /// @ingroup cpp_kodi_vfs_CFile
2103 /// @brief Get the file size of an open file.
2104 ///
2105 /// @return The requested size. On error, the value -1 is returned.
2106 ///
2107 int64_t GetLength() const
2108 {
2109 using namespace kodi::addon;
2110
2111 if (!m_file)
2112 return -1;
2113 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_length(
2114 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2115 }
2116 //--------------------------------------------------------------------------
2117
2118 //==========================================================================
2119 /// @ingroup cpp_kodi_vfs_CFile
2120 /// @brief Checks the file access is on end position.
2121 ///
2122 /// @return If you've reached the end of the file, AtEnd() returns true.
2123 ///
2124 bool AtEnd() const
2125 {
2126 using namespace kodi::addon;
2127
2128 if (!m_file)
2129 return true;
2130 int64_t length = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_length(
2131 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2132 int64_t position = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_position(
2133 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2134 return position >= length;
2135 }
2136 //--------------------------------------------------------------------------
2137
2138 //==========================================================================
2139 /// @ingroup cpp_kodi_vfs_CFile
2140 /// @brief Get the chunk size for an open file.
2141 ///
2142 /// @return The requested size. On error, the value -1 is returned.
2143 ///
2144 int GetChunkSize() const
2145 {
2146 using namespace kodi::addon;
2147
2148 if (!m_file)
2149 return -1;
2150 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_chunk_size(
2151 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2152 }
2153 //--------------------------------------------------------------------------
2154
2155 //==========================================================================
2156 /// @ingroup cpp_kodi_vfs_CFile
2157 /// @brief To check seek possible on current stream by file.
2158 ///
2159 /// @return true if seek possible, false if not
2160 ///
2161 bool IoControlGetSeekPossible() const
2162 {
2163 using namespace kodi::addon;
2164
2165 if (!m_file)
2166 return false;
2167 return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_get_seek_possible(
2168 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2169 }
2170 //--------------------------------------------------------------------------
2171
2172 //==========================================================================
2173 /// @ingroup cpp_kodi_vfs_CFile
2174 /// @brief To check a running stream on file for state of his cache.
2175 ///
2176 /// @param[in] status Information about current cache status
2177 /// @return true if successfull done, false otherwise
2178 ///
2179 ///
2180 /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help
2181 ///
2182 bool IoControlGetCacheStatus(CacheStatus& status) const
2183 {
2184 using namespace kodi::addon;
2185
2186 if (!m_file)
2187 return false;
2188 return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_get_cache_status(
2189 CAddonBase::m_interface->toKodi->kodiBase, m_file, status);
2190 }
2191 //--------------------------------------------------------------------------
2192
2193 //==========================================================================
2194 /// @ingroup cpp_kodi_vfs_CFile
2195 /// @brief Unsigned int with speed limit for caching in bytes per second.
2196 ///
2197 /// @param[in] rate Cache rate size to use
2198 /// @return true if successfull done, false otherwise
2199 ///
2200 bool IoControlSetCacheRate(unsigned int rate)
2201 {
2202 using namespace kodi::addon;
2203
2204 if (!m_file)
2205 return false;
2206 return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_set_cache_rate(
2207 CAddonBase::m_interface->toKodi->kodiBase, m_file, rate);
2208 }
2209 //--------------------------------------------------------------------------
2210
2211 //==========================================================================
2212 /// @ingroup cpp_kodi_vfs_CFile
2213 /// @brief Enable/disable retry within the protocol handler (if supported).
2214 ///
2215 /// @param[in] retry To set the retry, true for use, false for not
2216 /// @return true if successfull done, false otherwise
2217 ///
2218 bool IoControlSetRetry(bool retry)
2219 {
2220 using namespace kodi::addon;
2221
2222 if (!m_file)
2223 return false;
2224 return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_set_retry(
2225 CAddonBase::m_interface->toKodi->kodiBase, m_file, retry);
2226 }
2227 //--------------------------------------------------------------------------
2228
2229 //==========================================================================
2230 /// @ingroup cpp_kodi_vfs_CFile
2231 /// @brief Retrieve a file property.
2232 ///
2233 /// @param[in] type The type of the file property to retrieve the value for
2234 /// @param[in] name The name of a named property value (e.g. Header)
2235 /// @return value of requested property, empty on failure / non-existance
2236 ///
2237 const std::string GetPropertyValue(FilePropertyTypes type, const std::string& name) const
2238 {
2239 using namespace kodi::addon;
2240
2241 if (!m_file)
2242 {
2243 kodi::Log(ADDON_LOG_ERROR,
2244 "kodi::vfs::CURLCreate(...) needed to call before GetPropertyValue!");
2245 return "";
2246 }
2247 std::vector<std::string> values = GetPropertyValues(type, name);
2248 if (values.empty())
2249 {
2250 return "";
2251 }
2252 return values[0];
2253 }
2254 //--------------------------------------------------------------------------
2255
2256 //==========================================================================
2257 /// @ingroup cpp_kodi_vfs_CFile
2258 /// @brief Retrieve file property values.
2259 ///
2260 /// @param[in] type The type of the file property values to retrieve the value for
2261 /// @param[in] name The name of the named property (e.g. Header)
2262 /// @return values of requested property, empty vector on failure / non-existance
2263 ///
2264 const std::vector<std::string> GetPropertyValues(FilePropertyTypes type,
2265 const std::string& name) const
2266 {
2267 using namespace kodi::addon;
2268
2269 if (!m_file)
2270 {
2271 kodi::Log(ADDON_LOG_ERROR,
2272 "kodi::vfs::CURLCreate(...) needed to call before GetPropertyValues!");
2273 return std::vector<std::string>();
2274 }
2275 int numValues = 0;
2276 char** res(CAddonBase::m_interface->toKodi->kodi_filesystem->get_property_values(
2277 CAddonBase::m_interface->toKodi->kodiBase, m_file, type, name.c_str(), &numValues));
2278 if (res)
2279 {
2280 std::vector<std::string> vecReturn;
2281 for (int i = 0; i < numValues; ++i)
2282 {
2283 vecReturn.emplace_back(res[i]);
2284 }
2285 CAddonBase::m_interface->toKodi->free_string_array(CAddonBase::m_interface->toKodi->kodiBase,
2286 res, numValues);
2287 return vecReturn;
2288 }
2289 return std::vector<std::string>();
2290 }
2291 //--------------------------------------------------------------------------
2292
2293 //==========================================================================
2294 /// @ingroup cpp_kodi_vfs_CFile
2295 /// @brief Get the current download speed of file if loaded from web.
2296 ///
2297 /// @return The current download speed.
2298 ///
2299 double GetFileDownloadSpeed() const
2300 {
2301 using namespace kodi::addon;
2302
2303 if (!m_file)
2304 return 0.0;
2305 return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_download_speed(
2306 CAddonBase::m_interface->toKodi->kodiBase, m_file);
2307 }
2308 //--------------------------------------------------------------------------
2309
2310private:
2311 void* m_file = nullptr;
2312};
2313//@}
2314//------------------------------------------------------------------------------
2315
2316//}}}
2317
2318} /* namespace vfs */
2319} /* namespace kodi */
2320
2321#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h
deleted file mode 100644
index 878eaa4..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h
+++ /dev/null
@@ -1,834 +0,0 @@
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 "AddonBase.h"
12#include "c-api/general.h"
13
14#ifdef __cplusplus
15
16//==============================================================================
17/// \ingroup cpp_kodi_Defs
18/// @brief For kodi::Version used structure
19///
20typedef struct kodi_version_t
21{
22 /// Application name, normally 'Kodi'
23 std::string compile_name;
24 /// Major code version of Kodi
25 int major;
26 /// Minor code version of Kodi
27 int minor;
28 /// The Revision contains a id and the build date, e.g. 20170706-c6b22fe217-dirty
29 std::string revision;
30 /// The version canditate e.g. alpha, beta or release
31 std::string tag;
32 /// The revision of tag before
33 std::string tag_revision;
34} kodi_version_t;
35//------------------------------------------------------------------------------
36
37namespace kodi
38{
39
40//==============================================================================
41/// \ingroup cpp_kodi
42/// @brief Returns the value of an addon property as a string
43///
44/// @param[in] id id of the property that the module needs to access
45/// | | Choices are | |
46/// |:------------:|:------------:|:------------:|
47/// | author | icon | stars |
48/// | changelog | id | summary |
49/// | description | name | type |
50/// | disclaimer | path | version |
51/// | fanart | profile | |
52///
53/// @return AddOn property as a string
54///
55///
56/// ------------------------------------------------------------------------
57///
58/// **Example:**
59/// ~~~~~~~~~~~~~{.cpp}
60/// #include <kodi/General.h>
61/// ...
62/// std::string addonName = kodi::GetAddonInfo("name");
63/// ...
64/// ~~~~~~~~~~~~~
65///
66inline std::string ATTRIBUTE_HIDDEN GetAddonInfo(const std::string& id)
67{
68 using namespace kodi::addon;
69
70 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
71
72 std::string strReturn;
73 char* strMsg = toKodi->kodi->get_addon_info(toKodi->kodiBase, id.c_str());
74 if (strMsg != nullptr)
75 {
76 if (std::strlen(strMsg))
77 strReturn = strMsg;
78 toKodi->free_string(toKodi->kodiBase, strMsg);
79 }
80 return strReturn;
81}
82//------------------------------------------------------------------------------
83
84//==============================================================================
85/// \ingroup cpp_kodi
86/// @brief Opens this Add-Ons settings dialog.
87///
88/// @return true if settings were changed and the dialog confirmed, false otherwise.
89///
90///
91/// --------------------------------------------------------------------------
92///
93/// **Example:**
94/// ~~~~~~~~~~~~~{.cpp}
95/// #include <kodi/General.h>
96/// ..
97/// kodi::OpenSettings();
98/// ..
99/// ~~~~~~~~~~~~~
100///
101inline bool ATTRIBUTE_HIDDEN OpenSettings()
102{
103 using namespace kodi::addon;
104 return CAddonBase::m_interface->toKodi->kodi->open_settings_dialog(
105 CAddonBase::m_interface->toKodi->kodiBase);
106}
107//------------------------------------------------------------------------------
108
109//==============================================================================
110/// \ingroup cpp_kodi
111/// @brief Returns an addon's localized 'unicode string'.
112///
113/// @param[in] labelId string you want to localize
114/// @param[in] defaultStr [opt] The default message, also helps to identify
115/// the code that is used <em>(default is
116/// <b><c>empty</c></b>)</em>
117/// @return The localized message, or default if the add-on
118/// helper fails to return a message
119///
120/// @note Label id's \b 30000 to \b 30999 and \b 32000 to \b 32999 are related
121/// to the add-on's own included strings from
122/// <b>./resources/language/resource.language.??_??/strings.po</b>
123/// All other strings are from Kodi core language files.
124///
125///
126/// ------------------------------------------------------------------------
127///
128/// **Example:**
129/// ~~~~~~~~~~~~~{.cpp}
130/// #include <kodi/General.h>
131/// ...
132/// std::string str = kodi::GetLocalizedString(30005, "Use me as default");
133/// ...
134/// ~~~~~~~~~~~~~
135///
136inline std::string ATTRIBUTE_HIDDEN GetLocalizedString(uint32_t labelId,
137 const std::string& defaultStr = "")
138{
139 using namespace kodi::addon;
140
141 std::string retString = defaultStr;
142 char* strMsg = CAddonBase::m_interface->toKodi->kodi->get_localized_string(
143 CAddonBase::m_interface->toKodi->kodiBase, labelId);
144 if (strMsg != nullptr)
145 {
146 if (std::strlen(strMsg))
147 retString = strMsg;
148 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, strMsg);
149 }
150 return retString;
151}
152//------------------------------------------------------------------------------
153
154//==============================================================================
155/// \ingroup cpp_kodi
156/// @brief Translate a string with an unknown encoding to UTF8.
157///
158/// @param[in] stringSrc The string to translate.
159/// @param[out] utf8StringDst The translated string.
160/// @param[in] failOnBadChar [opt] returns failed if bad character is inside <em>(default is <b><c>false</c></b>)</em>
161/// @return true if OK
162///
163///
164/// ------------------------------------------------------------------------
165///
166/// **Example:**
167/// ~~~~~~~~~~~~~{.cpp}
168/// #include <kodi/General.h>
169/// ...
170/// std::string ret;
171/// if (!kodi::UnknownToUTF8("test string", ret, true))
172/// fprintf(stderr, "Translation to UTF8 failed!\n");
173/// ...
174/// ~~~~~~~~~~~~~
175///
176inline bool ATTRIBUTE_HIDDEN UnknownToUTF8(const std::string& stringSrc,
177 std::string& utf8StringDst,
178 bool failOnBadChar = false)
179{
180 using namespace kodi::addon;
181
182 bool ret = false;
183 char* retString = CAddonBase::m_interface->toKodi->kodi->unknown_to_utf8(
184 CAddonBase::m_interface->toKodi->kodiBase, stringSrc.c_str(), &ret, failOnBadChar);
185 if (retString != nullptr)
186 {
187 if (ret)
188 utf8StringDst = retString;
189 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
190 retString);
191 }
192 return ret;
193}
194//------------------------------------------------------------------------------
195
196//==============================================================================
197/// \ingroup cpp_kodi
198/// @brief Returns the active language as a string.
199///
200/// @param[in] format Used format of the returned language string
201/// | enum code: | Description: |
202/// |----------------------:|------------------------------------------------------------|
203/// | LANG_FMT_ENGLISH_NAME | full language name in English (Default) |
204/// | LANG_FMT_ISO_639_1 | two letter code as defined in ISO 639-1 |
205/// | LANG_FMT_ISO_639_2 | three letter code as defined in ISO 639-2/T or ISO 639-2/B |
206/// @param[in] region [opt] append the region delimited by "-" of the language (setting) to the returned language string <em>(default is <b><c>false</c></b>)</em>
207/// @return active language
208///
209///
210/// ------------------------------------------------------------------------
211///
212/// **Example:**
213/// ~~~~~~~~~~~~~{.cpp}
214/// #include <kodi/General.h>
215/// ...
216/// std::string language = kodi::GetLanguage(LANG_FMT_ISO_639_1, false);
217/// ...
218/// ~~~~~~~~~~~~~
219///
220inline std::string ATTRIBUTE_HIDDEN GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME,
221 bool region = false)
222{
223 using namespace kodi::addon;
224
225 std::string language;
226 char* retString = CAddonBase::m_interface->toKodi->kodi->get_language(
227 CAddonBase::m_interface->toKodi->kodiBase, format, region);
228 if (retString != nullptr)
229 {
230 if (std::strlen(retString))
231 language = retString;
232 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
233 retString);
234 }
235 return language;
236}
237//------------------------------------------------------------------------------
238
239//==============================================================================
240/// \ingroup cpp_kodi
241/// @brief Writes the C string pointed by format in the GUI. If format includes
242/// format specifiers (subsequences beginning with %), the additional arguments
243/// following format are formatted and inserted in the resulting string replacing
244/// their respective specifiers.
245///
246/// After the format parameter, the function expects at least as many additional
247/// arguments as specified by format.
248///
249/// @param[in] type The message type.
250/// | enum code: | Description: |
251/// |---------------:|-----------------------------------|
252/// | QUEUE_INFO | Show info notification message |
253/// | QUEUE_WARNING | Show warning notification message |
254/// | QUEUE_ERROR | Show error notification message |
255/// @param[in] format The format of the message to pass to display in Kodi.
256/// C string that contains the text to be written to the stream.
257/// It can optionally contain embedded format specifiers that are
258/// replaced by the values specified in subsequent additional
259/// arguments and formatted as requested.
260/// | specifier | Output | Example
261/// |------------|----------------------------------------------------|------------
262/// | d or i | Signed decimal integer | 392
263/// | u | Unsigned decimal integer | 7235
264/// | o | Unsigned octal | 610
265/// | x | Unsigned hexadecimal integer | 7fa
266/// | X | Unsigned hexadecimal integer (uppercase) | 7FA
267/// | f | Decimal floating point, lowercase | 392.65
268/// | F | Decimal floating point, uppercase | 392.65
269/// | e | Scientific notation (mantissa/exponent), lowercase | 3.9265e+2
270/// | E | Scientific notation (mantissa/exponent), uppercase | 3.9265E+2
271/// | g | Use the shortest representation: %e or %f | 392.65
272/// | G | Use the shortest representation: %E or %F | 392.65
273/// | a | Hexadecimal floating point, lowercase | -0xc.90fep-2
274/// | A | Hexadecimal floating point, uppercase | -0XC.90FEP-2
275/// | c | Character | a
276/// | s | String of characters | sample
277/// | p | Pointer address | b8000000
278/// | % | A % followed by another % character will write a single % to the stream. | %
279///
280/// The length sub-specifier modifies the length of the data type. This is a chart
281/// showing the types used to interpret the corresponding arguments with and without
282/// length specifier (if a different type is used, the proper type promotion or
283/// conversion is performed, if allowed):
284/// | length| d i | u o x X | f F e E g G a A | c | s | p | n |
285/// |-------|---------------|-----------------------|-----------------|-------|---------|---------|-----------------|
286/// | (none)| int | unsigned int | double | int | char* | void* | int* |
287/// | hh | signed char | unsigned char | | | | | signed char* |
288/// | h | short int | unsigned short int | | | | | short int* |
289/// | l | long int | unsigned long int | | wint_t| wchar_t*| | long int* |
290/// | ll | long long int | unsigned long long int| | | | | long long int* |
291/// | j | intmax_t | uintmax_t | | | | | intmax_t* |
292/// | z | size_t | size_t | | | | | size_t* |
293/// | t | ptrdiff_t | ptrdiff_t | | | | | ptrdiff_t* |
294/// | L | | | long double | | | | |
295/// <b>Note:</b> that the c specifier takes an int (or wint_t) as argument, but performs the proper conversion to a char value
296/// (or a wchar_t) before formatting it for output.
297/// @param[in] ... (additional arguments) Depending on the format string, the function
298/// may expect a sequence of additional arguments, each containing a value
299/// to be used to replace a format specifier in the format string (or a pointer
300/// to a storage location, for n).
301/// There should be at least as many of these arguments as the number of values specified
302/// in the format specifiers. Additional arguments are ignored by the function.
303///
304///
305/// ------------------------------------------------------------------------
306///
307/// **Example:**
308/// ~~~~~~~~~~~~~{.cpp}
309/// #include <kodi/General.h>
310/// ...
311/// kodi::QueueFormattedNotification(QUEUE_WARNING, "I'm want to inform you, here with a test call to show '%s'", "this");
312/// ...
313/// ~~~~~~~~~~~~~
314///
315inline void ATTRIBUTE_HIDDEN QueueFormattedNotification(QueueMsg type, const char* format, ...)
316{
317 using namespace kodi::addon;
318
319 va_list args;
320 char buffer[16384];
321 va_start(args, format);
322 vsprintf(buffer, format, args);
323 va_end(args);
324 CAddonBase::m_interface->toKodi->kodi->queue_notification(
325 CAddonBase::m_interface->toKodi->kodiBase, type, "", buffer, "", 5000, false, 1000);
326}
327//------------------------------------------------------------------------------
328
329//==============================================================================
330/// \ingroup cpp_kodi
331/// @brief Queue a notification in the GUI.
332///
333/// @param[in] type The message type.
334/// | enum code: | Description:
335/// |----------------------:|-----------------------------------
336/// | QUEUE_INFO | Show info notification message
337/// | QUEUE_WARNING | Show warning notification message
338/// | QUEUE_ERROR | Show error notification message
339/// | QUEUE_OWN_STYLE | If used can be with imageFile the wanted image set or if leaved empty shown as info, also are the other optional values available then
340/// @param[in] header Header Name (if leaved empty becomes addon name used)
341/// @param[in] message Message to display on Kodi
342/// @param[in] imageFile [opt] The image file to show on message (to use must be type set to QUEUE_OWN_STYLE)
343/// @param[in] displayTime [opt] The time how long message is displayed <b>(default 5 sec)</b> (to use must be type set to QUEUE_OWN_STYLE)
344/// @param[in] withSound [opt] if true also warning sound becomes played <b>(default with sound)</b> (to use must be type set to QUEUE_OWN_STYLE)
345/// @param[in] messageTime [opt] how many milli seconds start show of notification <b>(default 1 sec)</b> (to use must be type set to QUEUE_OWN_STYLE)
346///
347///
348/// ------------------------------------------------------------------------
349///
350/// **Example:**
351/// ~~~~~~~~~~~~~{.cpp}
352/// #include <kodi/General.h>
353/// ...
354/// kodi::QueueNotification(QUEUE_OWN_STYLE, "I'm want to inform you", "Here with a test call", "", 3000, false, 1000);
355/// ...
356/// ~~~~~~~~~~~~~
357///
358/// **Example:**
359/// ~~~~~~~~~~~~~{.cpp}
360/// #include <kodi/General.h>
361/// ...
362/// kodi::QueueNotification(QUEUE_WARNING, "I'm want to inform you", "Here with a test call");
363/// ...
364/// ~~~~~~~~~~~~~
365///
366/// **Example:**
367/// ~~~~~~~~~~~~~{.cpp}
368/// #include <kodi/General.h>
369/// ...
370/// kodi::QueueNotification(QUEUE_OWN_STYLE, "", "Here with a test call", "./myImage.png");
371/// ...
372/// ~~~~~~~~~~~~~
373///
374inline void ATTRIBUTE_HIDDEN QueueNotification(QueueMsg type,
375 const std::string& header,
376 const std::string& message,
377 const std::string& imageFile = "",
378 unsigned int displayTime = 5000,
379 bool withSound = true,
380 unsigned int messageTime = 1000)
381{
382 using namespace kodi::addon;
383
384 CAddonBase::m_interface->toKodi->kodi->queue_notification(
385 CAddonBase::m_interface->toKodi->kodiBase, type, header.c_str(), message.c_str(),
386 imageFile.c_str(), displayTime, withSound, messageTime);
387}
388//------------------------------------------------------------------------------
389
390//============================================================================
391/// \ingroup cpp_kodi
392/// @brief Get the MD5 digest of the given text
393///
394/// @param[in] text text to compute the MD5 for
395/// @return Returned MD5 digest
396///
397///
398/// ------------------------------------------------------------------------
399///
400/// **Example:**
401/// ~~~~~~~~~~~~~{.cpp}
402/// #include <kodi/General.h>
403/// ...
404/// std::string md5 = kodi::GetMD5("Make me as md5");
405/// fprintf(stderr, "My md5 digest is: '%s'\n", md5.c_str());
406/// ...
407/// ~~~~~~~~~~~~~
408///
409inline std::string ATTRIBUTE_HIDDEN GetMD5(const std::string& text)
410{
411 using namespace kodi::addon;
412
413 char* md5ret = static_cast<char*>(malloc(40 * sizeof(char))); // md5 size normally 32 bytes
414 CAddonBase::m_interface->toKodi->kodi->get_md5(CAddonBase::m_interface->toKodi->kodiBase,
415 text.c_str(), md5ret);
416 std::string md5 = md5ret;
417 free(md5ret);
418 return md5;
419}
420//----------------------------------------------------------------------------
421
422//==============================================================================
423/// \ingroup cpp_kodi
424/// @brief To get a temporary path for the addon
425///
426/// This gives a temporary path which the addon can use individually for its things.
427///
428/// The content of this folder will be deleted when Kodi is finished!
429///
430/// @param[in] append A string to append to returned temporary path
431/// @return Individual path for the addon
432///
433inline std::string ATTRIBUTE_HIDDEN GetTempAddonPath(const std::string& append = "")
434{
435 using namespace kodi::addon;
436
437 char* str = CAddonBase::m_interface->toKodi->kodi->get_temp_path(
438 CAddonBase::m_interface->toKodi->kodiBase);
439 std::string ret = str;
440 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
441 if (!append.empty())
442 {
443 if (append.at(0) != '\\' && append.at(0) != '/')
444#ifdef TARGET_WINDOWS
445 ret.append("\\");
446#else
447 ret.append("/");
448#endif
449 ret.append(append);
450 }
451 return ret;
452}
453//------------------------------------------------------------------------------
454
455//==============================================================================
456/// \ingroup cpp_kodi
457/// @brief Returns your regions setting as a string for the specified id
458///
459/// @param[in] id id of setting to return
460/// | | Choices are | |
461/// |:------------:|:------------:|:------------:|
462/// | dateshort | time | tempunit |
463/// | datelong | meridiem | speedunit |
464///
465/// @return settings string
466///
467///
468/// ------------------------------------------------------------------------
469///
470/// **Example:**
471/// ~~~~~~~~~~~~~{.cpp}
472/// #include <kodi/General.h>
473/// ...
474/// std::string timeFormat = kodi::GetRegion("time");
475/// ...
476/// ~~~~~~~~~~~~~
477///
478inline std::string ATTRIBUTE_HIDDEN GetRegion(const std::string& id)
479{
480 using namespace kodi::addon;
481
482 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
483
484 std::string strReturn;
485 char* strMsg = toKodi->kodi->get_region(toKodi->kodiBase, id.c_str());
486 if (strMsg != nullptr)
487 {
488 if (std::strlen(strMsg))
489 strReturn = strMsg;
490 toKodi->free_string(toKodi->kodiBase, strMsg);
491 }
492 return strReturn;
493}
494//------------------------------------------------------------------------------
495
496//==============================================================================
497/// \ingroup cpp_kodi
498/// @brief Returns the amount of free memory in MByte (or as bytes) as an long
499/// integer
500///
501/// @param[out] free free memory
502/// @param[out] total total memory
503/// @param[in] asBytes [opt] if set to true becomes returned as bytes, otherwise
504/// as mega bytes
505///
506///
507/// ------------------------------------------------------------------------
508///
509/// **Example:**
510/// ~~~~~~~~~~~~~{.cpp}
511/// #include <kodi/General.h>
512/// ...
513/// long freeMem;
514/// long totalMem;
515/// kodi::GetFreeMem(freeMem, totalMem);
516/// ...
517/// ~~~~~~~~~~~~~
518///
519inline void ATTRIBUTE_HIDDEN GetFreeMem(long& free, long& total, bool asBytes = false)
520{
521 using namespace kodi::addon;
522
523 free = -1;
524 total = -1;
525 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
526 toKodi->kodi->get_free_mem(toKodi->kodiBase, &free, &total, asBytes);
527}
528//------------------------------------------------------------------------------
529
530//==============================================================================
531/// \ingroup cpp_kodi
532/// @brief Returns the elapsed idle time in seconds as an integer
533///
534/// @return idle time
535///
536///
537/// ------------------------------------------------------------------------
538///
539/// **Example:**
540/// ~~~~~~~~~~~~~{.cpp}
541/// #include <kodi/General.h>
542/// ...
543/// int time = kodi::GetGlobalIdleTime();
544/// ...
545/// ~~~~~~~~~~~~~
546///
547inline int ATTRIBUTE_HIDDEN GetGlobalIdleTime()
548{
549 using namespace kodi::addon;
550
551 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
552 return toKodi->kodi->get_global_idle_time(toKodi->kodiBase);
553}
554//------------------------------------------------------------------------------
555
556//==============================================================================
557/// \ingroup cpp_kodi
558/// @brief Get the currently used skin identification name from Kodi
559///
560/// @return The active skin id name as a string
561///
562///
563/// @note This is not the full path like 'special://home/addons/MediaCenter',
564/// but only 'MediaCenter'.
565///
566///
567/// ------------------------------------------------------------------------
568///
569/// **Example:**
570/// ~~~~~~~~~~~~~{.cpp}
571/// #include <kodi/General.h>
572/// ..
573/// std::string skinid = kodi::GetCurrentSkinId();
574/// ..
575/// ~~~~~~~~~~~~~
576///
577inline std::string ATTRIBUTE_HIDDEN GetCurrentSkinId()
578{
579 using namespace kodi::addon;
580
581 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
582
583 std::string strReturn;
584 char* strMsg = toKodi->kodi->get_current_skin_id(toKodi->kodiBase);
585 if (strMsg != nullptr)
586 {
587 if (std::strlen(strMsg))
588 strReturn = strMsg;
589 toKodi->free_string(toKodi->kodiBase, strMsg);
590 }
591 return strReturn;
592}
593//------------------------------------------------------------------------------
594
595//==============================================================================
596/// @brief To check another addon is available and usable inside Kodi.
597///
598/// @param[in] id The wanted addon identification string to check
599/// @param[out] version Version string of addon if **installed** inside Kodi
600/// @param[out] enabled Set to true <b>`true* </b> if addon is enabled
601/// @return Returns <b>`true* </b> if addon is installed
602///
603///
604/// ------------------------------------------------------------------------
605///
606/// **Example:**
607/// ~~~~~~~~~~~~~{.cpp}
608/// #include <kodi/General.h>
609///
610/// bool enabled = false;
611/// std::string version;
612/// bool ret = kodi::IsAddonAvailable("inputstream.adaptive", version, enabled);
613/// fprintf(stderr, "Available inputstream.adaptive version '%s' and enabled '%s'\n",
614/// ret ? version.c_str() : "not installed", enabled ? "yes" : "no");
615/// ~~~~~~~~~~~~~
616///
617inline bool ATTRIBUTE_HIDDEN IsAddonAvailable(const std::string& id,
618 std::string& version,
619 bool& enabled)
620{
621 using namespace kodi::addon;
622
623 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
624
625 char* cVersion = nullptr;
626 bool ret = toKodi->kodi->is_addon_avilable(toKodi->kodiBase, id.c_str(), &cVersion, &enabled);
627 if (cVersion)
628 {
629 version = cVersion;
630 toKodi->free_string(toKodi->kodiBase, cVersion);
631 }
632 return ret;
633}
634//------------------------------------------------------------------------------
635
636//==============================================================================
637/// \ingroup cpp_kodi
638/// @brief Get current Kodi informations and versions, returned data from the following
639/// <b><tt>kodi_version_t version; kodi::KodiVersion(version);</tt></b>
640/// is e.g.:
641/// ~~~~~~~~~~~~~{.cpp}
642/// version.compile_name = Kodi
643/// version.major = 18
644/// version.minor = 0
645/// version.revision = 20170706-c6b22fe217-di
646/// version.tag = alpha
647/// version.tag_revision = 1
648/// ~~~~~~~~~~~~~
649///
650/// @param[out] version structure to store data from kodi
651///
652///
653/// ------------------------------------------------------------------------
654///
655/// **Example:**
656/// ~~~~~~~~~~~~~{.cpp}
657/// #include <kodi/General.h>
658/// ...
659/// kodi_version_t version;
660/// kodi::KodiVersion(version);
661/// fprintf(stderr,
662/// "kodi_version_t version;\n"
663/// "kodi::KodiVersion(version);\n"
664/// " - version.compile_name = %s\n"
665/// " - version.major = %i\n"
666/// " - version.minor = %i\n"
667/// " - version.revision = %s\n"
668/// " - version.tag = %s\n"
669/// " - version.tag_revision = %s\n",
670/// version.compile_name.c_str(), version.major, version.minor,
671/// version.revision.c_str(), version.tag.c_str(), version.tag_revision.c_str());
672/// ...
673/// ~~~~~~~~~~~~~
674///
675inline void ATTRIBUTE_HIDDEN KodiVersion(kodi_version_t& version)
676{
677 using namespace kodi::addon;
678
679 char* compile_name = nullptr;
680 char* revision = nullptr;
681 char* tag = nullptr;
682 char* tag_revision = nullptr;
683
684 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
685 toKodi->kodi->kodi_version(toKodi->kodiBase, &compile_name, &version.major, &version.minor,
686 &revision, &tag, &tag_revision);
687 if (compile_name != nullptr)
688 {
689 version.compile_name = compile_name;
690 toKodi->free_string(toKodi->kodiBase, compile_name);
691 }
692 if (revision != nullptr)
693 {
694 version.revision = revision;
695 toKodi->free_string(toKodi->kodiBase, revision);
696 }
697 if (tag != nullptr)
698 {
699 version.tag = tag;
700 toKodi->free_string(toKodi->kodiBase, tag);
701 }
702 if (tag_revision != nullptr)
703 {
704 version.tag_revision = tag_revision;
705 toKodi->free_string(toKodi->kodiBase, tag_revision);
706 }
707}
708//------------------------------------------------------------------------------
709
710//==============================================================================
711/// \ingroup cpp_kodi
712/// @brief To get keyboard layout characters
713///
714/// This is used to get the keyboard layout currently used from Kodi by the
715/// there set language.
716///
717/// @param[in] modifierKey the key to define the needed layout (uppercase, symbols...)
718/// @param[out] layout_name name of used layout
719/// @param[out] layout list of selected keyboard layout
720/// @return true if request successed
721///
722///
723/// ------------------------------------------------------------------------
724///
725/// **Example:**
726/// ~~~~~~~~~~~~~{.cpp}
727/// #include <kodi/General.h>
728/// ...
729/// std::string layout_name;
730/// std::vector<std::vector<std::string>> layout;
731/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout);
732/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str());
733/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++)
734/// {
735/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++)
736/// {
737/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str());
738/// }
739/// }
740/// ...
741/// ~~~~~~~~~~~~~
742///
743inline bool ATTRIBUTE_HIDDEN GetKeyboardLayout(int modifierKey,
744 std::string& layout_name,
745 std::vector<std::vector<std::string>>& layout)
746{
747 using namespace kodi::addon;
748
749 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
750 AddonKeyboardKeyTable c_layout;
751 char* c_layout_name = nullptr;
752 bool ret =
753 toKodi->kodi->get_keyboard_layout(toKodi->kodiBase, &c_layout_name, modifierKey, &c_layout);
754 if (ret)
755 {
756 if (c_layout_name)
757 {
758 layout_name = c_layout_name;
759 toKodi->free_string(toKodi->kodiBase, c_layout_name);
760 }
761
762 layout.resize(STD_KB_BUTTONS_MAX_ROWS);
763 for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++)
764 {
765 layout[row].resize(STD_KB_BUTTONS_PER_ROW);
766 for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++)
767 {
768 char* button = c_layout.keys[row][column];
769 if (button)
770 {
771 layout[row][column] = button;
772 toKodi->free_string(toKodi->kodiBase, button);
773 }
774 }
775 }
776 }
777 return ret;
778}
779//------------------------------------------------------------------------------
780
781//==============================================================================
782/// \ingroup cpp_kodi
783/// @brief To change keyboard layout characters
784///
785/// This is used to change the keyboard layout currently used from Kodi
786///
787/// @param[out] layout_name new name of used layout (input string not used!)
788/// @return true if request successed
789///
790/// @note \ref GetKeyboardLayout must be called afterwards.
791///
792///
793/// ------------------------------------------------------------------------
794///
795/// **Example:**
796/// ~~~~~~~~~~~~~{.cpp}
797/// #include <kodi/General.h>
798/// ...
799/// std::string layout_name;
800/// kodi::ChangeKeyboardLayout(layout_name);
801///
802/// std::vector<std::vector<std::string>> layout;
803/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout);
804/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str());
805/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++)
806/// {
807/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++)
808/// {
809/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str());
810/// }
811/// }
812/// ...
813/// ~~~~~~~~~~~~~
814///
815inline bool ATTRIBUTE_HIDDEN ChangeKeyboardLayout(std::string& layout_name)
816{
817 using namespace kodi::addon;
818
819 AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi;
820 char* c_layout_name = nullptr;
821 bool ret = toKodi->kodi->change_keyboard_layout(toKodi->kodiBase, &c_layout_name);
822 if (c_layout_name)
823 {
824 layout_name = c_layout_name;
825 toKodi->free_string(toKodi->kodiBase, c_layout_name);
826 }
827
828 return ret;
829}
830//------------------------------------------------------------------------------
831
832} /* namespace kodi */
833
834#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/Network.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/Network.h
deleted file mode 100644
index 910385f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/Network.h
+++ /dev/null
@@ -1,282 +0,0 @@
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 "AddonBase.h"
12#include "c-api/network.h"
13
14#ifdef __cplusplus
15
16//==============================================================================
17/// @defgroup cpp_kodi_network Interface - kodi::network
18/// @ingroup cpp
19/// @brief **Network functions**\n
20/// The network module offers functions that allow you to control it.
21///
22/// It has the header @ref Network.h "#include <kodi/Network.h>" be included
23/// to enjoy it.
24///
25//------------------------------------------------------------------------------
26
27namespace kodi
28{
29namespace network
30{
31
32//============================================================================
33/// @ingroup cpp_kodi_network
34/// @brief Send WakeOnLan magic packet.
35///
36/// @param[in] mac Network address of the host to wake.
37/// @return True if the magic packet was successfully sent, false otherwise.
38///
39inline bool ATTRIBUTE_HIDDEN WakeOnLan(const std::string& mac)
40{
41 using namespace ::kodi::addon;
42
43 return CAddonBase::m_interface->toKodi->kodi_network->wake_on_lan(
44 CAddonBase::m_interface->toKodi->kodiBase, mac.c_str());
45}
46//----------------------------------------------------------------------------
47
48//============================================================================
49/// @ingroup cpp_kodi_network
50/// @brief To the current own ip address as a string.
51///
52/// @return Own system ip.
53///
54///
55/// ------------------------------------------------------------------------
56///
57/// **Example:**
58/// ~~~~~~~~~~~~~{.cpp}
59/// #include <kodi/Network.h>
60/// ...
61/// std::string ipAddress = kodi::network::GetIPAddress();
62/// fprintf(stderr, "My IP is '%s'\n", ipAddress.c_str());
63/// ...
64/// ~~~~~~~~~~~~~
65///
66inline std::string ATTRIBUTE_HIDDEN GetIPAddress()
67{
68 using namespace ::kodi::addon;
69
70 std::string ip;
71 char* string = CAddonBase::m_interface->toKodi->kodi_network->get_ip_address(
72 CAddonBase::m_interface->toKodi->kodiBase);
73 if (string != nullptr)
74 {
75 ip = string;
76 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string);
77 }
78 return ip;
79}
80//----------------------------------------------------------------------------
81
82//============================================================================
83/// @ingroup cpp_kodi_network
84/// @brief Return our hostname.
85///
86/// @return String about hostname, empty in case of error
87///
88///
89/// ------------------------------------------------------------------------
90///
91/// **Example:**
92/// ~~~~~~~~~~~~~{.cpp}
93/// #include <kodi/Network.h>
94/// ...
95/// std::string hostname = kodi::network::GetHostname();
96/// fprintf(stderr, "My hostname is '%s'\n", hostname.c_str());
97/// ...
98/// ~~~~~~~~~~~~~
99///
100inline std::string ATTRIBUTE_HIDDEN GetHostname()
101{
102 using namespace ::kodi::addon;
103
104 std::string ip;
105 char* string = CAddonBase::m_interface->toKodi->kodi_network->get_hostname(
106 CAddonBase::m_interface->toKodi->kodiBase);
107 if (string != nullptr)
108 {
109 ip = string;
110 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string);
111 }
112 return ip;
113}
114//----------------------------------------------------------------------------
115
116//============================================================================
117/// @ingroup cpp_kodi_network
118/// @brief Returns Kodi's HTTP UserAgent string.
119///
120/// @return HTTP user agent
121///
122///
123/// ------------------------------------------------------------------------
124///
125/// **Example:**
126/// ~~~~~~~~~~~~~{.py}
127/// ..
128/// std::string agent = kodi::network::GetUserAgent()
129/// ..
130/// ~~~~~~~~~~~~~
131///
132/// example output:
133/// Kodi/19.0-ALPHA1 (X11; Linux x86_64) Ubuntu/20.04 App_Bitness/64 Version/19.0-ALPHA1-Git:20200522-0076d136d3-dirty
134///
135inline std::string ATTRIBUTE_HIDDEN GetUserAgent()
136{
137 using namespace ::kodi::addon;
138
139 std::string agent;
140 char* string = CAddonBase::m_interface->toKodi->kodi_network->get_user_agent(
141 CAddonBase::m_interface->toKodi->kodiBase);
142 if (string != nullptr)
143 {
144 agent = string;
145 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string);
146 }
147 return agent;
148}
149//----------------------------------------------------------------------------
150
151//============================================================================
152/// @ingroup cpp_kodi_network
153/// @brief Check given name or ip address corresponds to localhost.
154///
155/// @param[in] hostname Hostname to check
156/// @return Return true if given name or ip address corresponds to localhost
157///
158///
159/// ------------------------------------------------------------------------
160///
161/// **Example:**
162/// ~~~~~~~~~~~~~{.cpp}
163/// #include <kodi/Network.h>
164/// ...
165/// if (kodi::network::IsLocalHost("127.0.0.1"))
166/// fprintf(stderr, "Is localhost\n");
167/// ...
168/// ~~~~~~~~~~~~~
169///
170inline bool ATTRIBUTE_HIDDEN IsLocalHost(const std::string& hostname)
171{
172 using namespace ::kodi::addon;
173
174 return CAddonBase::m_interface->toKodi->kodi_network->is_local_host(
175 CAddonBase::m_interface->toKodi->kodiBase, hostname.c_str());
176}
177//----------------------------------------------------------------------------
178
179//==============================================================================
180/// @ingroup cpp_kodi_network
181/// @brief Checks whether the specified path refers to a local network.
182///
183/// @param[in] hostname Hostname to check
184/// @param[in] offLineCheck Check if in private range, see https://en.wikipedia.org/wiki/Private_network
185/// @return True if host is on a LAN, false otherwise
186///
187inline bool ATTRIBUTE_HIDDEN IsHostOnLAN(const std::string& hostname, bool offLineCheck = false)
188{
189 using namespace kodi::addon;
190
191 return CAddonBase::m_interface->toKodi->kodi_network->is_host_on_lan(
192 CAddonBase::m_interface->toKodi->kodiBase, hostname.c_str(), offLineCheck);
193}
194//------------------------------------------------------------------------------
195
196//============================================================================
197/// @ingroup cpp_kodi_network
198/// @brief URL encodes the given string
199///
200/// This function converts the given input string to a URL encoded string and
201/// returns that as a new allocated string. All input characters that are
202/// not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped"
203/// version (%NN where NN is a two-digit hexadecimal number).
204///
205/// @param[in] url The code of the message to get.
206/// @return Encoded URL string
207///
208///
209/// ------------------------------------------------------------------------
210///
211/// **Example:**
212/// ~~~~~~~~~~~~~{.cpp}
213/// #include <kodi/Network.h>
214/// ...
215/// std::string encodedUrl = kodi::network::URLEncode("François");
216/// fprintf(stderr, "Encoded URL is '%s'\n", encodedUrl.c_str());
217/// ...
218/// ~~~~~~~~~~~~~
219/// For example, the string: François ,would be encoded as: Fran%C3%A7ois
220///
221inline std::string ATTRIBUTE_HIDDEN URLEncode(const std::string& url)
222{
223 using namespace ::kodi::addon;
224
225 std::string retString;
226 char* string = CAddonBase::m_interface->toKodi->kodi_network->url_encode(
227 CAddonBase::m_interface->toKodi->kodiBase, url.c_str());
228 if (string != nullptr)
229 {
230 retString = string;
231 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string);
232 }
233 return retString;
234}
235//----------------------------------------------------------------------------
236
237//============================================================================
238/// @ingroup cpp_kodi_network
239/// @brief Lookup URL in DNS cache
240///
241/// This test will get DNS record for a domain. The DNS lookup is done directly
242/// against the domain's authoritative name server, so changes to DNS Records
243/// should show up instantly. By default, the DNS lookup tool will return an
244/// IP address if you give it a name (e.g. www.example.com)
245///
246/// @param[in] hostName The code of the message to get.
247/// @param[out] ipAddress Returned address
248/// @return true if successfull
249///
250///
251/// ------------------------------------------------------------------------
252///
253/// **Example:**
254/// ~~~~~~~~~~~~~{.cpp}
255/// #include <kodi/Network.h>
256/// ...
257/// std::string ipAddress;
258/// bool ret = kodi::network::DNSLookup("www.google.com", ipAddress);
259/// fprintf(stderr, "DNSLookup returned for www.google.com the IP '%s', call was %s\n", ipAddress.c_str(), ret ? "ok" : "failed");
260/// ...
261/// ~~~~~~~~~~~~~
262///
263inline bool ATTRIBUTE_HIDDEN DNSLookup(const std::string& hostName, std::string& ipAddress)
264{
265 using namespace ::kodi::addon;
266
267 bool ret = false;
268 char* string = CAddonBase::m_interface->toKodi->kodi_network->dns_lookup(
269 CAddonBase::m_interface->toKodi->kodiBase, hostName.c_str(), &ret);
270 if (string != nullptr)
271 {
272 ipAddress = string;
273 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string);
274 }
275 return ret;
276}
277//----------------------------------------------------------------------------
278
279} /* namespace network */
280} /* namespace kodi */
281
282#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCodec.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCodec.h
deleted file mode 100644
index e030371..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCodec.h
+++ /dev/null
@@ -1,126 +0,0 @@
1/*
2 * Copyright (C) 2017-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#ifdef __cplusplus
12extern "C"
13{
14#endif /* __cplusplus */
15
16 //==============================================================================
17 /// @ingroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_INITDATA
18 /// @brief The standard defines several sets of capabilities, which are referred
19 /// to as profiles, targeting specific classes of applications.
20 //@{
21 enum STREAMCODEC_PROFILE
22 {
23 /// @brief Unknown codec profile
24 CodecProfileUnknown = 0,
25
26 /// @brief If a codec profile is not required
27 CodecProfileNotNeeded,
28
29 /// @brief **H264** Baseline Profile (BP, 66)
30 ///
31 /// Primarily for low-cost applications that require additional data loss
32 /// robustness, this profile is used in some videoconferencing and mobile
33 /// applications. This profile includes all features that are supported
34 /// in the Constrained Baseline Profile, plus three additional features
35 /// that can be used for loss robustness (or for other purposes such as
36 /// low-delay multi-point video stream compositing). The importance of
37 /// this profile has faded somewhat since the definition of the Constrained
38 /// Baseline Profile in 2009. All Constrained Baseline Profile bitstreams
39 /// are also considered to be Baseline Profile bitstreams, as these two
40 /// profiles share the same profile identifier code value.
41 H264CodecProfileBaseline,
42
43 /// @brief **H264** Main Profile (MP, 77)
44 ///
45 /// This profile is used for standard-definition digital TV broadcasts that
46 /// use the MPEG-4 format as defined in the
47 /// [DVB standard](http://www.etsi.org/deliver/etsi_ts/101100_101199/101154/01.09.01_60/ts_101154v010901p.pdf).
48 /// It is not, however, used for high-definition television broadcasts, as the
49 /// importance of this profile faded when the High Profile was developed
50 /// in 2004 for that application.
51 H264CodecProfileMain,
52
53 /// @brief **H264** Extended Profile (XP, 88)
54 ///
55 /// Intended as the streaming video profile, this profile has relatively high
56 /// compression capability and some extra tricks for robustness to data losses
57 /// and server stream switching.
58 H264CodecProfileExtended,
59
60 /// @brief **H264** High Profile (HiP, 100)
61 ///
62 /// The primary profile for broadcast and disc storage applications,
63 /// particularly for high-definition television applications (for example,
64 /// this is the profile adopted by the [Blu-ray Disc](https://en.wikipedia.org/wiki/Blu-ray_Disc)
65 /// storage format and the [DVB](https://en.wikipedia.org/wiki/Digital_Video_Broadcasting)
66 /// HDTV broadcast service).
67 H264CodecProfileHigh,
68
69 /// @brief **H264** High 10 Profile (Hi10P, 110)
70 ///
71 /// Going beyond typical mainstream consumer product capabilities, this
72 /// profile builds on top of the High Profile, adding support for up to 10
73 /// bits per sample of decoded picture precision.
74 H264CodecProfileHigh10,
75
76 /// @brief **H264** High 4:2:2 Profile (Hi422P, 122)
77 ///
78 /// Primarily targeting professional applications that use interlaced video,
79 /// this profile builds on top of the High 10 Profile, adding support for the
80 /// 4:2:2 chroma sampling format while using up to 10 bits per sample of
81 /// decoded picture precision.
82 H264CodecProfileHigh422,
83
84 /// @brief **H264** High 4:4:4 Predictive Profile (Hi444PP, 244)
85 ///
86 /// This profile builds on top of the High 4:2:2 Profile, supporting up to
87 /// 4:4:4 chroma sampling, up to 14 bits per sample, and additionally
88 /// supporting efficient lossless region coding and the coding of each
89 /// picture as three separate color planes.
90 H264CodecProfileHigh444Predictive,
91
92 /// @brief **VP9** profile 0
93 ///
94 /// There are several variants of the VP9 format (known as "coding profiles"),
95 /// which successively allow more features; profile 0 is the basic variant,
96 /// requiring the least from a hardware implementation.
97 ///
98 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 8 bit/sample,
99 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0
100 VP9CodecProfile0 = 20,
101
102 /// @brief **VP9** profile 1
103 ///
104 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 8 bit,
105 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0, 4:2:2, 4:4:4
106 VP9CodecProfile1,
107
108 /// @brief **VP9** profile 2
109 ///
110 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 10–12 bit,
111 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0
112 VP9CodecProfile2,
113
114 /// @brief **VP9** profile 3
115 ///
116 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 10–12 bit,
117 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0, 4:2:2, 4:4:4,
118 /// see [VP9 Bitstream & Decoding Process Specification](https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf)
119 VP9CodecProfile3,
120 };
121 //@}
122 //------------------------------------------------------------------------------
123
124#ifdef __cplusplus
125} /* extern "C" */
126#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCrypto.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCrypto.h
deleted file mode 100644
index 8008aa1..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/StreamCrypto.h
+++ /dev/null
@@ -1,42 +0,0 @@
1/*
2 * Copyright (C) 2017-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 <inttypes.h>
12#include <string.h>
13
14#define STREAMCRYPTO_VERSION_LEVEL 1
15
16#ifdef __cplusplus
17extern "C"
18{
19#endif /* __cplusplus */
20
21 typedef struct CRYPTO_INFO
22 {
23 enum CRYPTO_KEY_SYSTEM : uint8_t
24 {
25 CRYPTO_KEY_SYSTEM_NONE = 0,
26 CRYPTO_KEY_SYSTEM_WIDEVINE,
27 CRYPTO_KEY_SYSTEM_PLAYREADY,
28 CRYPTO_KEY_SYSTEM_WISEPLAY,
29 CRYPTO_KEY_SYSTEM_COUNT
30 } m_CryptoKeySystem; /*!< @brief keysystem for encrypted media, KEY_SYSTEM_NONE for unencrypted media */
31
32 static const uint8_t FLAG_SECURE_DECODER =
33 1; /*!< @brief is set in flags if decoding has to be done in TEE environment */
34
35 uint8_t flags;
36 uint16_t m_CryptoSessionIdSize; /*!< @brief The size of the crypto session key id */
37 const char* m_CryptoSessionId; /*!< @brief The crypto session key id */
38 } CRYPTO_INFO;
39
40#ifdef __cplusplus
41} /* extern "C" */
42#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioDecoder.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioDecoder.h
deleted file mode 100644
index 25e39e2..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioDecoder.h
+++ /dev/null
@@ -1,363 +0,0 @@
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 "../AddonBase.h"
12#ifdef BUILD_KODI_ADDON
13#include "../AEChannelData.h"
14#else
15#include "cores/AudioEngine/Utils/AEChannelData.h"
16#endif
17#include <stdint.h>
18
19namespace kodi
20{
21namespace addon
22{
23 class CInstanceAudioDecoder;
24} /* namespace addon */
25} /* namespace kodi */
26
27extern "C"
28{
29
30typedef struct AddonProps_AudioDecoder
31{
32 int dummy;
33} AddonProps_AudioDecoder;
34
35typedef struct AddonToKodiFuncTable_AudioDecoder
36{
37 void* kodiInstance;
38} AddonToKodiFuncTable_AudioDecoder;
39
40struct AddonInstance_AudioDecoder;
41typedef struct KodiToAddonFuncTable_AudioDecoder
42{
43 kodi::addon::CInstanceAudioDecoder* addonInstance;
44 bool (__cdecl* init)(const AddonInstance_AudioDecoder* instance,
45 const char* file, unsigned int filecache,
46 int* channels, int* samplerate,
47 int* bitspersample, int64_t* totaltime,
48 int* bitrate, AEDataFormat* format,
49 const AEChannel** info);
50 int (__cdecl* read_pcm)(const AddonInstance_AudioDecoder* instance, uint8_t* buffer, int size, int* actualsize);
51 int64_t (__cdecl* seek)(const AddonInstance_AudioDecoder* instance, int64_t time);
52 bool (__cdecl* read_tag)(const AddonInstance_AudioDecoder* instance,
53 const char* file, char* title,
54 char* artist, int* length);
55 int (__cdecl* track_count)(const AddonInstance_AudioDecoder* instance, const char* file);
56} KodiToAddonFuncTable_AudioDecoder;
57
58typedef struct AddonInstance_AudioDecoder
59{
60 AddonProps_AudioDecoder props;
61 AddonToKodiFuncTable_AudioDecoder toKodi;
62 KodiToAddonFuncTable_AudioDecoder toAddon;
63} AddonInstance_AudioDecoder;
64
65} /* extern "C" */
66
67namespace kodi
68{
69namespace addon
70{
71
72//==============================================================================
73///
74/// \addtogroup cpp_kodi_addon_audiodecoder
75/// @brief \cpp_class{ kodi::addon::CInstanceAudioDecoder }
76/// **Audio decoder add-on instance**
77///
78/// For audio decoders as binary add-ons. This class implements a way to handle
79/// special types of audio files.
80///
81/// The add-on handles loading of the source file and outputting the audio stream
82/// for consumption by the player.
83///
84/// The addon.xml defines the capabilities of this add-on.
85///
86/// @note The option to have multiple instances is possible with audio-decoder
87/// add-ons. This is useful, since some playback engines are riddled by global
88/// variables, making decoding of multiple streams using the same instance
89/// impossible.
90///
91///
92/// ----------------------------------------------------------------------------
93///
94/// **Here's an example on addon.xml:**
95/// ~~~~~~~~~~~~~{.xml}
96/// <extension
97/// point="kodi.audiodecoder"
98/// name="2sf"
99/// extension=".2sf|.mini2sf"
100/// tags="true"
101/// library_@PLATFORM@="@LIBRARY_FILENAME@"/>
102/// ~~~~~~~~~~~~~
103///
104/// Description to audio decoder related addon.xml values:
105/// | Name | Description
106/// |:------------------------------|----------------------------------------
107/// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"kodi.audiodecoder"</b>.
108/// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build.
109/// | <b>`name`</b> | The name of the decoder used in Kodi for display.
110/// | <b>`extension`</b> | The file extensions / styles supported by this addon.
111/// | <b>`tags`</b> | Boolean to point out that addon can bring own information to replayed file, if <b>`false`</b> only the file name is used as info.<br>If <b>`true`</b>, \ref CInstanceAudioDecoder::ReadTag is used and must be implemented.
112///
113/// --------------------------------------------------------------------------
114///
115/// **Here is a code example how this addon is used:**
116///
117/// ~~~~~~~~~~~~~{.cpp}
118/// #include <kodi/addon-instance/AudioDecoder.h>
119///
120/// class CMyAudioDecoder : public ::kodi::addon::CInstanceAudioDecoder
121/// {
122/// public:
123/// CMyAudioDecoder(KODI_HANDLE instance);
124///
125/// bool Init(const std::string& filename, unsigned int filecache,
126/// int& channels, int& samplerate,
127/// int& bitspersample, int64_t& totaltime,
128/// int& bitrate, AEDataFormat& format,
129/// std::vector<AEChannel>& channellist) override;
130/// int ReadPCM(uint8_t* buffer, int size, int& actualsize) override;
131/// };
132///
133/// CMyAudioDecoder::CMyAudioDecoder(KODI_HANDLE instance)
134/// : CInstanceAudioDecoder(instance)
135/// {
136/// ...
137/// }
138///
139/// bool CMyAudioDecoder::Init(const std::string& filename, unsigned int filecache,
140/// int& channels, int& samplerate,
141/// int& bitspersample, int64_t& totaltime,
142/// int& bitrate, AEDataFormat& format,
143/// std::vector<AEChannel>& channellist)
144/// {
145/// ...
146/// return true;
147/// }
148///
149/// int CMyAudioDecoder::ReadPCM(uint8_t* buffer, int size, int& actualsize)
150/// {
151/// ...
152/// return 0;
153/// }
154///
155///
156/// /*----------------------------------------------------------------------*/
157///
158/// class CMyAddon : public ::kodi::addon::CAddonBase
159/// {
160/// public:
161/// CMyAddon() { }
162/// ADDON_STATUS CreateInstance(int instanceType,
163/// std::string instanceID,
164/// KODI_HANDLE instance,
165/// KODI_HANDLE& addonInstance) override;
166/// };
167///
168/// /* If you use only one instance in your add-on, can be instanceType and
169/// * instanceID ignored */
170/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
171/// std::string instanceID,
172/// KODI_HANDLE instance,
173/// KODI_HANDLE& addonInstance)
174/// {
175/// if (instanceType == ADDON_INSTANCE_AUDIODECODER)
176/// {
177/// kodi::Log(ADDON_LOG_NOTICE, "Creating my audio decoder");
178/// addonInstance = new CMyAudioDecoder(instance);
179/// return ADDON_STATUS_OK;
180/// }
181/// else if (...)
182/// {
183/// ...
184/// }
185/// return ADDON_STATUS_UNKNOWN;
186/// }
187///
188/// ADDONCREATOR(CMyAddon)
189/// ~~~~~~~~~~~~~
190///
191/// The destruction of the example class `CMyAudioDecoder` is called from
192/// Kodi's header. Manually deleting the add-on instance is not required.
193///
194class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance
195{
196public:
197 //==========================================================================
198 /// @ingroup cpp_kodi_addon_audiodecoder
199 /// @brief Class constructor
200 ///
201 /// @param[in] instance The addon instance class handler given by Kodi
202 /// at \ref kodi::addon::CAddonBase::CreateInstance(...)
203 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
204 /// allow compatibility to older Kodi versions.
205 /// @note Recommended to set.
206 ///
207 explicit CInstanceAudioDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "")
208 : IAddonInstance(ADDON_INSTANCE_AUDIODECODER,
209 !kodiVersion.empty() ? kodiVersion
210 : GetKodiTypeVersion(ADDON_INSTANCE_AUDIODECODER))
211 {
212 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
213 throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation of multiple together with single instance way is not allowed!");
214
215 SetAddonStruct(instance);
216 }
217 //--------------------------------------------------------------------------
218
219 //==========================================================================
220 /// @ingroup cpp_kodi_addon_audiodecoder
221 /// @brief Initialize a decoder
222 ///
223 /// @param[in] filename The file to read
224 /// @param[in] filecache The file cache size
225 /// @param[out] channels Number of channels in output stream
226 /// @param[out] samplerate Samplerate of output stream
227 /// @param[out] bitspersample Bits per sample in output stream
228 /// @param[out] totaltime Total time for stream
229 /// @param[out] bitrate Average bitrate of input stream
230 /// @param[out] format Data format for output stream
231 /// @param[out] channellist Channel mapping for output stream
232 /// @return true if successfully done, otherwise
233 /// false
234 ///
235 virtual bool Init(const std::string& filename, unsigned int filecache,
236 int& channels, int& samplerate,
237 int& bitspersample, int64_t& totaltime,
238 int& bitrate, AEDataFormat& format,
239 std::vector<AEChannel>& channellist) = 0;
240 //--------------------------------------------------------------------------
241
242 //==========================================================================
243 /// @ingroup cpp_kodi_addon_audiodecoder
244 /// @brief Produce some noise
245 ///
246 /// @param[in] buffer Output buffer
247 /// @param[in] size Size of output buffer
248 /// @param[out] actualsize Actual number of bytes written to output buffer
249 /// @return Return with following possible values:
250 /// | Value | Description |
251 /// |:-----:|:-----------------------------|
252 /// | 0 | on success
253 /// | -1 | on end of stream
254 /// | 1 | on failure
255 ///
256 virtual int ReadPCM(uint8_t* buffer, int size, int& actualsize) = 0;
257 //--------------------------------------------------------------------------
258
259 //==========================================================================
260 /// @ingroup cpp_kodi_addon_audiodecoder
261 /// @brief Seek in output stream
262 ///
263 /// @param[in] time Time position to seek to in milliseconds
264 /// @return Time position seek ended up on
265 ///
266 virtual int64_t Seek(int64_t time) { return time; }
267 //--------------------------------------------------------------------------
268
269 //==========================================================================
270 /// @ingroup cpp_kodi_addon_audiodecoder
271 /// @brief Read tag of a file
272 ///
273 /// @param[in] file File to read tag for
274 /// @param[out] title Title of file
275 /// @param[out] artist Artist of file
276 /// @param[out] length Length of file
277 /// @return True on success, false on failure
278 ///
279 virtual bool ReadTag(const std::string& file, std::string& title, std::string& artist, int& length) { return false; }
280 //--------------------------------------------------------------------------
281
282 //==========================================================================
283 /// @ingroup cpp_kodi_addon_audiodecoder
284 /// @brief Get number of tracks in a file
285 ///
286 /// @param[in] file File to read tag for
287 /// @return Number of tracks in file
288 ///
289 virtual int TrackCount(const std::string& file) { return 1; }
290 //--------------------------------------------------------------------------
291
292private:
293 void SetAddonStruct(KODI_HANDLE instance)
294 {
295 if (instance == nullptr)
296 throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation with empty addon structure not allowed, table must be given from Kodi!");
297
298 m_instanceData = static_cast<AddonInstance_AudioDecoder*>(instance);
299
300 m_instanceData->toAddon.addonInstance = this;
301 m_instanceData->toAddon.init = ADDON_Init;
302 m_instanceData->toAddon.read_pcm = ADDON_ReadPCM;
303 m_instanceData->toAddon.seek = ADDON_Seek;
304 m_instanceData->toAddon.read_tag = ADDON_ReadTag;
305 m_instanceData->toAddon.track_count = ADDON_TrackCount;
306 }
307
308 inline static bool ADDON_Init(const AddonInstance_AudioDecoder* instance, const char* file, unsigned int filecache,
309 int* channels, int* samplerate,
310 int* bitspersample, int64_t* totaltime,
311 int* bitrate, AEDataFormat* format,
312 const AEChannel** info)
313 {
314 instance->toAddon.addonInstance->m_channelList.clear();
315 bool ret = instance->toAddon.addonInstance->Init(file, filecache, *channels,
316 *samplerate, *bitspersample,
317 *totaltime, *bitrate, *format,
318 instance->toAddon.addonInstance->m_channelList);
319 if (!instance->toAddon.addonInstance->m_channelList.empty())
320 {
321 if (instance->toAddon.addonInstance->m_channelList.back() != AE_CH_NULL)
322 instance->toAddon.addonInstance->m_channelList.push_back(AE_CH_NULL);
323 *info = instance->toAddon.addonInstance->m_channelList.data();
324 }
325 else
326 *info = nullptr;
327 return ret;
328 }
329
330 inline static int ADDON_ReadPCM(const AddonInstance_AudioDecoder* instance, uint8_t* buffer, int size, int* actualsize)
331 {
332 return instance->toAddon.addonInstance->ReadPCM(buffer, size, *actualsize);
333 }
334
335 inline static int64_t ADDON_Seek(const AddonInstance_AudioDecoder* instance, int64_t time)
336 {
337 return instance->toAddon.addonInstance->Seek(time);
338 }
339
340 inline static bool ADDON_ReadTag(const AddonInstance_AudioDecoder* instance, const char* file, char* title, char* artist, int* length)
341 {
342 std::string intTitle;
343 std::string intArtist;
344 bool ret = instance->toAddon.addonInstance->ReadTag(file, intTitle, intArtist, *length);
345 if (ret)
346 {
347 strncpy(title, intTitle.c_str(), ADDON_STANDARD_STRING_LENGTH_SMALL-1);
348 strncpy(artist, intArtist.c_str(), ADDON_STANDARD_STRING_LENGTH_SMALL-1);
349 }
350 return ret;
351 }
352
353 inline static int ADDON_TrackCount(const AddonInstance_AudioDecoder* instance, const char* file)
354 {
355 return instance->toAddon.addonInstance->TrackCount(file);
356 }
357
358 std::vector<AEChannel> m_channelList;
359 AddonInstance_AudioDecoder* m_instanceData;
360};
361
362} /* namespace addon */
363} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioEncoder.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioEncoder.h
deleted file mode 100644
index 36257e1..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/AudioEncoder.h
+++ /dev/null
@@ -1,218 +0,0 @@
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 "../AddonBase.h"
12
13namespace kodi { namespace addon { class CInstanceAudioEncoder; }}
14
15extern "C"
16{
17
18 typedef struct AddonProps_AudioEncoder
19 {
20 int dummy;
21 } AddonProps_AudioEncoder;
22
23 typedef struct AddonToKodiFuncTable_AudioEncoder
24 {
25 void* kodiInstance;
26 int (*write) (void* kodiInstance, const uint8_t* data, int len);
27 int64_t (*seek)(void* kodiInstance, int64_t pos, int whence);
28 } AddonToKodiFuncTable_AudioEncoder;
29
30 struct AddonInstance_AudioEncoder;
31 typedef struct KodiToAddonFuncTable_AudioEncoder
32 {
33 kodi::addon::CInstanceAudioEncoder* addonInstance;
34 bool (__cdecl* start) (const AddonInstance_AudioEncoder* instance, int in_channels, int in_rate, int in_bits,
35 const char* title, const char* artist,
36 const char* albumartist, const char* album,
37 const char* year, const char* track,
38 const char* genre, const char* comment,
39 int track_length);
40 int (__cdecl* encode) (const AddonInstance_AudioEncoder* instance, int num_bytes_read, const uint8_t* pbt_stream);
41 bool (__cdecl* finish) (const AddonInstance_AudioEncoder* instance);
42 } KodiToAddonFuncTable_AudioEncoder;
43
44 typedef struct AddonInstance_AudioEncoder
45 {
46 AddonProps_AudioEncoder props;
47 AddonToKodiFuncTable_AudioEncoder toKodi;
48 KodiToAddonFuncTable_AudioEncoder toAddon;
49 } AddonInstance_AudioEncoder;
50
51} /* extern "C" */
52
53namespace kodi
54{
55namespace addon
56{
57
58 class ATTRIBUTE_HIDDEN CInstanceAudioEncoder : public IAddonInstance
59 {
60 public:
61 //==========================================================================
62 /// @brief Class constructor
63 ///
64 /// @param[in] instance The from Kodi given instance given be
65 /// add-on CreateInstance call with instance
66 /// id ADDON_INSTANCE_AUDIOENCODER.
67 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
68 /// allow compatibility to older Kodi versions.
69 /// @note Recommended to set.
70 ///
71 explicit CInstanceAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion = "")
72 : IAddonInstance(ADDON_INSTANCE_AUDIOENCODER,
73 !kodiVersion.empty() ? kodiVersion
74 : GetKodiTypeVersion(ADDON_INSTANCE_AUDIOENCODER))
75 {
76 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
77 throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation of multiple together with single instance way is not allowed!");
78
79 SetAddonStruct(instance);
80 }
81 //--------------------------------------------------------------------------
82
83 //==========================================================================
84 /// \brief Start encoder (**required**)
85 ///
86 /// \param[in] inChannels Number of channels
87 /// \param[in] inRate Sample rate of input data
88 /// \param[in] inBits Bits per sample in input data
89 /// \param[in] title The title of the song
90 /// \param[in] artist The artist of the song
91 /// \param[in] albumartist The albumartist of the song
92 /// \param[in] year The year of the song
93 /// \param[in] track The track number of the song
94 /// \param[in] genre The genre of the song
95 /// \param[in] comment A comment to attach to the song
96 /// \param[in] trackLength Total track length in seconds
97 /// \return True on success, false on failure.
98 ///
99 virtual bool Start(int inChannels,
100 int inRate,
101 int inBits,
102 const std::string& title,
103 const std::string& artist,
104 const std::string& albumartist,
105 const std::string& album,
106 const std::string& year,
107 const std::string& track,
108 const std::string& genre,
109 const std::string& comment,
110 int trackLength) = 0;
111 //--------------------------------------------------------------------------
112
113 //==========================================================================
114 /// \brief Encode a chunk of audio (**required**)
115 ///
116 /// \param[in] numBytesRead Number of bytes in input buffer
117 /// \param[in] pbtStream the input buffer
118 /// \return Number of bytes consumed
119 ///
120 virtual int Encode(int numBytesRead, const uint8_t* pbtStream) = 0;
121 //--------------------------------------------------------------------------
122
123 //==========================================================================
124 /// \brief Finalize encoding (**optional**)
125 ///
126 /// \return True on success, false on failure.
127 ///
128 virtual bool Finish() { return true; }
129 //--------------------------------------------------------------------------
130
131 //==========================================================================
132 /// \brief Write block of data
133 ///
134 /// \param[in] data Pointer to the array of elements to be
135 /// written
136 /// \param[in] length Size in bytes to be written.
137 /// \return The total number of bytes
138 /// successfully written is returned.
139 int Write(const uint8_t* data, int length)
140 {
141 return m_instanceData->toKodi.write(m_instanceData->toKodi.kodiInstance, data, length);
142 }
143 //--------------------------------------------------------------------------
144
145 //==========================================================================
146 /// \brief Set the file's current position.
147 ///
148 /// The whence argument is optional and defaults to SEEK_SET (0)
149 ///
150 /// \param[in] position the position that you want to seek to
151 /// \param[in] whence [optional] offset relative to
152 /// You can set the value of whence to one
153 /// of three things:
154 /// | Value | int | Description |
155 /// |:--------:|:---:|:---------------------------------------------------|
156 /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence.
157 /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes."
158 /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion.
159 ///
160 /// \return Returns the resulting offset location as
161 /// measured in bytes from the beginning of
162 /// the file. On error, the value -1 is
163 /// returned.
164 int64_t Seek(int64_t position, int whence = SEEK_SET)
165 {
166 return m_instanceData->toKodi.seek(m_instanceData->toKodi.kodiInstance, position, whence);
167 }
168 //--------------------------------------------------------------------------
169
170 private:
171 void SetAddonStruct(KODI_HANDLE instance)
172 {
173 if (instance == nullptr)
174 throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation with empty addon structure not allowed, table must be given from Kodi!");
175
176 m_instanceData = static_cast<AddonInstance_AudioEncoder*>(instance);
177 m_instanceData->toAddon.addonInstance = this;
178 m_instanceData->toAddon.start = ADDON_Start;
179 m_instanceData->toAddon.encode = ADDON_Encode;
180 m_instanceData->toAddon.finish = ADDON_Finish;
181 }
182
183 inline static bool ADDON_Start(const AddonInstance_AudioEncoder* instance, int inChannels, int inRate, int inBits,
184 const char* title, const char* artist,
185 const char* albumartist, const char* album,
186 const char* year, const char* track,
187 const char* genre, const char* comment,
188 int trackLength)
189 {
190 return instance->toAddon.addonInstance->Start(inChannels,
191 inRate,
192 inBits,
193 title,
194 artist,
195 albumartist,
196 album,
197 year,
198 track,
199 genre,
200 comment,
201 trackLength);
202 }
203
204 inline static int ADDON_Encode(const AddonInstance_AudioEncoder* instance, int numBytesRead, const uint8_t* pbtStream)
205 {
206 return instance->toAddon.addonInstance->Encode(numBytesRead, pbtStream);
207 }
208
209 inline static bool ADDON_Finish(const AddonInstance_AudioEncoder* instance)
210 {
211 return instance->toAddon.addonInstance->Finish();
212 }
213
214 AddonInstance_AudioEncoder* m_instanceData;
215 };
216
217} /* namespace addon */
218} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/CMakeLists.txt
deleted file mode 100644
index 8fa6e05..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
1set(HEADERS AudioDecoder.h
2 AudioEncoder.h
3 Game.h
4 ImageDecoder.h
5 Inputstream.h
6 Peripheral.h
7 PeripheralUtils.h
8 PVR.h
9 Screensaver.h
10 VFS.h
11 VideoCodec.h
12 Visualization.h)
13
14if(NOT ENABLE_STATIC_LIBS)
15 core_add_library(addons_kodi-addon-dev-kit_include_kodi_addon-instance)
16endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Game.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Game.h
deleted file mode 100644
index a53f1e7..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Game.h
+++ /dev/null
@@ -1,2360 +0,0 @@
1/*
2 * Copyright (C) 2014-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 "../AddonBase.h"
12
13#ifdef BUILD_KODI_ADDON
14#include "XBMC_vkeys.h"
15#else
16#include "input/XBMC_vkeys.h"
17#endif
18
19//==============================================================================
20/// @addtogroup cpp_kodi_addon_game
21///
22/// To use on Libretro and for stand-alone games or emulators that does not use
23/// the Libretro API.
24///
25/// Possible examples could be, Nvidia GameStream via Limelight or WINE capture
26/// could possible through the Game API.
27///
28
29namespace kodi
30{
31namespace addon
32{
33class CInstanceGame;
34}
35} // namespace kodi
36
37extern "C"
38{
39
40//==============================================================================
41/// \defgroup cpp_kodi_addon_game_Defs Definitions, structures and enumerators
42/// \ingroup cpp_kodi_addon_game
43/// @brief **Game add-on instance definition values**
44//------------------------------------------------------------------------------
45
46//==============================================================================
47/// \ingroup cpp_kodi_addon_game_Defs
48/// @brief **Port ID used when topology is unknown**
49#define DEFAULT_PORT_ID "1"
50//------------------------------------------------------------------------------
51
52//==============================================================================
53/// \ingroup cpp_kodi_addon_game_Defs
54/// @brief **Game add-on error codes**
55///
56/// Used as return values on most Game related functions.
57///
58typedef enum GAME_ERROR
59{
60 /// @brief no error occurred
61 GAME_ERROR_NO_ERROR,
62
63 /// @brief an unknown error occurred
64 GAME_ERROR_UNKNOWN,
65
66 /// @brief the method that the frontend called is not implemented
67 GAME_ERROR_NOT_IMPLEMENTED,
68
69 /// @brief the command was rejected by the game client
70 GAME_ERROR_REJECTED,
71
72 /// @brief the parameters of the method that was called are invalid for this operation
73 GAME_ERROR_INVALID_PARAMETERS,
74
75 /// @brief the command failed
76 GAME_ERROR_FAILED,
77
78 /// @brief no game is loaded
79 GAME_ERROR_NOT_LOADED,
80
81 /// @brief game requires restricted resources
82 GAME_ERROR_RESTRICTED,
83} GAME_ERROR;
84//------------------------------------------------------------------------------
85
86//--==----==----==----==----==----==----==----==----==----==----==----==----==--
87/// \defgroup cpp_kodi_addon_game_Defs_AudioStream 1. Audio stream
88/// \ingroup cpp_kodi_addon_game_Defs
89/// @brief **The for Audio stream used data system**
90///
91/// Used to give Addon currently used audio stream configuration on Kodi and
92/// arrays to give related data to Kodi on callbacks.
93///
94//@{
95
96//==============================================================================
97/// @brief **Stream Format**
98///
99/// From Kodi requested specified audio sample format.
100///
101typedef enum GAME_PCM_FORMAT
102{
103 GAME_PCM_FORMAT_UNKNOWN,
104
105 /// @brief S16NE sample format
106 GAME_PCM_FORMAT_S16NE,
107} GAME_PCM_FORMAT;
108//------------------------------------------------------------------------------
109
110//==============================================================================
111/// @brief **Audio channel**
112///
113/// Channel identification flags.
114///
115typedef enum GAME_AUDIO_CHANNEL
116{
117 /// @brief Channel list terminator
118 GAME_CH_NULL,
119
120 /// @brief Channel front left
121 GAME_CH_FL,
122
123 /// @brief Channel front right
124 GAME_CH_FR,
125
126 /// @brief Channel front center
127 GAME_CH_FC,
128
129 /// @brief Channel Low Frequency Effects / Subwoofer
130 GAME_CH_LFE,
131
132 /// @brief Channel back left
133 GAME_CH_BL,
134
135 /// @brief Channel back right
136 GAME_CH_BR,
137
138 /// @brief Channel front left over center
139 GAME_CH_FLOC,
140
141 /// @brief Channel front right over center
142 GAME_CH_FROC,
143
144 /// @brief Channel back center
145 GAME_CH_BC,
146
147 /// @brief Channel surround/side left
148 GAME_CH_SL,
149
150 /// @brief Channel surround/side right
151 GAME_CH_SR,
152
153 /// @brief Channel top front left
154 GAME_CH_TFL,
155
156 /// @brief Channel top front right
157 GAME_CH_TFR,
158
159 /// @brief Channel top front center
160 GAME_CH_TFC,
161
162 /// @brief Channel top center
163 GAME_CH_TC,
164
165 /// @brief Channel top back left
166 GAME_CH_TBL,
167
168 /// @brief Channel top back right
169 GAME_CH_TBR,
170
171 /// @brief Channel top back center
172 GAME_CH_TBC,
173
174 /// @brief Channel bacl left over center
175 GAME_CH_BLOC,
176
177 /// @brief Channel back right over center
178 GAME_CH_BROC,
179} GAME_AUDIO_CHANNEL;
180//------------------------------------------------------------------------------
181
182//==============================================================================
183/// @brief **Game audio stream properties**
184///
185/// Used by Kodi to pass the currently required audio stream settings to the addon
186///
187typedef struct game_stream_audio_properties
188{
189 GAME_PCM_FORMAT format;
190 const GAME_AUDIO_CHANNEL* channel_map;
191} ATTRIBUTE_PACKED game_stream_audio_properties;
192//------------------------------------------------------------------------------
193
194//==============================================================================
195/// @brief **Audio stream packet**
196///
197/// This packet contains audio stream data passed to Kodi.
198///
199typedef struct game_stream_audio_packet
200{
201 /// @brief Pointer for audio stream data given to Kodi
202 const uint8_t *data;
203
204 /// @brief Size of data array
205 size_t size;
206} ATTRIBUTE_PACKED game_stream_audio_packet;
207//------------------------------------------------------------------------------
208
209//@}
210
211//--==----==----==----==----==----==----==----==----==----==----==----==----==--
212/// \defgroup cpp_kodi_addon_game_Defs_VideoStream 2. Video stream
213/// \ingroup cpp_kodi_addon_game_Defs
214/// @brief **The for Video stream used data system**
215///
216/// Used to give Addon currently used video stream configuration on Kodi and
217/// arrays to give related data to Kodi on callbacks.
218///
219//@{
220
221//==============================================================================
222/// @brief **Pixel format**
223///
224/// From Kodi requested specified video RGB color model format.
225///
226typedef enum GAME_PIXEL_FORMAT
227{
228 GAME_PIXEL_FORMAT_UNKNOWN,
229
230 /// @brief 0RGB8888 Format
231 GAME_PIXEL_FORMAT_0RGB8888,
232
233 /// @brief RGB565 Format
234 GAME_PIXEL_FORMAT_RGB565,
235
236 /// @brief 0RGB1555 Format
237 GAME_PIXEL_FORMAT_0RGB1555,
238} GAME_PIXEL_FORMAT;
239//------------------------------------------------------------------------------
240
241//==============================================================================
242/// @brief **Video rotation position**
243///
244/// To define position how video becomes shown.
245///
246typedef enum GAME_VIDEO_ROTATION
247{
248 /// @brief 0° and Without rotation
249 GAME_VIDEO_ROTATION_0,
250
251 /// @brief rotate 90° counterclockwise
252 GAME_VIDEO_ROTATION_90_CCW,
253
254 /// @brief rotate 180° counterclockwise
255 GAME_VIDEO_ROTATION_180_CCW,
256
257 /// @brief rotate 270° counterclockwise
258 GAME_VIDEO_ROTATION_270_CCW,
259} GAME_VIDEO_ROTATION;
260//------------------------------------------------------------------------------
261
262//==============================================================================
263/// @brief **Game video stream properties**
264///
265/// Used by Kodi to pass the currently required video stream settings to the addon
266///
267typedef struct game_stream_video_properties
268{
269 /// @brief The to used pixel format
270 GAME_PIXEL_FORMAT format;
271
272 /// @brief The nominal used width
273 unsigned int nominal_width;
274
275 /// @brief The nominal used height
276 unsigned int nominal_height;
277
278 /// @brief The maximal used width
279 unsigned int max_width;
280
281 /// @brief The maximal used height
282 unsigned int max_height;
283
284 /// @brief On video stream used aspect ration
285 ///
286 /// @note If aspect_ratio is <= 0.0, an aspect ratio of nominal_width / nominal_height is assumed
287 float aspect_ratio;
288} ATTRIBUTE_PACKED game_stream_video_properties;
289//------------------------------------------------------------------------------
290
291//==============================================================================
292/// @brief **Video stream packet**
293///
294/// This packet contains video stream data passed to Kodi.
295///
296typedef struct game_stream_video_packet
297{
298 /// @brief Video height
299 unsigned int width;
300
301 /// @brief Video width
302 unsigned int height;
303
304 /// @brief Width @ref GAME_VIDEO_ROTATION defined rotation angle.
305 GAME_VIDEO_ROTATION rotation;
306
307 /// @brief Pointer for video stream data given to Kodi
308 const uint8_t *data;
309
310 /// @brief Size of data array
311 size_t size;
312} ATTRIBUTE_PACKED game_stream_video_packet;
313//------------------------------------------------------------------------------
314
315//@}
316
317//--==----==----==----==----==----==----==----==----==----==----==----==----==--
318/// \defgroup cpp_kodi_addon_game_Defs_HardwareFramebuffer 3. Hardware framebuffer stream
319/// \ingroup cpp_kodi_addon_game_Defs
320/// @brief **Hardware framebuffer stream data**
321///
322//@{
323
324//==============================================================================
325/// @brief **Hardware framebuffer type**
326///
327typedef enum GAME_HW_CONTEXT_TYPE
328{
329 /// @brief None context
330 GAME_HW_CONTEXT_NONE,
331
332 /// @brief OpenGL 2.x. Driver can choose to use latest compatibility context
333 GAME_HW_CONTEXT_OPENGL,
334
335 /// @brief OpenGL ES 2.0
336 GAME_HW_CONTEXT_OPENGLES2,
337
338 /// @brief Modern desktop core GL context. Use major/minor fields to set GL version
339 GAME_HW_CONTEXT_OPENGL_CORE,
340
341 /// @brief OpenGL ES 3.0
342 GAME_HW_CONTEXT_OPENGLES3,
343
344 /// @brief OpenGL ES 3.1+. Set major/minor fields.
345 GAME_HW_CONTEXT_OPENGLES_VERSION,
346
347 /// @brief Vulkan
348 GAME_HW_CONTEXT_VULKAN
349} GAME_HW_CONTEXT_TYPE;
350//------------------------------------------------------------------------------
351
352//==============================================================================
353/// @brief **Hardware framebuffer properties**
354///
355typedef struct game_stream_hw_framebuffer_properties
356{
357 /// @brief The API to use.
358 ///
359 GAME_HW_CONTEXT_TYPE context_type;
360
361 /// @brief Set if render buffers should have depth component attached.
362 ///
363 /// @todo: Obsolete
364 ///
365 bool depth;
366
367 /// @brief Set if stencil buffers should be attached.
368 ///
369 /// If depth and stencil are true, a packed 24/8 buffer will be added.
370 /// Only attaching stencil is invalid and will be ignored.
371 ///
372 /// @todo: Obsolete.
373 ///
374 bool stencil;
375
376 /// @brief Use conventional bottom-left origin convention.
377 ///
378 /// If false, standard top-left origin semantics are used.
379 ///
380 /// @todo: Move to GL specific interface
381 ///
382 bool bottom_left_origin;
383
384 /// @brief Major version number for core GL context or GLES 3.1+.
385 unsigned int version_major;
386
387 /// @brief Minor version number for core GL context or GLES 3.1+.
388 unsigned int version_minor;
389
390 /// @brief If this is true, the frontend will go very far to avoid resetting context
391 /// in scenarios like toggling fullscreen, etc.
392 ///
393 /// @todo: Obsolete? Maybe frontend should just always assume this...
394 ///
395 /// The reset callback might still be called in extreme situations such as if
396 /// the context is lost beyond recovery.
397 ///
398 /// For optimal stability, set this to false, and allow context to be reset at
399 /// any time.
400 ///
401 bool cache_context;
402
403 /// @brief Creates a debug context.
404 bool debug_context;
405} ATTRIBUTE_PACKED game_stream_hw_framebuffer_properties;
406//------------------------------------------------------------------------------
407
408//==============================================================================
409/// @brief **Hardware framebuffer buffer**
410///
411typedef struct game_stream_hw_framebuffer_buffer
412{
413 /// @brief
414 uintptr_t framebuffer;
415} ATTRIBUTE_PACKED game_stream_hw_framebuffer_buffer;
416//------------------------------------------------------------------------------
417
418//==============================================================================
419/// @brief **Hardware framebuffer packet**
420///
421typedef struct game_stream_hw_framebuffer_packet
422{
423 /// @brief
424 uintptr_t framebuffer;
425} ATTRIBUTE_PACKED game_stream_hw_framebuffer_packet;
426//------------------------------------------------------------------------------
427
428//==============================================================================
429/// @brief **Hardware framebuffer process function address**
430///
431typedef void (*game_proc_address_t)(void);
432//------------------------------------------------------------------------------
433
434//@}
435
436//--==----==----==----==----==----==----==----==----==----==----==----==----==--
437/// \defgroup cpp_kodi_addon_game_Defs_SoftwareFramebuffer 4. Software framebuffer stream
438/// \ingroup cpp_kodi_addon_game_Defs
439/// @brief **Software framebuffer stream data**
440///
441//@{
442
443//==============================================================================
444/// @brief **Game video stream properties**
445///
446/// Used by Kodi to pass the currently required video stream settings to the addon
447///
448typedef game_stream_video_properties game_stream_sw_framebuffer_properties;
449//------------------------------------------------------------------------------
450
451//==============================================================================
452/// @brief **Hardware framebuffer type**
453///
454typedef struct game_stream_sw_framebuffer_buffer
455{
456 GAME_PIXEL_FORMAT format;
457 uint8_t *data;
458 size_t size;
459} ATTRIBUTE_PACKED game_stream_sw_framebuffer_buffer;
460//------------------------------------------------------------------------------
461
462//==============================================================================
463/// @brief **Video stream packet**
464///
465/// This packet contains video stream data passed to Kodi.
466///
467typedef game_stream_video_packet game_stream_sw_framebuffer_packet;
468//------------------------------------------------------------------------------
469
470//@}
471
472//--==----==----==----==----==----==----==----==----==----==----==----==----==--
473/// \defgroup cpp_kodi_addon_game_Defs_StreamTypes 5. Stream types
474/// \ingroup cpp_kodi_addon_game_Defs
475/// @brief **Stream types data**
476///
477//@{
478
479//==============================================================================
480/// @brief **Game stream types**
481///
482typedef enum GAME_STREAM_TYPE
483{
484 /// @brief Unknown
485 GAME_STREAM_UNKNOWN,
486
487 /// @brief Audio stream
488 GAME_STREAM_AUDIO,
489
490 /// @brief Video stream
491 GAME_STREAM_VIDEO,
492
493 /// @brief Hardware framebuffer
494 GAME_STREAM_HW_FRAMEBUFFER,
495
496 /// @brief Software framebuffer
497 GAME_STREAM_SW_FRAMEBUFFER,
498} GAME_STREAM_TYPE;
499//------------------------------------------------------------------------------
500
501//==============================================================================
502/// @brief **Immutable stream metadata**
503///
504/// This metadata is provided when the stream is opened. If any stream
505/// properties change, a new stream must be opened.
506///
507typedef struct game_stream_properties
508{
509 /// @brief
510 GAME_STREAM_TYPE type;
511 union
512 {
513 /// @brief
514 game_stream_audio_properties audio;
515
516 /// @brief
517 game_stream_video_properties video;
518
519 /// @brief
520 game_stream_hw_framebuffer_properties hw_framebuffer;
521
522 /// @brief
523 game_stream_sw_framebuffer_properties sw_framebuffer;
524 };
525} ATTRIBUTE_PACKED game_stream_properties;
526//------------------------------------------------------------------------------
527
528//==============================================================================
529/// @brief **Stream buffers for hardware rendering and zero-copy support**
530///
531typedef struct game_stream_buffer
532{
533 /// @brief
534 GAME_STREAM_TYPE type;
535 union
536 {
537 /// @brief
538 game_stream_hw_framebuffer_buffer hw_framebuffer;
539
540 /// @brief
541 game_stream_sw_framebuffer_buffer sw_framebuffer;
542 };
543} ATTRIBUTE_PACKED game_stream_buffer;
544//------------------------------------------------------------------------------
545
546//==============================================================================
547/// @brief **Stream packet and ephemeral metadata**
548///
549/// This packet contains stream data and accompanying metadata. The metadata
550/// is ephemeral, meaning it only applies to the current packet and can change
551/// from packet to packet in the same stream.
552///
553typedef struct game_stream_packet
554{
555 /// @brief
556 GAME_STREAM_TYPE type;
557 union
558 {
559 /// @brief
560 game_stream_audio_packet audio;
561
562 /// @brief
563 game_stream_video_packet video;
564
565 /// @brief
566 game_stream_hw_framebuffer_packet hw_framebuffer;
567
568 /// @brief
569 game_stream_sw_framebuffer_packet sw_framebuffer;
570 };
571} ATTRIBUTE_PACKED game_stream_packet;
572//------------------------------------------------------------------------------
573
574//@}
575
576//--==----==----==----==----==----==----==----==----==----==----==----==----==--
577/// \defgroup cpp_kodi_addon_game_Defs_GameTypes 6. Game types
578/// \ingroup cpp_kodi_addon_game_Defs
579/// @brief **Game types data**
580///
581//@{
582
583//==============================================================================
584/// @brief **Game reguin definition**
585///
586/// Returned from game_get_region()
587typedef enum GAME_REGION
588{
589 /// @brief Game region unknown
590 GAME_REGION_UNKNOWN,
591
592 /// @brief Game region NTSC
593 GAME_REGION_NTSC,
594
595 /// @brief Game region PAL
596 GAME_REGION_PAL,
597} GAME_REGION;
598//------------------------------------------------------------------------------
599
600//==============================================================================
601/// @brief **Special game types passed into game_load_game_special().**
602///
603/// @remark Only used when multiple ROMs are required.
604///
605typedef enum SPECIAL_GAME_TYPE
606{
607 /// @brief Game Type BSX
608 SPECIAL_GAME_TYPE_BSX,
609
610 /// @brief Game Type BSX slotted
611 SPECIAL_GAME_TYPE_BSX_SLOTTED,
612
613 /// @brief Game Type sufami turbo
614 SPECIAL_GAME_TYPE_SUFAMI_TURBO,
615
616 /// @brief Game Type super game boy
617 SPECIAL_GAME_TYPE_SUPER_GAME_BOY,
618} SPECIAL_GAME_TYPE;
619//------------------------------------------------------------------------------
620
621//==============================================================================
622/// @brief **Game Memory**
623///
624typedef enum GAME_MEMORY
625{
626 /// @brief Passed to game_get_memory_data/size(). If the memory type doesn't apply
627 /// to the implementation NULL/0 can be returned.
628 GAME_MEMORY_MASK = 0xff,
629
630 /// @brief Regular save ram.
631 ///
632 /// This ram is usually found on a game cartridge, backed
633 /// up by a battery. If save game data is too complex for a single memory
634 /// buffer, the SYSTEM_DIRECTORY environment callback can be used.
635 GAME_MEMORY_SAVE_RAM = 0,
636
637 /// @brief Some games have a built-in clock to keep track of time.
638 ///
639 /// This memory is usually just a couple of bytes to keep track of time.
640 GAME_MEMORY_RTC = 1,
641
642 /// @brief System ram lets a frontend peek into a game systems main RAM
643 GAME_MEMORY_SYSTEM_RAM = 2,
644
645 /// @brief Video ram lets a frontend peek into a game systems video RAM (VRAM)
646 GAME_MEMORY_VIDEO_RAM = 3,
647
648 /// @brief Special memory type
649 GAME_MEMORY_SNES_BSX_RAM = ((1 << 8) | GAME_MEMORY_SAVE_RAM),
650
651 /// @brief Special memory type
652 GAME_MEMORY_SNES_BSX_PRAM = ((2 << 8) | GAME_MEMORY_SAVE_RAM),
653
654 /// @brief Special memory type
655 GAME_MEMORY_SNES_SUFAMI_TURBO_A_RAM = ((3 << 8) | GAME_MEMORY_SAVE_RAM),
656
657 /// @brief Special memory type
658 GAME_MEMORY_SNES_SUFAMI_TURBO_B_RAM = ((4 << 8) | GAME_MEMORY_SAVE_RAM),
659
660 /// @brief Special memory type
661 GAME_MEMORY_SNES_GAME_BOY_RAM = ((5 << 8) | GAME_MEMORY_SAVE_RAM),
662
663 /// @brief Special memory type
664 GAME_MEMORY_SNES_GAME_BOY_RTC = ((6 << 8) | GAME_MEMORY_RTC),
665} GAME_MEMORY;
666//------------------------------------------------------------------------------
667
668//==============================================================================
669/// @brief **ID values for SIMD CPU features**
670typedef enum GAME_SIMD
671{
672 /// @brief SIMD CPU SSE
673 GAME_SIMD_SSE = (1 << 0),
674
675 /// @brief SIMD CPU SSE2
676 GAME_SIMD_SSE2 = (1 << 1),
677
678 /// @brief SIMD CPU VMX
679 GAME_SIMD_VMX = (1 << 2),
680
681 /// @brief SIMD CPU VMX128
682 GAME_SIMD_VMX128 = (1 << 3),
683
684 /// @brief SIMD CPU AVX
685 GAME_SIMD_AVX = (1 << 4),
686
687 /// @brief SIMD CPU NEON
688 GAME_SIMD_NEON = (1 << 5),
689
690 /// @brief SIMD CPU SSE3
691 GAME_SIMD_SSE3 = (1 << 6),
692
693 /// @brief SIMD CPU SSSE3
694 GAME_SIMD_SSSE3 = (1 << 7),
695
696 /// @brief SIMD CPU MMX
697 GAME_SIMD_MMX = (1 << 8),
698
699 /// @brief SIMD CPU MMXEXT
700 GAME_SIMD_MMXEXT = (1 << 9),
701
702 /// @brief SIMD CPU SSE4
703 GAME_SIMD_SSE4 = (1 << 10),
704
705 /// @brief SIMD CPU SSE42
706 GAME_SIMD_SSE42 = (1 << 11),
707
708 /// @brief SIMD CPU AVX2
709 GAME_SIMD_AVX2 = (1 << 12),
710
711 /// @brief SIMD CPU VFPU
712 GAME_SIMD_VFPU = (1 << 13),
713} GAME_SIMD;
714//------------------------------------------------------------------------------
715
716//@}
717
718//--==----==----==----==----==----==----==----==----==----==----==----==----==--
719/// \defgroup cpp_kodi_addon_game_Defs_InputTypes 7. Input types
720/// \ingroup cpp_kodi_addon_game_Defs
721/// @brief **Input types**
722///
723//@{
724
725//==============================================================================
726/// @brief
727typedef enum GAME_INPUT_EVENT_SOURCE
728{
729 /// @brief
730 GAME_INPUT_EVENT_DIGITAL_BUTTON,
731
732 /// @brief
733 GAME_INPUT_EVENT_ANALOG_BUTTON,
734
735 /// @brief
736 GAME_INPUT_EVENT_AXIS,
737
738 /// @brief
739 GAME_INPUT_EVENT_ANALOG_STICK,
740
741 /// @brief
742 GAME_INPUT_EVENT_ACCELEROMETER,
743
744 /// @brief
745 GAME_INPUT_EVENT_KEY,
746
747 /// @brief
748 GAME_INPUT_EVENT_RELATIVE_POINTER,
749
750 /// @brief
751 GAME_INPUT_EVENT_ABSOLUTE_POINTER,
752
753 /// @brief
754 GAME_INPUT_EVENT_MOTOR,
755} GAME_INPUT_EVENT_SOURCE;
756//------------------------------------------------------------------------------
757
758//==============================================================================
759/// @brief
760typedef enum GAME_KEY_MOD
761{
762 /// @brief
763 GAME_KEY_MOD_NONE = 0x0000,
764
765 /// @brief
766 GAME_KEY_MOD_SHIFT = 0x0001,
767
768 /// @brief
769 GAME_KEY_MOD_CTRL = 0x0002,
770
771 /// @brief
772 GAME_KEY_MOD_ALT = 0x0004,
773
774 /// @brief
775 GAME_KEY_MOD_META = 0x0008,
776
777 /// @brief
778 GAME_KEY_MOD_SUPER = 0x0010,
779
780 /// @brief
781 GAME_KEY_MOD_NUMLOCK = 0x0100,
782
783 /// @brief
784 GAME_KEY_MOD_CAPSLOCK = 0x0200,
785
786 /// @brief
787 GAME_KEY_MOD_SCROLLOCK = 0x0400,
788} GAME_KEY_MOD;
789//------------------------------------------------------------------------------
790
791//==============================================================================
792/// @brief Type of port on the virtual game console
793typedef enum GAME_PORT_TYPE
794{
795 /// @brief Game port unknown
796 GAME_PORT_UNKNOWN,
797
798 /// @brief Game port Keyboard
799 GAME_PORT_KEYBOARD,
800
801 /// @brief Game port mouse
802 GAME_PORT_MOUSE,
803
804 /// @brief Game port controller
805 GAME_PORT_CONTROLLER,
806} GAME_PORT_TYPE;
807//------------------------------------------------------------------------------
808
809/*! \cond PRIVATE */
810/*!
811 * @brief "C" Game add-on controller layout.
812 *
813 * Structure used to interface in "C" between Kodi and Addon.
814 *
815 * See @ref AddonGameControllerLayout for description of values.
816 */
817typedef struct game_controller_layout
818{
819 char* controller_id;
820 bool provides_input; // False for multitaps
821 char** digital_buttons;
822 unsigned int digital_button_count;
823 char** analog_buttons;
824 unsigned int analog_button_count;
825 char** analog_sticks;
826 unsigned int analog_stick_count;
827 char** accelerometers;
828 unsigned int accelerometer_count;
829 char** keys;
830 unsigned int key_count;
831 char** rel_pointers;
832 unsigned int rel_pointer_count;
833 char** abs_pointers;
834 unsigned int abs_pointer_count;
835 char** motors;
836 unsigned int motor_count;
837} ATTRIBUTE_PACKED game_controller_layout;
838 /*! \endcond */
839
840//==============================================================================
841/// @brief
842struct AddonGameControllerLayout
843{
844 /*! \cond PRIVATE */
845 explicit AddonGameControllerLayout() = default;
846 AddonGameControllerLayout(const game_controller_layout& layout)
847 {
848 controller_id = layout.controller_id;
849 provides_input = layout.provides_input;
850 for (unsigned int i = 0; i < layout.digital_button_count; ++i)
851 digital_buttons.push_back(layout.digital_buttons[i]);
852 for (unsigned int i = 0; i < layout.analog_button_count; ++i)
853 analog_buttons.push_back(layout.analog_buttons[i]);
854 for (unsigned int i = 0; i < layout.analog_stick_count; ++i)
855 analog_sticks.push_back(layout.analog_sticks[i]);
856 for (unsigned int i = 0; i < layout.accelerometer_count; ++i)
857 accelerometers.push_back(layout.accelerometers[i]);
858 for (unsigned int i = 0; i < layout.key_count; ++i)
859 keys.push_back(layout.keys[i]);
860 for (unsigned int i = 0; i < layout.rel_pointer_count; ++i)
861 rel_pointers.push_back(layout.rel_pointers[i]);
862 for (unsigned int i = 0; i < layout.abs_pointer_count; ++i)
863 abs_pointers.push_back(layout.abs_pointers[i]);
864 for (unsigned int i = 0; i < layout.motor_count; ++i)
865 motors.push_back(layout.motors[i]);
866 }
867 /*! \endcond */
868
869 /// @brief
870 std::string controller_id;
871
872 /// @brief False for multitaps
873 bool provides_input;
874
875 /// @brief
876 std::vector<std::string> digital_buttons;
877
878 /// @brief
879 std::vector<std::string> analog_buttons;
880
881 /// @brief
882 std::vector<std::string> analog_sticks;
883
884 /// @brief
885 std::vector<std::string> accelerometers;
886
887 /// @brief
888 std::vector<std::string> keys;
889
890 /// @brief
891 std::vector<std::string> rel_pointers;
892
893 /// @brief
894 std::vector<std::string> abs_pointers;
895
896 /// @brief
897 std::vector<std::string> motors;
898};
899//------------------------------------------------------------------------------
900
901struct game_input_port;
902
903//==============================================================================
904/// @brief Device that can provide input
905typedef struct game_input_device
906{
907 /// @brief ID used in the Kodi controller API
908 const char* controller_id;
909
910 /// @brief
911 const char* port_address;
912
913 /// @brief
914 game_input_port* available_ports;
915
916 /// @brief
917 unsigned int port_count;
918} ATTRIBUTE_PACKED game_input_device;
919//------------------------------------------------------------------------------
920
921//==============================================================================
922/// @brief Port that can provide input
923///
924/// Ports can accept multiple devices and devices can have multiple ports, so
925/// the topology of possible configurations is a tree structure of alternating
926/// port and device nodes.
927///
928typedef struct game_input_port
929{
930 /// @brief
931 GAME_PORT_TYPE type;
932
933 /// @brief Required for GAME_PORT_CONTROLLER type
934 const char* port_id;
935
936 /// @brief
937 game_input_device* accepted_devices;
938
939 /// @brief
940 unsigned int device_count;
941} ATTRIBUTE_PACKED game_input_port;
942//------------------------------------------------------------------------------
943
944//==============================================================================
945/// @brief The input topology is the possible ways to connect input devices
946///
947/// This represents the logical topology, which is the possible connections that
948/// the game client's logic can handle. It is strictly a subset of the physical
949/// topology. Loops are not allowed.
950///
951typedef struct game_input_topology
952{
953 /// @brief The list of ports on the virtual game console
954 game_input_port *ports;
955
956 /// @brief The number of ports
957 unsigned int port_count;
958
959 /// @brief A limit on the number of input-providing devices, or -1 for no limit
960 int player_limit;
961} ATTRIBUTE_PACKED game_input_topology;
962//------------------------------------------------------------------------------
963
964//==============================================================================
965/// @brief
966typedef struct game_digital_button_event
967{
968 /// @brief
969 bool pressed;
970} ATTRIBUTE_PACKED game_digital_button_event;
971//------------------------------------------------------------------------------
972
973//==============================================================================
974/// @brief
975typedef struct game_analog_button_event
976{
977 /// @brief
978 float magnitude;
979} ATTRIBUTE_PACKED game_analog_button_event;
980//------------------------------------------------------------------------------
981
982//==============================================================================
983/// @brief
984typedef struct game_axis_event
985{
986 /// @brief
987 float position;
988} ATTRIBUTE_PACKED game_axis_event;
989//------------------------------------------------------------------------------
990
991//==============================================================================
992/// @brief
993typedef struct game_analog_stick_event
994{
995 /// @brief
996 float x;
997
998 /// @brief
999 float y;
1000} ATTRIBUTE_PACKED game_analog_stick_event;
1001//------------------------------------------------------------------------------
1002
1003//==============================================================================
1004/// @brief
1005typedef struct game_accelerometer_event
1006{
1007 /// @brief
1008 float x;
1009
1010 /// @brief
1011 float y;
1012
1013 /// @brief
1014 float z;
1015} ATTRIBUTE_PACKED game_accelerometer_event;
1016//------------------------------------------------------------------------------
1017
1018//==============================================================================
1019/// @brief
1020typedef struct game_key_event
1021{
1022 /// @brief
1023 bool pressed;
1024
1025 /// @brief If the keypress generates a printing character
1026 ///
1027 /// The unicode value contains the character generated. If the key is a
1028 /// non-printing character, e.g. a function or arrow key, the unicode value
1029 /// is zero.
1030 uint32_t unicode;
1031
1032 /// @brief
1033 GAME_KEY_MOD modifiers;
1034} ATTRIBUTE_PACKED game_key_event;
1035//------------------------------------------------------------------------------
1036
1037//==============================================================================
1038/// @brief
1039typedef struct game_rel_pointer_event
1040{
1041 /// @brief
1042 int x;
1043
1044 /// @brief
1045 int y;
1046} ATTRIBUTE_PACKED game_rel_pointer_event;
1047//------------------------------------------------------------------------------
1048
1049//==============================================================================
1050/// @brief
1051typedef struct game_abs_pointer_event
1052{
1053 /// @brief
1054 bool pressed;
1055
1056 /// @brief
1057 float x;
1058
1059 /// @brief
1060 float y;
1061} ATTRIBUTE_PACKED game_abs_pointer_event;
1062//------------------------------------------------------------------------------
1063
1064//==============================================================================
1065/// @brief
1066typedef struct game_motor_event
1067{
1068 /// @brief
1069 float magnitude;
1070} ATTRIBUTE_PACKED game_motor_event;
1071//------------------------------------------------------------------------------
1072
1073//==============================================================================
1074/// @brief
1075typedef struct game_input_event
1076{
1077 /// @brief
1078 GAME_INPUT_EVENT_SOURCE type;
1079
1080 /// @brief
1081 const char* controller_id;
1082
1083 /// @brief
1084 GAME_PORT_TYPE port_type;
1085
1086 /// @brief
1087 const char* port_address;
1088
1089 /// @brief
1090 const char* feature_name;
1091 union {
1092 /// @brief
1093 struct game_digital_button_event digital_button;
1094
1095 /// @brief
1096 struct game_analog_button_event analog_button;
1097
1098 /// @brief
1099 struct game_axis_event axis;
1100
1101 /// @brief
1102 struct game_analog_stick_event analog_stick;
1103
1104 /// @brief
1105 struct game_accelerometer_event accelerometer;
1106
1107 /// @brief
1108 struct game_key_event key;
1109
1110 /// @brief
1111 struct game_rel_pointer_event rel_pointer;
1112
1113 /// @brief
1114 struct game_abs_pointer_event abs_pointer;
1115
1116 /// @brief
1117 struct game_motor_event motor;
1118 };
1119} ATTRIBUTE_PACKED game_input_event;
1120//------------------------------------------------------------------------------
1121
1122//@}
1123
1124//--==----==----==----==----==----==----==----==----==----==----==----==----==--
1125/// \defgroup cpp_kodi_addon_game_Defs_EnvironmentTypes 8. Environment types
1126/// \ingroup cpp_kodi_addon_game_Defs
1127/// @brief **Environment types**
1128///
1129//@{
1130
1131//==============================================================================
1132/// @brief Game system timing
1133///
1134struct game_system_timing
1135{
1136 /// @brief FPS of video content.
1137 double fps;
1138
1139 /// @brief Sampling rate of audio.
1140 double sample_rate;
1141};
1142//------------------------------------------------------------------------------
1143
1144//@}
1145
1146
1147//--==----==----==----==----==----==----==----==----==----==----==----==----==--
1148
1149/*!
1150 * @brief Game properties
1151 *
1152 * Not to be used outside this header.
1153 */
1154typedef struct AddonProps_Game
1155{
1156 /*!
1157 * The path of the game client being loaded.
1158 */
1159 const char* game_client_dll_path;
1160
1161 /*!
1162 * Paths to proxy DLLs used to load the game client.
1163 */
1164 const char** proxy_dll_paths;
1165
1166 /*!
1167 * Number of proxy DLL paths provided.
1168 */
1169 unsigned int proxy_dll_count;
1170
1171 /*!
1172 * The "system" directories of the frontend. These directories can be used to
1173 * store system-specific ROMs such as BIOSes, configuration data, etc.
1174 */
1175 const char** resource_directories;
1176
1177 /*!
1178 * Number of resource directories provided
1179 */
1180 unsigned int resource_directory_count;
1181
1182 /*!
1183 * The writable directory of the frontend. This directory can be used to store
1184 * SRAM, memory cards, high scores, etc, if the game client cannot use the
1185 * regular memory interface, GetMemoryData().
1186 */
1187 const char* profile_directory;
1188
1189 /*!
1190 * The value of the <supports_vfs> property from addon.xml
1191 */
1192 bool supports_vfs;
1193
1194 /*!
1195 * The extensions in the <extensions> property from addon.xml
1196 */
1197 const char** extensions;
1198
1199 /*!
1200 * Number of extensions provided
1201 */
1202 unsigned int extension_count;
1203} AddonProps_Game;
1204
1205typedef AddonProps_Game game_client_properties;
1206
1207/*! Structure to transfer the methods from kodi_game_dll.h to Kodi */
1208
1209struct AddonInstance_Game;
1210
1211/*!
1212 * @brief Game callbacks
1213 *
1214 * Not to be used outside this header.
1215 */
1216typedef struct AddonToKodiFuncTable_Game
1217{
1218 KODI_HANDLE kodiInstance;
1219
1220 void (*CloseGame)(void* kodiInstance);
1221 void* (*OpenStream)(void*, const game_stream_properties*);
1222 bool (*GetStreamBuffer)(void*, void*, unsigned int, unsigned int, game_stream_buffer*);
1223 void (*AddStreamData)(void*, void*, const game_stream_packet*);
1224 void (*ReleaseStreamBuffer)(void*, void*, game_stream_buffer*);
1225 void (*CloseStream)(void*, void*);
1226 game_proc_address_t (*HwGetProcAddress)(void* kodiInstance, const char* symbol);
1227 bool (*InputEvent)(void* kodiInstance, const game_input_event* event);
1228} AddonToKodiFuncTable_Game;
1229
1230/*!
1231 * @brief Game function hooks
1232 *
1233 * Not to be used outside this header.
1234 */
1235typedef struct KodiToAddonFuncTable_Game
1236{
1237 kodi::addon::CInstanceGame* addonInstance;
1238
1239 GAME_ERROR(__cdecl* LoadGame)(const AddonInstance_Game*, const char*);
1240 GAME_ERROR(__cdecl* LoadGameSpecial)
1241 (const AddonInstance_Game*, SPECIAL_GAME_TYPE, const char**, size_t);
1242 GAME_ERROR(__cdecl* LoadStandalone)(const AddonInstance_Game*);
1243 GAME_ERROR(__cdecl* UnloadGame)(const AddonInstance_Game*);
1244 GAME_ERROR(__cdecl* GetGameTiming)(const AddonInstance_Game*, game_system_timing*);
1245 GAME_REGION(__cdecl* GetRegion)(const AddonInstance_Game*);
1246 bool(__cdecl* RequiresGameLoop)(const AddonInstance_Game*);
1247 GAME_ERROR(__cdecl* RunFrame)(const AddonInstance_Game*);
1248 GAME_ERROR(__cdecl* Reset)(const AddonInstance_Game*);
1249 GAME_ERROR(__cdecl* HwContextReset)(const AddonInstance_Game*);
1250 GAME_ERROR(__cdecl* HwContextDestroy)(const AddonInstance_Game*);
1251 bool(__cdecl* HasFeature)(const AddonInstance_Game*, const char*, const char*);
1252 game_input_topology*(__cdecl* GetTopology)(const AddonInstance_Game*);
1253 void(__cdecl* FreeTopology)(const AddonInstance_Game*, game_input_topology*);
1254 void(__cdecl* SetControllerLayouts)(const AddonInstance_Game*,
1255 const game_controller_layout*,
1256 unsigned int);
1257 bool(__cdecl* EnableKeyboard)(const AddonInstance_Game*, bool, const char*);
1258 bool(__cdecl* EnableMouse)(const AddonInstance_Game*, bool, const char*);
1259 bool(__cdecl* ConnectController)(const AddonInstance_Game*, bool, const char*, const char*);
1260 bool(__cdecl* InputEvent)(const AddonInstance_Game*, const game_input_event*);
1261 size_t(__cdecl* SerializeSize)(const AddonInstance_Game*);
1262 GAME_ERROR(__cdecl* Serialize)(const AddonInstance_Game*, uint8_t*, size_t);
1263 GAME_ERROR(__cdecl* Deserialize)(const AddonInstance_Game*, const uint8_t*, size_t);
1264 GAME_ERROR(__cdecl* CheatReset)(const AddonInstance_Game*);
1265 GAME_ERROR(__cdecl* GetMemory)(const AddonInstance_Game*, GAME_MEMORY, uint8_t**, size_t*);
1266 GAME_ERROR(__cdecl* SetCheat)(const AddonInstance_Game*, unsigned int, bool, const char*);
1267} KodiToAddonFuncTable_Game;
1268
1269/*!
1270 * @brief Game instance
1271 *
1272 * Not to be used outside this header.
1273 */
1274typedef struct AddonInstance_Game
1275{
1276 AddonProps_Game props;
1277 AddonToKodiFuncTable_Game toKodi;
1278 KodiToAddonFuncTable_Game toAddon;
1279} AddonInstance_Game;
1280
1281} /* extern "C" */
1282
1283namespace kodi
1284{
1285namespace addon
1286{
1287
1288//==============================================================================
1289///
1290/// \addtogroup cpp_kodi_addon_game
1291/// @brief \cpp_class{ kodi::addon::CInstanceGame }
1292/// **Game add-on instance**
1293///
1294/// This class is created at addon by Kodi.
1295///
1296//------------------------------------------------------------------------------
1297class ATTRIBUTE_HIDDEN CInstanceGame : public IAddonInstance
1298{
1299public:
1300 //============================================================================
1301 ///
1302 /// @defgroup cpp_kodi_addon_game_Base 1. Basic functions
1303 /// @ingroup cpp_kodi_addon_game
1304 /// @brief **Functions to manage the addon and get basic information about it**
1305 ///
1306 ///
1307 //@{
1308
1309 //============================================================================
1310 ///
1311 /// @brief Game class constructor
1312 ///
1313 /// Used by an add-on that only supports only Game and only in one instance.
1314 ///
1315 /// This class is created at addon by Kodi.
1316 ///
1317 ///
1318 /// --------------------------------------------------------------------------
1319 ///
1320 ///
1321 /// **Here's example about the use of this:**
1322 /// ~~~~~~~~~~~~~{.cpp}
1323 /// #include <kodi/addon-instance/Game.h>
1324 /// ...
1325 ///
1326 /// class ATTRIBUTE_HIDDEN CGameExample
1327 /// : public kodi::addon::CAddonBase,
1328 /// public kodi::addon::CInstanceGame
1329 /// {
1330 /// public:
1331 /// CGameExample()
1332 /// {
1333 /// }
1334 ///
1335 /// virtual ~CGameExample();
1336 /// {
1337 /// }
1338 ///
1339 /// ...
1340 /// };
1341 ///
1342 /// ADDONCREATOR(CGameExample)
1343 /// ~~~~~~~~~~~~~
1344 ///
1345 CInstanceGame() : IAddonInstance(ADDON_INSTANCE_GAME, GetKodiTypeVersion(ADDON_INSTANCE_GAME))
1346 {
1347 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
1348 throw std::logic_error("kodi::addon::CInstanceGame: Creation of more as one in single "
1349 "instance way is not allowed!");
1350
1351 SetAddonStruct(CAddonBase::m_interface->firstKodiInstance);
1352 CAddonBase::m_interface->globalSingleInstance = this;
1353 }
1354 //----------------------------------------------------------------------------
1355
1356 //============================================================================
1357 ///
1358 /// @brief Destructor
1359 ///
1360 ~CInstanceGame() override = default;
1361 //----------------------------------------------------------------------------
1362
1363 //============================================================================
1364 ///
1365 /// @brief **Callback to Kodi Function**<br>The path of the game client being loaded.
1366 ///
1367 /// @return the used game client Dll path
1368 ///
1369 /// @remarks Only called from addon itself
1370 ///
1371 std::string GameClientDllPath() const
1372 {
1373 return m_instanceData->props.game_client_dll_path;
1374 }
1375 //----------------------------------------------------------------------------
1376
1377 //============================================================================
1378 ///
1379 /// @brief **Callback to Kodi Function**<br>Paths to proxy DLLs used to load the game client.
1380 ///
1381 /// @param[out] paths vector list to store available dll paths
1382 /// @return true if success and dll paths present
1383 ///
1384 /// @remarks Only called from addon itself
1385 ///
1386 bool ProxyDllPaths(std::vector<std::string>& paths)
1387 {
1388 for (unsigned int i = 0; i < m_instanceData->props.proxy_dll_count; ++i)
1389 {
1390 if (m_instanceData->props.proxy_dll_paths[i] != nullptr)
1391 paths.push_back(m_instanceData->props.proxy_dll_paths[i]);
1392 }
1393 return !paths.empty();
1394 }
1395 //----------------------------------------------------------------------------
1396
1397 //============================================================================
1398 ///
1399 /// @brief **Callback to Kodi Function**<br>The "system" directories of the frontend
1400 ///
1401 /// These directories can be used to store system-specific ROMs such as
1402 /// BIOSes, configuration data, etc.
1403 ///
1404 /// @return the used resource directory
1405 ///
1406 /// @remarks Only called from addon itself
1407 ///
1408 bool ResourceDirectories(std::vector<std::string>& dirs)
1409 {
1410 for (unsigned int i = 0; i < m_instanceData->props.resource_directory_count; ++i)
1411 {
1412 if (m_instanceData->props.resource_directories[i] != nullptr)
1413 dirs.push_back(m_instanceData->props.resource_directories[i]);
1414 }
1415 return !dirs.empty();
1416 }
1417 //----------------------------------------------------------------------------
1418
1419 //============================================================================
1420 ///
1421 /// @brief **Callback to Kodi Function**<br>The writable directory of the frontend
1422 ///
1423 /// This directory can be used to store SRAM, memory cards, high scores,
1424 /// etc, if the game client cannot use the regular memory interface,
1425 /// GetMemoryData().
1426 ///
1427 /// @return the used profile directory
1428 ///
1429 /// @remarks Only called from addon itself
1430 ///
1431 std::string ProfileDirectory() const
1432 {
1433 return m_instanceData->props.profile_directory;
1434 }
1435 //----------------------------------------------------------------------------
1436
1437 //============================================================================
1438 ///
1439 /// @brief **Callback to Kodi Function**<br>The value of the <supports_vfs> property from addon.xml
1440 ///
1441 /// @return true if VFS is supported
1442 ///
1443 /// @remarks Only called from addon itself
1444 ///
1445 bool SupportsVFS() const
1446 {
1447 return m_instanceData->props.supports_vfs;
1448 }
1449 //----------------------------------------------------------------------------
1450
1451 //============================================================================
1452 ///
1453 /// @brief **Callback to Kodi Function**<br>The extensions in the <extensions> property from addon.xml
1454 ///
1455 /// @param[out] extensions vector list to store available extension
1456 /// @return true if success and extensions present
1457 ///
1458 /// @remarks Only called from addon itself
1459 ///
1460 bool Extensions(std::vector<std::string>& extensions)
1461 {
1462 for (unsigned int i = 0; i < m_instanceData->props.extension_count; ++i)
1463 {
1464 if (m_instanceData->props.extensions[i] != nullptr)
1465 extensions.push_back(m_instanceData->props.extensions[i]);
1466 }
1467 return !extensions.empty();
1468 }
1469 //----------------------------------------------------------------------------
1470
1471 //@}
1472
1473//--==----==----==----==----==----==----==----==----==----==----==----==----==--
1474
1475 //============================================================================
1476 ///
1477 /// @defgroup cpp_kodi_addon_game_Operation 2. Game operations
1478 /// @ingroup cpp_kodi_addon_game
1479 /// @brief **Game operations**
1480 ///
1481 /// These are mandatory functions for using this addon to get the available
1482 /// channels.
1483 ///
1484 //@{
1485
1486 //============================================================================
1487 ///
1488 /// @brief Load a game
1489 ///
1490 /// @param[in] url The URL to load
1491 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded
1492 ///
1493 virtual GAME_ERROR LoadGame(const std::string& url)
1494 {
1495 return GAME_ERROR_NOT_IMPLEMENTED;
1496 }
1497 //----------------------------------------------------------------------------
1498
1499 //============================================================================
1500 ///
1501 /// @brief Load a game that requires multiple files
1502 ///
1503 /// @param[in] type The game type
1504 /// @param[in] urls An array of urls
1505 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded
1506 ///
1507 virtual GAME_ERROR LoadGameSpecial(SPECIAL_GAME_TYPE type, const std::vector<std::string>& urls)
1508 {
1509 return GAME_ERROR_NOT_IMPLEMENTED;
1510 }
1511 //----------------------------------------------------------------------------
1512
1513 //============================================================================
1514 ///
1515 /// @brief Begin playing without a game file
1516 ///
1517 /// If the add-on supports standalone mode, it must add the <supports_standalone>
1518 /// tag to the extension point in addon.xml:
1519 ///
1520 /// <supports_no_game>false</supports_no_game>
1521 ///
1522 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game add-on was loaded
1523 ///
1524 virtual GAME_ERROR LoadStandalone()
1525 {
1526 return GAME_ERROR_NOT_IMPLEMENTED;
1527 }
1528 //----------------------------------------------------------------------------
1529
1530 //============================================================================
1531 ///
1532 /// @brief Unload the current game
1533 ///
1534 /// Unloads a currently loaded game
1535 ///
1536 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was unloaded
1537 ///
1538 virtual GAME_ERROR UnloadGame()
1539 {
1540 return GAME_ERROR_NOT_IMPLEMENTED;
1541 }
1542 //----------------------------------------------------------------------------
1543
1544 //============================================================================
1545 ///
1546 /// @brief Get timing information about the loaded game
1547 ///
1548 /// @param[out] timing_info The info structure to fill
1549 ///
1550 /// @return the error, or @ref GAME_ERROR_NO_ERROR if info was filled
1551 ///
1552 virtual GAME_ERROR GetGameTiming(game_system_timing& timing_info)
1553 {
1554 return GAME_ERROR_NOT_IMPLEMENTED;
1555 }
1556 //----------------------------------------------------------------------------
1557
1558 //============================================================================
1559 ///
1560 /// @brief Get region of the loaded game
1561 ///
1562 /// @return the region, or @ref GAME_REGION_UNKNOWN if unknown or no game is loaded
1563 ///
1564 virtual GAME_REGION GetRegion()
1565 {
1566 return GAME_REGION_UNKNOWN;
1567 }
1568 //----------------------------------------------------------------------------
1569
1570 //============================================================================
1571 ///
1572 /// @brief Return true if the client requires the frontend to provide a game loop
1573 ///
1574 /// The game loop is a thread that calls RunFrame() in a loop at a rate
1575 /// determined by the playback speed and the client's FPS.
1576 ///
1577 /// @return true if the frontend should provide a game loop, false otherwise
1578 ///
1579 virtual bool RequiresGameLoop()
1580 {
1581 return false;
1582 }
1583 //----------------------------------------------------------------------------
1584
1585 //============================================================================
1586 ///
1587 /// @brief Run a single frame for add-ons that use a game loop
1588 ///
1589 /// @return the error, or @ref GAME_ERROR_NO_ERROR if there was no error
1590 ///
1591 virtual GAME_ERROR RunFrame()
1592 {
1593 return GAME_ERROR_NOT_IMPLEMENTED;
1594 }
1595 //----------------------------------------------------------------------------
1596
1597 //============================================================================
1598 ///
1599 /// @brief Reset the current game
1600 ///
1601 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was reset
1602 ///
1603 virtual GAME_ERROR Reset()
1604 {
1605 return GAME_ERROR_NOT_IMPLEMENTED;
1606 }
1607 //----------------------------------------------------------------------------
1608
1609 //==========================================================================
1610 ///
1611 /// @brief **Callback to Kodi Function**<br>Requests the frontend to stop the current game
1612 ///
1613 /// @remarks Only called from addon itself
1614 ///
1615 void CloseGame(void) { m_instanceData->toKodi.CloseGame(m_instanceData->toKodi.kodiInstance); }
1616 //----------------------------------------------------------------------------
1617
1618 //============================================================================
1619 ///
1620 /// @defgroup cpp_kodi_addon_game_Operation_CStream Class: CStream
1621 /// @ingroup cpp_kodi_addon_game_Operation
1622 /// @brief \cpp_class{ kodi::addon::CInstanceGame::CStream }
1623 /// **Game stream handler**
1624 ///
1625 /// This class will be integrated into the addon, which can then open it if
1626 /// necessary for the processing of an audio or video stream.
1627 ///
1628 ///
1629 /// @note Callback to Kodi class
1630 //@{
1631 class CStream
1632 {
1633 public:
1634 CStream() = default;
1635
1636 CStream(const game_stream_properties& properties)
1637 {
1638 Open(properties);
1639 }
1640
1641 ~CStream()
1642 {
1643 Close();
1644 }
1645
1646 //==========================================================================
1647 ///
1648 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1649 /// @brief Create a stream for gameplay data
1650 ///
1651 /// @param[in] properties The stream properties
1652 /// @return A stream handle, or `nullptr` on failure
1653 ///
1654 /// @remarks Only called from addon itself
1655 ///
1656 bool Open(const game_stream_properties& properties)
1657 {
1658 if (!CAddonBase::m_interface->globalSingleInstance)
1659 return false;
1660
1661 if (m_handle)
1662 {
1663 kodi::Log(ADDON_LOG_INFO, "kodi::addon::CInstanceGame::CStream already becomes reopened");
1664 Close();
1665 }
1666
1667 AddonToKodiFuncTable_Game& cb =
1668 static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance)
1669 ->m_instanceData->toKodi;
1670 m_handle = cb.OpenStream(cb.kodiInstance, &properties);
1671 return m_handle != nullptr;
1672 }
1673 //--------------------------------------------------------------------------
1674
1675 //==========================================================================
1676 ///
1677 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1678 /// @brief Free the specified stream
1679 ///
1680 /// @remarks Only called from addon itself
1681 ///
1682 void Close()
1683 {
1684 if (!m_handle || !CAddonBase::m_interface->globalSingleInstance)
1685 return;
1686
1687 AddonToKodiFuncTable_Game& cb =
1688 static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance)
1689 ->m_instanceData->toKodi;
1690 cb.CloseStream(cb.kodiInstance, m_handle);
1691 m_handle = nullptr;
1692 }
1693 //--------------------------------------------------------------------------
1694
1695 //==========================================================================
1696 ///
1697 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1698 /// @brief Get a buffer for zero-copy stream data
1699 ///
1700 /// @param[in] width The framebuffer width, or 0 for no width specified
1701 /// @param[in] height The framebuffer height, or 0 for no height specified
1702 /// @param[out] buffer The buffer, or unmodified if false is returned
1703 /// @return True if buffer was set, false otherwise
1704 ///
1705 /// @note If this returns true, buffer must be freed using \ref ReleaseBuffer().
1706 ///
1707 /// @remarks Only called from addon itself
1708 ///
1709 bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer& buffer)
1710 {
1711 if (!m_handle || !CAddonBase::m_interface->globalSingleInstance)
1712 return false;
1713
1714 AddonToKodiFuncTable_Game& cb =
1715 static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance)
1716 ->m_instanceData->toKodi;
1717 return cb.GetStreamBuffer(cb.kodiInstance, m_handle, width, height, &buffer);
1718 }
1719 //--------------------------------------------------------------------------
1720
1721 //==========================================================================
1722 ///
1723 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1724 /// @brief Add a data packet to a stream
1725 ///
1726 /// @param[in] packet The data packet
1727 ///
1728 /// @remarks Only called from addon itself
1729 ///
1730 void AddData(const game_stream_packet& packet)
1731 {
1732 if (!m_handle || !CAddonBase::m_interface->globalSingleInstance)
1733 return;
1734
1735 AddonToKodiFuncTable_Game& cb =
1736 static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance)
1737 ->m_instanceData->toKodi;
1738 cb.AddStreamData(cb.kodiInstance, m_handle, &packet);
1739 }
1740 //--------------------------------------------------------------------------
1741
1742 //==========================================================================
1743 ///
1744 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1745 /// @brief Free an allocated buffer
1746 ///
1747 /// @param[in] buffer The buffer returned from GetStreamBuffer()
1748 ///
1749 /// @remarks Only called from addon itself
1750 ///
1751 void ReleaseBuffer(game_stream_buffer& buffer)
1752 {
1753 if (!m_handle || !CAddonBase::m_interface->globalSingleInstance)
1754 return;
1755
1756 AddonToKodiFuncTable_Game& cb =
1757 static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance)
1758 ->m_instanceData->toKodi;
1759 cb.ReleaseStreamBuffer(cb.kodiInstance, m_handle, &buffer);
1760 }
1761 //--------------------------------------------------------------------------
1762
1763 //==========================================================================
1764 ///
1765 /// @ingroup cpp_kodi_addon_game_Operation_CStream
1766 /// @brief To check stream open was OK, e.g. after use of constructor
1767 ///
1768 /// @return true if stream was successfully opened
1769 ///
1770 /// @remarks Only called from addon itself
1771 ///
1772 bool IsOpen() const { return m_handle != nullptr; }
1773 //--------------------------------------------------------------------------
1774
1775 private:
1776 void* m_handle = nullptr;
1777 };
1778 //@}
1779
1780 //@}
1781
1782//--==----==----==----==----==----==----==----==----==----==----==----==----==--
1783
1784 //============================================================================
1785 ///
1786 /// @defgroup cpp_kodi_addon_game_HardwareRendering 3. Hardware rendering operations
1787 /// @ingroup cpp_kodi_addon_game
1788 /// @brief **Hardware rendering operations**
1789 ///
1790 //@{
1791
1792 //============================================================================
1793 ///
1794 /// @brief Invalidates the current HW context and reinitializes GPU resources
1795 ///
1796 /// Any GL state is lost, and must not be deinitialized explicitly.
1797 ///
1798 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was reset
1799 ///
1800 virtual GAME_ERROR HwContextReset()
1801 {
1802 return GAME_ERROR_NOT_IMPLEMENTED;
1803 }
1804 //----------------------------------------------------------------------------
1805
1806 //============================================================================
1807 ///
1808 /// @brief Called before the context is destroyed
1809 ///
1810 /// Resources can be deinitialized at this step.
1811 ///
1812 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was destroyed
1813 ///
1814 virtual GAME_ERROR HwContextDestroy()
1815 {
1816 return GAME_ERROR_NOT_IMPLEMENTED;
1817 }
1818
1819 //============================================================================
1820 ///
1821 /// @brief **Callback to Kodi Function**<br>Get a symbol from the hardware context
1822 ///
1823 /// @param[in] sym The symbol's name
1824 ///
1825 /// @return A function pointer for the specified symbol
1826 ///
1827 /// @remarks Only called from addon itself
1828 ///
1829 game_proc_address_t HwGetProcAddress(const char* sym)
1830 {
1831 return m_instanceData->toKodi.HwGetProcAddress(m_instanceData->toKodi.kodiInstance, sym);
1832 }
1833 //----------------------------------------------------------------------------
1834
1835 //@}
1836
1837//--==----==----==----==----==----==----==----==----==----==----==----==----==--
1838
1839 //============================================================================
1840 ///
1841 /// @defgroup cpp_kodi_addon_game_InputOperations 4. Input operations
1842 /// @ingroup cpp_kodi_addon_game
1843 /// @brief **Input operations**
1844 ///
1845 //@{
1846
1847 //============================================================================
1848 ///
1849 /// @brief Check if input is accepted for a feature on the controller
1850 ///
1851 /// If only a subset of the controller profile is used, this can return false
1852 /// for unsupported features to not absorb their input.
1853 ///
1854 /// If the entire controller profile is used, this should always return true.
1855 ///
1856 /// @param[in] controller_id The ID of the controller profile
1857 /// @param[in] feature_name The name of a feature in that profile
1858 /// @return true if input is accepted for the feature, false otherwise
1859 ///
1860 virtual bool HasFeature(const std::string& controller_id, const std::string& feature_name)
1861 {
1862 return false;
1863 }
1864 //----------------------------------------------------------------------------
1865
1866 //============================================================================
1867 ///
1868 /// @brief Get the input topology that specifies which controllers can be connected
1869 ///
1870 /// @return The input topology, or null to use the default
1871 ///
1872 /// If this returns non-null, topology must be freed using FreeTopology().
1873 ///
1874 /// If this returns null, the topology will default to a single port that can
1875 /// accept all controllers imported by addon.xml. The port ID is set to
1876 /// the @ref DEFAULT_PORT_ID constant.
1877 ///
1878 virtual game_input_topology* GetTopology()
1879 {
1880 return nullptr;
1881 }
1882 //----------------------------------------------------------------------------
1883
1884 //============================================================================
1885 ///
1886 /// @brief Free the topology's resources
1887 ///
1888 /// @param[in] topology The topology returned by GetTopology()
1889 ///
1890 virtual void FreeTopology(game_input_topology* topology)
1891 {
1892 }
1893 //----------------------------------------------------------------------------
1894
1895 //============================================================================
1896 ///
1897 /// @brief Set the layouts for known controllers
1898 ///
1899 /// @param[in] controllers The controller layouts
1900 ///
1901 /// After loading the input topology, the frontend will call this with
1902 /// controller layouts for all controllers discovered in the topology.
1903 ///
1904 virtual void SetControllerLayouts(const std::vector<AddonGameControllerLayout>& controllers)
1905 {
1906 }
1907 //----------------------------------------------------------------------------
1908
1909 //============================================================================
1910 ///
1911 /// @brief Enable/disable keyboard input using the specified controller
1912 ///
1913 /// @param[in] enable True to enable input, false otherwise
1914 /// @param[in] controller_id The controller ID if enabling, or unused if disabling
1915 ///
1916 /// @return True if keyboard input was enabled, false otherwise
1917 ///
1918 virtual bool EnableKeyboard(bool enable, const std::string& controller_id)
1919 {
1920 return false;
1921 }
1922 //----------------------------------------------------------------------------
1923
1924 //============================================================================
1925 ///
1926 /// @brief Enable/disable mouse input using the specified controller
1927 ///
1928 /// @param[in] enable True to enable input, false otherwise
1929 /// @param[in] controller_id The controller ID if enabling, or unused if disabling
1930 ///
1931 /// @return True if mouse input was enabled, false otherwise
1932 ///
1933 virtual bool EnableMouse(bool enable, const std::string& controller_id)
1934 {
1935 return false;
1936 }
1937 //--------------------------------------------------------------------------
1938
1939 //==========================================================================
1940 ///
1941 /// @brief Connect/disconnect a controller to a port on the virtual game console
1942 ///
1943 /// @param[in] connect True to connect a controller, false to disconnect
1944 /// @param[in] port_address The address of the port
1945 /// @param[in] controller_id The controller ID if connecting, or unused if disconnecting
1946 /// @return True if the \p controller was (dis-)connected to the port, false otherwise
1947 ///
1948 /// The address is a string that allows traversal of the controller topology.
1949 /// It is formed by alternating port IDs and controller IDs separated by "/".
1950 ///
1951 /// For example, assume that the topology represented in XML for Snes9x is:
1952 ///
1953 /// ~~~~~~~~~~~~~{.xml}
1954 /// <logicaltopology>
1955 /// <port type="controller" id="1">
1956 /// <accepts controller="game.controller.snes"/>
1957 /// <accepts controller="game.controller.snes.multitap">
1958 /// <port type="controller" id="1">
1959 /// <accepts controller="game.controller.snes"/>
1960 /// </port>
1961 /// <port type="controller" id="2">
1962 /// <accepts controller="game.controller.snes"/>
1963 /// </port>
1964 /// ...
1965 /// </accepts>
1966 /// </port>
1967 /// </logicaltopology>
1968 /// ~~~~~~~~~~~~~
1969 ///
1970 /// To connect a multitap to the console's first port, the multitap's controller
1971 /// info is set using the port address:
1972 ///
1973 /// 1
1974 ///
1975 /// To connect a SNES controller to the second port of the multitap, the
1976 /// controller info is next set using the address:
1977 ///
1978 /// 1/game.controller.multitap/2
1979 ///
1980 /// Any attempts to connect a controller to a port on a disconnected multitap
1981 /// will return false.
1982 ///
1983 virtual bool ConnectController(bool connect,
1984 const std::string& port_address,
1985 const std::string& controller_id)
1986 {
1987 return false;
1988 }
1989 //----------------------------------------------------------------------------
1990
1991 //============================================================================
1992 ///
1993 /// @brief Notify the add-on of an input event
1994 ///
1995 /// @param[in] event The input event
1996 ///
1997 /// @return true if the event was handled, false otherwise
1998 ///
1999 virtual bool InputEvent(const game_input_event& event)
2000 {
2001 return false;
2002 }
2003 //----------------------------------------------------------------------------
2004
2005 //============================================================================
2006 ///
2007 /// @brief **Callback to Kodi Function**<br>Notify the port of an input event
2008 ///
2009 /// @param[in] event The input event
2010 /// @return true if the event was handled, false otherwise
2011 ///
2012 /// @note Input events can arrive for the following sources:
2013 /// - \ref GAME_INPUT_EVENT_MOTOR
2014 ///
2015 /// @remarks Only called from addon itself
2016 ///
2017 bool KodiInputEvent(const game_input_event& event)
2018 {
2019 return m_instanceData->toKodi.InputEvent(m_instanceData->toKodi.kodiInstance, &event);
2020 }
2021 //----------------------------------------------------------------------------
2022
2023 //@}
2024
2025//--==----==----==----==----==----==----==----==----==----==----==----==----==--
2026
2027 //============================================================================
2028 ///
2029 /// @defgroup cpp_kodi_addon_game_SerializationOperations 5. Serialization operations
2030 /// @ingroup cpp_kodi_addon_game
2031 /// @brief **Serialization operations**
2032 ///
2033 //@{
2034
2035 //============================================================================
2036 ///
2037 /// @brief Get the number of bytes required to serialize the game
2038 ///
2039 /// @return the number of bytes, or 0 if serialization is not supported
2040 ///
2041 virtual size_t SerializeSize()
2042 {
2043 return 0;
2044 }
2045 //----------------------------------------------------------------------------
2046
2047 //============================================================================
2048 ///
2049 /// @brief Serialize the state of the game
2050 ///
2051 /// @param[in] data The buffer receiving the serialized game data
2052 /// @param[in] size The size of the buffer
2053 ///
2054 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was serialized into the buffer
2055 ///
2056 virtual GAME_ERROR Serialize(uint8_t* data, size_t size)
2057 {
2058 return GAME_ERROR_NOT_IMPLEMENTED;
2059 }
2060 //----------------------------------------------------------------------------
2061
2062 //============================================================================
2063 ///
2064 /// @brief Deserialize the game from the given state
2065 ///
2066 /// @param[in] data A buffer containing the game's new state
2067 /// @param[in] size The size of the buffer
2068 ///
2069 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game deserialized
2070 ///
2071 virtual GAME_ERROR Deserialize(const uint8_t* data, size_t size)
2072 {
2073 return GAME_ERROR_NOT_IMPLEMENTED;
2074 }
2075 //----------------------------------------------------------------------------
2076
2077 //@}
2078
2079//--==----==----==----==----==----==----==----==----==----==----==----==----==--
2080
2081 //============================================================================
2082 ///
2083 /// @defgroup cpp_kodi_addon_game_CheatOperations 6. Cheat operations
2084 /// @ingroup cpp_kodi_addon_game
2085 /// @brief **Cheat operations**
2086 ///
2087 //@{
2088
2089 //============================================================================
2090 ///
2091 /// @brief Reset the cheat system
2092 ///
2093 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat system was reset
2094 ///
2095 virtual GAME_ERROR CheatReset()
2096 {
2097 return GAME_ERROR_NOT_IMPLEMENTED;
2098 }
2099 //----------------------------------------------------------------------------
2100
2101 //============================================================================
2102 ///
2103 /// @brief Get a region of memory
2104 ///
2105 /// @param[in] type The type of memory to retrieve
2106 /// @param[in] data Set to the region of memory; must remain valid until UnloadGame() is called
2107 /// @param[in] size Set to the size of the region of memory
2108 ///
2109 /// @return the error, or @ref GAME_ERROR_NO_ERROR if data was set to a valid buffer
2110 ///
2111 virtual GAME_ERROR GetMemory(GAME_MEMORY type, uint8_t*& data, size_t& size)
2112 {
2113 return GAME_ERROR_NOT_IMPLEMENTED;
2114 }
2115 //----------------------------------------------------------------------------
2116
2117 //============================================================================
2118 ///
2119 /// @brief Set a cheat code
2120 ///
2121 /// @param[in] index
2122 /// @param[in] enabled
2123 /// @param[in] code
2124 ///
2125 /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat was set
2126 ///
2127 virtual GAME_ERROR SetCheat(unsigned int index, bool enabled, const std::string& code)
2128 {
2129 return GAME_ERROR_NOT_IMPLEMENTED;
2130 }
2131 //----------------------------------------------------------------------------
2132
2133 //@}
2134
2135private:
2136 void SetAddonStruct(KODI_HANDLE instance)
2137 {
2138 if (instance == nullptr)
2139 throw std::logic_error("kodi::addon::CInstanceGame: Creation with empty addon structure not"
2140 "allowed, table must be given from Kodi!");
2141
2142 m_instanceData = static_cast<AddonInstance_Game*>(instance);
2143 m_instanceData->toAddon.addonInstance = this;
2144
2145 m_instanceData->toAddon.LoadGame = ADDON_LoadGame;
2146 m_instanceData->toAddon.LoadGameSpecial = ADDON_LoadGameSpecial;
2147 m_instanceData->toAddon.LoadStandalone = ADDON_LoadStandalone;
2148 m_instanceData->toAddon.UnloadGame = ADDON_UnloadGame;
2149 m_instanceData->toAddon.GetGameTiming = ADDON_GetGameTiming;
2150 m_instanceData->toAddon.GetRegion = ADDON_GetRegion;
2151 m_instanceData->toAddon.RequiresGameLoop = ADDON_RequiresGameLoop;
2152 m_instanceData->toAddon.RunFrame = ADDON_RunFrame;
2153 m_instanceData->toAddon.Reset = ADDON_Reset;
2154
2155 m_instanceData->toAddon.HwContextReset = ADDON_HwContextReset;
2156 m_instanceData->toAddon.HwContextDestroy = ADDON_HwContextDestroy;
2157
2158 m_instanceData->toAddon.HasFeature = ADDON_HasFeature;
2159 m_instanceData->toAddon.GetTopology = ADDON_GetTopology;
2160 m_instanceData->toAddon.FreeTopology = ADDON_FreeTopology;
2161 m_instanceData->toAddon.SetControllerLayouts = ADDON_SetControllerLayouts;
2162 m_instanceData->toAddon.EnableKeyboard = ADDON_EnableKeyboard;
2163 m_instanceData->toAddon.EnableMouse = ADDON_EnableMouse;
2164 m_instanceData->toAddon.ConnectController = ADDON_ConnectController;
2165 m_instanceData->toAddon.InputEvent = ADDON_InputEvent;
2166
2167 m_instanceData->toAddon.SerializeSize = ADDON_SerializeSize;
2168 m_instanceData->toAddon.Serialize = ADDON_Serialize;
2169 m_instanceData->toAddon.Deserialize = ADDON_Deserialize;
2170
2171 m_instanceData->toAddon.CheatReset = ADDON_CheatReset;
2172 m_instanceData->toAddon.GetMemory = ADDON_GetMemory;
2173 m_instanceData->toAddon.SetCheat = ADDON_SetCheat;
2174 }
2175
2176 // --- Game operations ---------------------------------------------------------
2177
2178 inline static GAME_ERROR ADDON_LoadGame(const AddonInstance_Game* instance, const char* url)
2179 {
2180 return instance->toAddon.addonInstance->LoadGame(url);
2181 }
2182
2183 inline static GAME_ERROR ADDON_LoadGameSpecial(const AddonInstance_Game* instance,
2184 SPECIAL_GAME_TYPE type,
2185 const char** urls,
2186 size_t urlCount)
2187 {
2188 std::vector<std::string> urlList;
2189 for (size_t i = 0; i < urlCount; ++i)
2190 {
2191 if (urls[i] != nullptr)
2192 urlList.push_back(urls[i]);
2193 }
2194
2195 return instance->toAddon.addonInstance->LoadGameSpecial(type, urlList);
2196 }
2197
2198 inline static GAME_ERROR ADDON_LoadStandalone(const AddonInstance_Game* instance)
2199 {
2200 return instance->toAddon.addonInstance->LoadStandalone();
2201 }
2202
2203 inline static GAME_ERROR ADDON_UnloadGame(const AddonInstance_Game* instance)
2204 {
2205 return instance->toAddon.addonInstance->UnloadGame();
2206 }
2207
2208 inline static GAME_ERROR ADDON_GetGameTiming(const AddonInstance_Game* instance,
2209 game_system_timing* timing_info)
2210 {
2211 return instance->toAddon.addonInstance->GetGameTiming(*timing_info);
2212 }
2213
2214 inline static GAME_REGION ADDON_GetRegion(const AddonInstance_Game* instance)
2215 {
2216 return instance->toAddon.addonInstance->GetRegion();
2217 }
2218
2219 inline static bool ADDON_RequiresGameLoop(const AddonInstance_Game* instance)
2220 {
2221 return instance->toAddon.addonInstance->RequiresGameLoop();
2222 }
2223
2224 inline static GAME_ERROR ADDON_RunFrame(const AddonInstance_Game* instance)
2225 {
2226 return instance->toAddon.addonInstance->RunFrame();
2227 }
2228
2229 inline static GAME_ERROR ADDON_Reset(const AddonInstance_Game* instance)
2230 {
2231 return instance->toAddon.addonInstance->Reset();
2232 }
2233
2234
2235 // --- Hardware rendering operations -------------------------------------------
2236
2237 inline static GAME_ERROR ADDON_HwContextReset(const AddonInstance_Game* instance)
2238 {
2239 return instance->toAddon.addonInstance->HwContextReset();
2240 }
2241
2242 inline static GAME_ERROR ADDON_HwContextDestroy(const AddonInstance_Game* instance)
2243 {
2244 return instance->toAddon.addonInstance->HwContextDestroy();
2245 }
2246
2247
2248 // --- Input operations --------------------------------------------------------
2249
2250 inline static bool ADDON_HasFeature(const AddonInstance_Game* instance,
2251 const char* controller_id,
2252 const char* feature_name)
2253 {
2254 return instance->toAddon.addonInstance->HasFeature(controller_id, feature_name);
2255 }
2256
2257 inline static game_input_topology* ADDON_GetTopology(const AddonInstance_Game* instance)
2258 {
2259 return instance->toAddon.addonInstance->GetTopology();
2260 }
2261
2262 inline static void ADDON_FreeTopology(const AddonInstance_Game* instance,
2263 game_input_topology* topology)
2264 {
2265 instance->toAddon.addonInstance->FreeTopology(topology);
2266 }
2267
2268 inline static void ADDON_SetControllerLayouts(const AddonInstance_Game* instance,
2269 const game_controller_layout* controllers,
2270 unsigned int controller_count)
2271 {
2272 if (controllers == nullptr)
2273 return;
2274
2275 std::vector<AddonGameControllerLayout> controllerList;
2276 for (unsigned int i = 0; i < controller_count; ++i)
2277 controllerList.push_back(controllers[i]);
2278
2279 instance->toAddon.addonInstance->SetControllerLayouts(controllerList);
2280 }
2281
2282 inline static bool ADDON_EnableKeyboard(const AddonInstance_Game* instance,
2283 bool enable,
2284 const char* controller_id)
2285 {
2286 return instance->toAddon.addonInstance->EnableKeyboard(enable, controller_id);
2287 }
2288
2289 inline static bool ADDON_EnableMouse(const AddonInstance_Game* instance,
2290 bool enable,
2291 const char* controller_id)
2292 {
2293 return instance->toAddon.addonInstance->EnableMouse(enable, controller_id);
2294 }
2295
2296 inline static bool ADDON_ConnectController(const AddonInstance_Game* instance,
2297 bool connect,
2298 const char* port_address,
2299 const char* controller_id)
2300 {
2301 return instance->toAddon.addonInstance->ConnectController(connect, port_address, controller_id);
2302 }
2303
2304 inline static bool ADDON_InputEvent(const AddonInstance_Game* instance,
2305 const game_input_event* event)
2306 {
2307 return instance->toAddon.addonInstance->InputEvent(*event);
2308 }
2309
2310
2311 // --- Serialization operations ------------------------------------------------
2312
2313 inline static size_t ADDON_SerializeSize(const AddonInstance_Game* instance)
2314 {
2315 return instance->toAddon.addonInstance->SerializeSize();
2316 }
2317
2318 inline static GAME_ERROR ADDON_Serialize(const AddonInstance_Game* instance,
2319 uint8_t* data,
2320 size_t size)
2321 {
2322 return instance->toAddon.addonInstance->Serialize(data, size);
2323 }
2324
2325 inline static GAME_ERROR ADDON_Deserialize(const AddonInstance_Game* instance,
2326 const uint8_t* data,
2327 size_t size)
2328 {
2329 return instance->toAddon.addonInstance->Deserialize(data, size);
2330 }
2331
2332
2333 // --- Cheat operations --------------------------------------------------------
2334
2335 inline static GAME_ERROR ADDON_CheatReset(const AddonInstance_Game* instance)
2336 {
2337 return instance->toAddon.addonInstance->CheatReset();
2338 }
2339
2340 inline static GAME_ERROR ADDON_GetMemory(const AddonInstance_Game* instance,
2341 GAME_MEMORY type,
2342 uint8_t** data,
2343 size_t* size)
2344 {
2345 return instance->toAddon.addonInstance->GetMemory(type, *data, *size);
2346 }
2347
2348 inline static GAME_ERROR ADDON_SetCheat(const AddonInstance_Game* instance,
2349 unsigned int index,
2350 bool enabled,
2351 const char* code)
2352 {
2353 return instance->toAddon.addonInstance->SetCheat(index, enabled, code);
2354 }
2355
2356 AddonInstance_Game* m_instanceData;
2357};
2358
2359} /* namespace addon */
2360} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/ImageDecoder.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/ImageDecoder.h
deleted file mode 100644
index e41e5ef..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/ImageDecoder.h
+++ /dev/null
@@ -1,315 +0,0 @@
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 "../AddonBase.h"
12#include "../c-api/addon-instance/image_decoder.h"
13
14#ifdef __cplusplus
15namespace kodi
16{
17namespace addon
18{
19
20//##############################################################################
21/// @defgroup cpp_kodi_addon_imagedecoder_Defs Definitions, structures and enumerators
22/// @ingroup cpp_kodi_addon_imagedecoder
23/// @brief **Image decoder add-on general variables**
24///
25/// Used to exchange the available options between Kodi and addon.
26///
27///
28
29//==============================================================================
30///
31/// @addtogroup cpp_kodi_addon_imagedecoder
32/// @brief @cpp_class{ kodi::addon::CInstanceImageDecoder }
33/// **Image decoder add-on instance**\n
34/// This instance type is used to allow Kodi various additional image format
35/// types.
36///
37/// This usage can be requested under various conditions, by a Mimetype protocol
38/// defined in <b>`addon.xml`</b> or supported file extensions.
39///
40/// Include the header @ref ImageDecoder.h "#include <kodi/addon-instance/ImageDecoder.h>"
41/// to use this class.
42///
43/// ----------------------------------------------------------------------------
44///
45/// Here is an example of what the <b>`addon.xml.in`</b> would look like for an
46/// image decoder addon:
47///
48/// ~~~~~~~~~~~~~{.xml}
49/// <?xml version="1.0" encoding="UTF-8"?>
50/// <addon
51/// id="imagedecoder.myspecialnamefor"
52/// version="1.0.0"
53/// name="My image decoder addon"
54/// provider-name="Your Name">
55/// <requires>@ADDON_DEPENDS@</requires>
56/// <extension
57/// point="kodi.imagedecoder"
58/// extension=".imga|.imgb"
59/// mimetype="image/mymimea|image/mymimea"
60/// library_@PLATFORM@="@LIBRARY_FILENAME@"/>
61/// <extension point="xbmc.addon.metadata">
62/// <summary lang="en_GB">My image decoder addon summary</summary>
63/// <description lang="en_GB">My image decoder description</description>
64/// <platform>@PLATFORM@</platform>
65/// </extension>
66/// </addon>
67/// ~~~~~~~~~~~~~
68///
69/// ### Standard values that can be declared for processing in `addon.xml`.
70///
71/// These values are used by Kodi to identify associated images and file
72/// extensions and then to select the associated addon.
73///
74/// \table_start
75/// \table_h3{ Labels, Type, Description }
76/// \table_row3{ <b>`point`</b>,
77/// @anchor cpp_kodi_addon_imagedecoder_point
78/// string,
79/// The identification of the addon instance to image decoder is mandatory
80/// <b>`kodi.imagedecoder`</b>. In addition\, the instance declared in the
81/// first <b>`<extension ... />`</b> is also the main type of addon.
82/// }
83/// \table_row3{ <b>`extension`</b>,
84/// @anchor cpp_kodi_addon_imagedecoder_defaultPort
85/// string,
86/// The from addon operated and supported image file endings.\n
87/// Use a <b>`|`</b> to separate between different ones.
88/// }
89/// \table_row3{ <b>`defaultPort`</b>,
90/// @anchor cpp_kodi_addon_imagedecoder_defaultPort
91/// string,
92/// The from addon operated image [mimetypes](https://en.wikipedia.org/wiki/Media_type).\n
93/// Use a <b>`|`</b> to separate between different ones.
94/// }
95/// \table_row3{ <b>`library_@PLATFORM@`</b>,
96/// @anchor cpp_kodi_addon_imagedecoder_library
97/// string,
98/// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated <b>`addon.xml`</b>.
99/// }
100/// \table_end
101///
102/// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml.
103///
104///
105/// --------------------------------------------------------------------------
106///
107///
108/// **Example:**
109///
110/// ~~~~~~~~~~~~~{.cpp}
111/// #include <kodi/addon-instance/ImageDecoder.h>
112///
113/// class ATTRIBUTE_HIDDEN CMyImageDecoder : public kodi::addon::CInstanceImageDecoder
114/// {
115/// public:
116/// CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion);
117///
118/// bool LoadImageFromMemory(unsigned char* buffer,
119/// unsigned int bufSize,
120/// unsigned int& width,
121/// unsigned int& height) override;
122///
123/// bool Decode(unsigned char* pixels,
124/// unsigned int width,
125/// unsigned int height,
126/// unsigned int pitch,
127/// ImageFormat format) override;
128///
129/// ...
130/// };
131///
132/// CMyImageDecoder::CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion)
133/// : CInstanceImageDecoder(instance, kodiVersion)
134/// {
135/// ...
136/// }
137///
138/// bool CMyImageDecoder::LoadImageFromMemory(unsigned char* buffer,
139/// unsigned int bufSize,
140/// unsigned int& width,
141/// unsigned int& height)
142/// {
143/// ...
144/// return true;
145/// }
146///
147/// bool CMyImageDecoder::Decode(unsigned char* pixels,
148/// unsigned int width,
149/// unsigned int height,
150/// unsigned int pitch,
151/// ImageFormat format) override;
152/// {
153/// ...
154/// return true;
155/// }
156///
157/// //----------------------------------------------------------------------
158///
159/// class ATTRIBUTE_HIDDEN CMyAddon : public kodi::addon::CAddonBase
160/// {
161/// public:
162/// CMyAddon() = default;
163/// ADDON_STATUS CreateInstance(int instanceType,
164/// const std::string& instanceID,
165/// KODI_HANDLE instance,
166/// const std::string& version,
167/// KODI_HANDLE& addonInstance) override;
168/// };
169///
170/// // If you use only one instance in your add-on, can be instanceType and
171/// // instanceID ignored
172/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
173/// const std::string& instanceID,
174/// KODI_HANDLE instance,
175/// const std::string& version,
176/// KODI_HANDLE& addonInstance)
177/// {
178/// if (instanceType == ADDON_INSTANCE_IMAGEDECODER)
179/// {
180/// kodi::Log(ADDON_LOG_NOTICE, "Creating my image decoder instance");
181/// addonInstance = new CMyImageDecoder(instance, version);
182/// return ADDON_STATUS_OK;
183/// }
184/// else if (...)
185/// {
186/// ...
187/// }
188/// return ADDON_STATUS_UNKNOWN;
189/// }
190///
191/// ADDONCREATOR(CMyAddon)
192/// ~~~~~~~~~~~~~
193///
194/// The destruction of the example class `CMyImageDecoder` is called from
195/// Kodi's header. Manually deleting the add-on instance is not required.
196///
197//------------------------------------------------------------------------------
198class ATTRIBUTE_HIDDEN CInstanceImageDecoder : public IAddonInstance
199{
200public:
201 //============================================================================
202 /// @ingroup cpp_kodi_addon_imagedecoder
203 /// @brief Class constructor.
204 ///
205 /// @param[in] instance The from Kodi given instance given be add-on
206 /// CreateInstance call with instance id
207 /// @ref ADDON_INSTANCE_IMAGEDECODER.
208 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
209 /// allow compatibility to older Kodi versions.
210 ///
211 /// @note Recommended to set <b>`kodiVersion`</b>.
212 ///
213 explicit CInstanceImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "")
214 : IAddonInstance(ADDON_INSTANCE_IMAGEDECODER,
215 !kodiVersion.empty() ? kodiVersion
216 : GetKodiTypeVersion(ADDON_INSTANCE_IMAGEDECODER))
217 {
218 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
219 throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation of multiple together "
220 "with single instance way is not allowed!");
221
222 SetAddonStruct(instance);
223 }
224 //----------------------------------------------------------------------------
225
226 ~CInstanceImageDecoder() override = default;
227
228 //============================================================================
229 /// @ingroup cpp_kodi_addon_imagedecoder
230 /// @brief Initialize an encoder.
231 ///
232 /// @param[in] buffer The data to read from memory
233 /// @param[in] bufSize The buffer size
234 /// @param[in,out] width The optimal width of image on entry, obtained width
235 /// on return
236 /// @param[in,out] height The optimal height of image, actual obtained height
237 /// on return
238 /// @return true if successful done, false on error
239 ///
240 virtual bool LoadImageFromMemory(unsigned char* buffer,
241 unsigned int bufSize,
242 unsigned int& width,
243 unsigned int& height) = 0;
244 //----------------------------------------------------------------------------
245
246 //============================================================================
247 /// @ingroup cpp_kodi_addon_imagedecoder
248 /// @brief Decode previously loaded image.
249 ///
250 /// @param[in] pixels Output buffer
251 /// @param[in] width Width of output image
252 /// @param[in] height Height of output image
253 /// @param[in] pitch Pitch of output image
254 /// @param[in] format Format of output image
255 /// @return true if successful done, false on error
256 ///
257 virtual bool Decode(unsigned char* pixels,
258 unsigned int width,
259 unsigned int height,
260 unsigned int pitch,
261 ImageFormat format) = 0;
262 //----------------------------------------------------------------------------
263
264 //============================================================================
265 /// @ingroup cpp_kodi_addon_imagedecoder
266 /// @brief **Callback to Kodi Function**\n
267 /// Get the wanted mime type from Kodi.
268 ///
269 /// @return the mimetype wanted from Kodi
270 ///
271 /// @remarks Only called from addon itself.
272 ///
273 inline std::string MimeType() { return m_instanceData->props->mimetype; }
274 //----------------------------------------------------------------------------
275
276private:
277 void SetAddonStruct(KODI_HANDLE instance)
278 {
279 if (instance == nullptr)
280 throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation with empty addon "
281 "structure not allowed, table must be given from Kodi!");
282
283 m_instanceData = static_cast<AddonInstance_ImageDecoder*>(instance);
284 m_instanceData->toAddon->addonInstance = this;
285 m_instanceData->toAddon->load_image_from_memory = ADDON_LoadImageFromMemory;
286 m_instanceData->toAddon->decode = ADDON_Decode;
287 }
288
289 inline static bool ADDON_LoadImageFromMemory(const AddonInstance_ImageDecoder* instance,
290 unsigned char* buffer,
291 unsigned int bufSize,
292 unsigned int* width,
293 unsigned int* height)
294 {
295 return static_cast<CInstanceImageDecoder*>(instance->toAddon->addonInstance)
296 ->LoadImageFromMemory(buffer, bufSize, *width, *height);
297 }
298
299 inline static bool ADDON_Decode(const AddonInstance_ImageDecoder* instance,
300 unsigned char* pixels,
301 unsigned int width,
302 unsigned int height,
303 unsigned int pitch,
304 enum ImageFormat format)
305 {
306 return static_cast<CInstanceImageDecoder*>(instance->toAddon->addonInstance)
307 ->Decode(pixels, width, height, pitch, format);
308 }
309
310 AddonInstance_ImageDecoder* m_instanceData;
311};
312
313} /* namespace addon */
314} /* namespace kodi */
315#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Inputstream.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Inputstream.h
deleted file mode 100644
index 354806e..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Inputstream.h
+++ /dev/null
@@ -1,881 +0,0 @@
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/*
12 * Parts with a comment named "internal" are only used inside header and not
13 * used or accessed direct during add-on development!
14 */
15
16#include "../AddonBase.h"
17#include "../StreamCodec.h"
18#include "../StreamCrypto.h"
19
20#ifdef BUILD_KODI_ADDON
21#include "../DemuxPacket.h"
22#include "../InputStreamConstants.h"
23#else
24#include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h"
25#include "cores/VideoPlayer/Interface/Addon/InputStreamConstants.h"
26#endif
27
28//Increment this level always if you add features which can lead to compile failures in the addon
29#define INPUTSTREAM_VERSION_LEVEL 2
30
31#ifdef __cplusplus
32extern "C"
33{
34#endif /* __cplusplus */
35
36 /*!
37 * @brief InputStream add-on capabilities. All capabilities are set to "false" as default.
38 */
39 struct INPUTSTREAM_CAPABILITIES
40 {
41 enum MASKTYPE : uint32_t
42 {
43 /// supports interface IDemux
44 SUPPORTS_IDEMUX = (1 << 0),
45
46 /// supports interface IPosTime
47 SUPPORTS_IPOSTIME = (1 << 1),
48
49 /// supports interface IDisplayTime
50 SUPPORTS_IDISPLAYTIME = (1 << 2),
51
52 /// supports seek
53 SUPPORTS_SEEK = (1 << 3),
54
55 /// supports pause
56 SUPPORTS_PAUSE = (1 << 4),
57
58 /// supports interface ITime
59 SUPPORTS_ITIME = (1 << 5),
60
61 /// supports interface IChapter
62 SUPPORTS_ICHAPTER = (1 << 6),
63 };
64
65 /// set of supported capabilities
66 uint32_t m_mask;
67 };
68
69 /*!
70 * @brief structure of key/value pairs passed to addon on Open()
71 */
72 struct INPUTSTREAM
73 {
74 const char* m_strURL;
75 const char* m_mimeType;
76
77 unsigned int m_nCountInfoValues;
78 struct LISTITEMPROPERTY
79 {
80 const char* m_strKey;
81 const char* m_strValue;
82 } m_ListItemProperties[STREAM_MAX_PROPERTY_COUNT];
83
84 const char* m_libFolder;
85 const char* m_profileFolder;
86 };
87
88 /*!
89 * @brief Array of stream IDs
90 */
91 struct INPUTSTREAM_IDS
92 {
93 static const unsigned int MAX_STREAM_COUNT = 256;
94 unsigned int m_streamCount;
95 unsigned int m_streamIds[MAX_STREAM_COUNT];
96 };
97
98 /*!
99 * @brief MASTERING Metadata
100 */
101 struct INPUTSTREAM_MASTERING_METADATA
102 {
103 double primary_r_chromaticity_x;
104 double primary_r_chromaticity_y;
105 double primary_g_chromaticity_x;
106 double primary_g_chromaticity_y;
107 double primary_b_chromaticity_x;
108 double primary_b_chromaticity_y;
109 double white_point_chromaticity_x;
110 double white_point_chromaticity_y;
111 double luminance_max;
112 double luminance_min;
113 };
114
115 /*!
116 * @brief CONTENTLIGHT Metadata
117 */
118 struct INPUTSTREAM_CONTENTLIGHT_METADATA
119 {
120 uint64_t max_cll;
121 uint64_t max_fall;
122 };
123
124 /*!
125 * @brief stream properties
126 */
127 struct INPUTSTREAM_INFO
128 {
129 enum STREAM_TYPE
130 {
131 TYPE_NONE = 0,
132 TYPE_VIDEO,
133 TYPE_AUDIO,
134 TYPE_SUBTITLE,
135 TYPE_TELETEXT,
136 TYPE_RDS,
137 } m_streamType;
138
139 enum Codec_FEATURES : uint32_t
140 {
141 FEATURE_DECODE = 1
142 };
143 uint32_t m_features;
144
145 enum STREAM_FLAGS : uint32_t
146 {
147 FLAG_NONE = 0x0000,
148 FLAG_DEFAULT = 0x0001,
149 FLAG_DUB = 0x0002,
150 FLAG_ORIGINAL = 0x0004,
151 FLAG_COMMENT = 0x0008,
152 FLAG_LYRICS = 0x0010,
153 FLAG_KARAOKE = 0x0020,
154 FLAG_FORCED = 0x0040,
155 FLAG_HEARING_IMPAIRED = 0x0080,
156 FLAG_VISUAL_IMPAIRED = 0x0100,
157 };
158
159 // Keep in sync with AVColorSpace
160 enum COLORSPACE
161 {
162 COLORSPACE_RGB = 0,
163 COLORSPACE_BT709 = 1,
164 COLORSPACE_UNSPECIFIED = 2,
165 COLORSPACE_UNKNOWN = COLORSPACE_UNSPECIFIED, // compatibility
166 COLORSPACE_RESERVED = 3,
167 COLORSPACE_FCC = 4,
168 COLORSPACE_BT470BG = 5,
169 COLORSPACE_SMPTE170M = 6,
170 COLORSPACE_SMPTE240M = 7,
171 COLORSPACE_YCGCO = 8,
172 COLORSPACE_YCOCG = COLORSPACE_YCGCO,
173 COLORSPACE_BT2020_NCL = 9,
174 COLORSPACE_BT2020_CL = 10,
175 COLORSPACE_SMPTE2085 = 11,
176 COLORSPACE_CHROMA_DERIVED_NCL = 12,
177 COLORSPACE_CHROMA_DERIVED_CL = 13,
178 COLORSPACE_ICTCP = 14,
179 COLORSPACE_MAX
180 };
181
182 // Keep in sync with AVColorPrimaries
183 enum COLORPRIMARIES : int32_t
184 {
185 COLORPRIMARY_RESERVED0 = 0,
186 COLORPRIMARY_BT709 = 1,
187 COLORPRIMARY_UNSPECIFIED = 2,
188 COLORPRIMARY_RESERVED = 3,
189 COLORPRIMARY_BT470M = 4,
190 COLORPRIMARY_BT470BG = 5,
191 COLORPRIMARY_SMPTE170M = 6,
192 COLORPRIMARY_SMPTE240M = 7,
193 COLORPRIMARY_FILM = 8,
194 COLORPRIMARY_BT2020 = 9,
195 COLORPRIMARY_SMPTE428 = 10,
196 COLORPRIMARY_SMPTEST428_1 = COLORPRIMARY_SMPTE428,
197 COLORPRIMARY_SMPTE431 = 11,
198 COLORPRIMARY_SMPTE432 = 12,
199 COLORPRIMARY_JEDEC_P22 = 22,
200 COLORPRIMARY_MAX
201 };
202
203 // Keep in sync with AVColorRange
204 enum COLORRANGE
205 {
206 COLORRANGE_UNKNOWN = 0,
207 COLORRANGE_LIMITED,
208 COLORRANGE_FULLRANGE,
209 COLORRANGE_MAX
210 };
211
212 // keep in sync with AVColorTransferCharacteristic
213 enum COLORTRC : int32_t
214 {
215 COLORTRC_RESERVED0 = 0,
216 COLORTRC_BT709 = 1,
217 COLORTRC_UNSPECIFIED = 2,
218 COLORTRC_RESERVED = 3,
219 COLORTRC_GAMMA22 = 4,
220 COLORTRC_GAMMA28 = 5,
221 COLORTRC_SMPTE170M = 6,
222 COLORTRC_SMPTE240M = 7,
223 COLORTRC_LINEAR = 8,
224 COLORTRC_LOG = 9,
225 COLORTRC_LOG_SQRT = 10,
226 COLORTRC_IEC61966_2_4 = 11,
227 COLORTRC_BT1361_ECG = 12,
228 COLORTRC_IEC61966_2_1 = 13,
229 COLORTRC_BT2020_10 = 14,
230 COLORTRC_BT2020_12 = 15,
231 COLORTRC_SMPTE2084 = 16,
232 COLORTRC_SMPTEST2084 = COLORTRC_SMPTE2084,
233 COLORTRC_SMPTE428 = 17,
234 COLORTRC_SMPTEST428_1 = COLORTRC_SMPTE428,
235 COLORTRC_ARIB_STD_B67 = 18,
236 COLORTRC_MAX
237 };
238
239 uint32_t m_flags;
240
241 char m_name[256]; /*!< @brief (optinal) name of the stream, \0 for default handling */
242 char m_codecName[32]; /*!< @brief (required) name of codec according to ffmpeg */
243 char m_codecInternalName
244 [32]; /*!< @brief (optional) internal name of codec (selectionstream info) */
245 STREAMCODEC_PROFILE m_codecProfile; /*!< @brief (optional) the profile of the codec */
246 unsigned int m_pID; /*!< @brief (required) physical index */
247
248 const uint8_t* m_ExtraData;
249 unsigned int m_ExtraSize;
250
251 char m_language[64]; /*!< @brief RFC 5646 language code (empty string if undefined) */
252
253 unsigned int
254 m_FpsScale; /*!< @brief Scale of 1000 and a rate of 29970 will result in 29.97 fps */
255 unsigned int m_FpsRate;
256 unsigned int m_Height; /*!< @brief height of the stream reported by the demuxer */
257 unsigned int m_Width; /*!< @brief width of the stream reported by the demuxer */
258 float m_Aspect; /*!< @brief display aspect of stream */
259
260
261 unsigned int m_Channels; /*!< @brief (required) amount of channels */
262 unsigned int m_SampleRate; /*!< @brief (required) sample rate */
263 unsigned int m_BitRate; /*!< @brief (required) bit rate */
264 unsigned int m_BitsPerSample; /*!< @brief (required) bits per sample */
265 unsigned int m_BlockAlign;
266
267 CRYPTO_INFO m_cryptoInfo;
268
269 // new in API version 2.0.8
270 unsigned int m_codecFourCC; /*!< @brief Codec If available, the fourcc code codec */
271 COLORSPACE m_colorSpace; /*!< @brief definition of colorspace */
272 COLORRANGE m_colorRange; /*!< @brief color range if available */
273
274 //new in API 2.0.9 / INPUTSTREAM_VERSION_LEVEL 1
275 COLORPRIMARIES m_colorPrimaries;
276 COLORTRC m_colorTransferCharacteristic;
277 INPUTSTREAM_MASTERING_METADATA* m_masteringMetadata; /*!< @brief mastering static Metadata */
278 INPUTSTREAM_CONTENTLIGHT_METADATA*
279 m_contentLightMetadata; /*!< @brief content light static Metadata */
280 };
281
282 struct INPUTSTREAM_TIMES
283 {
284 time_t startTime;
285 double ptsStart;
286 double ptsBegin;
287 double ptsEnd;
288 };
289
290 /*!
291 * @brief "C" ABI Structures to transfer the methods from this to Kodi
292 */
293
294 // this are properties given to the addon on create
295 // at this time we have no parameters for the addon
296 typedef struct AddonProps_InputStream /* internal */
297 {
298 int dummy;
299 } AddonProps_InputStream;
300
301 typedef struct AddonToKodiFuncTable_InputStream /* internal */
302 {
303 KODI_HANDLE kodiInstance;
304 DemuxPacket* (*allocate_demux_packet)(void* kodiInstance, int data_size);
305 DemuxPacket* (*allocate_encrypted_demux_packet)(void* kodiInstance,
306 unsigned int data_size,
307 unsigned int encrypted_subsample_count);
308 void (*free_demux_packet)(void* kodiInstance, DemuxPacket* packet);
309 } AddonToKodiFuncTable_InputStream;
310
311 struct AddonInstance_InputStream;
312 typedef struct KodiToAddonFuncTable_InputStream /* internal */
313 {
314 KODI_HANDLE addonInstance;
315
316 bool(__cdecl* open)(const AddonInstance_InputStream* instance, INPUTSTREAM* props);
317 void(__cdecl* close)(const AddonInstance_InputStream* instance);
318 const char*(__cdecl* get_path_list)(const AddonInstance_InputStream* instance);
319 void(__cdecl* get_capabilities)(const AddonInstance_InputStream* instance,
320 INPUTSTREAM_CAPABILITIES* capabilities);
321
322 // IDemux
323 struct INPUTSTREAM_IDS(__cdecl* get_stream_ids)(const AddonInstance_InputStream* instance);
324 struct INPUTSTREAM_INFO(__cdecl* get_stream)(const AddonInstance_InputStream* instance,
325 int streamid);
326 void(__cdecl* enable_stream)(const AddonInstance_InputStream* instance,
327 int streamid,
328 bool enable);
329 bool(__cdecl* open_stream)(const AddonInstance_InputStream* instance, int streamid);
330 void(__cdecl* demux_reset)(const AddonInstance_InputStream* instance);
331 void(__cdecl* demux_abort)(const AddonInstance_InputStream* instance);
332 void(__cdecl* demux_flush)(const AddonInstance_InputStream* instance);
333 DemuxPacket*(__cdecl* demux_read)(const AddonInstance_InputStream* instance);
334 bool(__cdecl* demux_seek_time)(const AddonInstance_InputStream* instance,
335 double time,
336 bool backwards,
337 double* startpts);
338 void(__cdecl* demux_set_speed)(const AddonInstance_InputStream* instance, int speed);
339 void(__cdecl* set_video_resolution)(const AddonInstance_InputStream* instance,
340 int width,
341 int height);
342
343 // IDisplayTime
344 int(__cdecl* get_total_time)(const AddonInstance_InputStream* instance);
345 int(__cdecl* get_time)(const AddonInstance_InputStream* instance);
346
347 // ITime
348 bool(__cdecl* get_times)(const AddonInstance_InputStream* instance, INPUTSTREAM_TIMES* times);
349
350 // IPosTime
351 bool(__cdecl* pos_time)(const AddonInstance_InputStream* instance, int ms);
352
353 int(__cdecl* read_stream)(const AddonInstance_InputStream* instance,
354 uint8_t* buffer,
355 unsigned int bufferSize);
356 int64_t(__cdecl* seek_stream)(const AddonInstance_InputStream* instance,
357 int64_t position,
358 int whence);
359 int64_t(__cdecl* position_stream)(const AddonInstance_InputStream* instance);
360 int64_t(__cdecl* length_stream)(const AddonInstance_InputStream* instance);
361 bool(__cdecl* is_real_time_stream)(const AddonInstance_InputStream* instance);
362
363 // IChapter
364 int(__cdecl* get_chapter)(const AddonInstance_InputStream* instance);
365 int(__cdecl* get_chapter_count)(const AddonInstance_InputStream* instance);
366 const char*(__cdecl* get_chapter_name)(const AddonInstance_InputStream* instance, int ch);
367 int64_t(__cdecl* get_chapter_pos)(const AddonInstance_InputStream* instance, int ch);
368 bool(__cdecl* seek_chapter)(const AddonInstance_InputStream* instance, int ch);
369
370 int(__cdecl* block_size_stream)(const AddonInstance_InputStream* instance);
371 } KodiToAddonFuncTable_InputStream;
372
373 typedef struct AddonInstance_InputStream /* internal */
374 {
375 AddonProps_InputStream props;
376 AddonToKodiFuncTable_InputStream toKodi;
377 KodiToAddonFuncTable_InputStream toAddon;
378 } AddonInstance_InputStream;
379
380#ifdef __cplusplus
381} /* extern "C" */
382
383namespace kodi
384{
385namespace addon
386{
387
388class ATTRIBUTE_HIDDEN CInstanceInputStream : public IAddonInstance
389{
390public:
391 explicit CInstanceInputStream(KODI_HANDLE instance, const std::string& kodiVersion = "")
392 : IAddonInstance(ADDON_INSTANCE_INPUTSTREAM,
393 !kodiVersion.empty() ? kodiVersion
394 : GetKodiTypeVersion(ADDON_INSTANCE_INPUTSTREAM))
395 {
396 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
397 throw std::logic_error("kodi::addon::CInstanceInputStream: Creation of multiple together "
398 "with single instance way is not allowed!");
399
400 SetAddonStruct(instance, m_kodiVersion);
401 }
402
403 ~CInstanceInputStream() override = default;
404
405 /*!
406 * Open a stream.
407 * @param props
408 * @return True if the stream has been opened successfully, false otherwise.
409 * @remarks
410 */
411 virtual bool Open(INPUTSTREAM& props) = 0;
412
413 /*!
414 * Close an open stream.
415 * @remarks
416 */
417 virtual void Close() = 0;
418
419 /*!
420 * Get Capabilities of this addon.
421 * @param capabilities The add-on's capabilities.
422 * @remarks
423 */
424 virtual void GetCapabilities(INPUTSTREAM_CAPABILITIES& capabilities) = 0;
425
426 /*!
427 * Get IDs of available streams
428 * @remarks
429 */
430 virtual INPUTSTREAM_IDS GetStreamIds() = 0;
431
432 /*!
433 * Get stream properties of a stream.
434 * @param streamid unique id of stream
435 * @return struc of stream properties
436 * @remarks
437 */
438 virtual INPUTSTREAM_INFO GetStream(int streamid) = 0;
439
440 /*!
441 * Enable or disable a stream.
442 * A disabled stream does not send demux packets
443 * @param streamid unique id of stream
444 * @param enable true for enable, false for disable
445 * @remarks
446 */
447 virtual void EnableStream(int streamid, bool enable) = 0;
448
449 /*!
450 * Opens a stream for playback.
451 * @param streamid unique id of stream
452 * @remarks
453 */
454 virtual bool OpenStream(int streamid) = 0;
455
456 /*!
457 * Reset the demultiplexer in the add-on.
458 * @remarks Required if bHandlesDemuxing is set to true.
459 */
460 virtual void DemuxReset() {}
461
462 /*!
463 * Abort the demultiplexer thread in the add-on.
464 * @remarks Required if bHandlesDemuxing is set to true.
465 */
466 virtual void DemuxAbort() {}
467
468 /*!
469 * Flush all data that's currently in the demultiplexer buffer in the add-on.
470 * @remarks Required if bHandlesDemuxing is set to true.
471 */
472 virtual void DemuxFlush() {}
473
474 /*!
475 * Read the next packet from the demultiplexer, if there is one.
476 * @return The next packet.
477 * If there is no next packet, then the add-on should return the
478 * packet created by calling AllocateDemuxPacket(0) on the callback.
479 * If the stream changed and Kodi's player needs to be reinitialised,
480 * then, the add-on should call AllocateDemuxPacket(0) on the
481 * callback, and set the streamid to DMX_SPECIALID_STREAMCHANGE and
482 * return the value.
483 * The add-on should return NULL if an error occurred.
484 * @remarks Return NULL if this add-on won't provide this function.
485 */
486 virtual DemuxPacket* DemuxRead() { return nullptr; }
487
488 /*!
489 * Notify the InputStream addon/demuxer that Kodi wishes to seek the stream by time
490 * Demuxer is required to set stream to an IDR frame
491 * @param time The absolute time since stream start
492 * @param backwards True to seek to keyframe BEFORE time, else AFTER
493 * @param startpts can be updated to point to where display should start
494 * @return True if the seek operation was possible
495 * @remarks Optional, and only used if addon has its own demuxer.
496 */
497 virtual bool DemuxSeekTime(double time, bool backwards, double& startpts) { return false; }
498
499 /*!
500 * Notify the InputStream addon/demuxer that Kodi wishes to change playback speed
501 * @param speed The requested playback speed
502 * @remarks Optional, and only used if addon has its own demuxer.
503 */
504 virtual void DemuxSetSpeed(int speed) {}
505
506 /*!
507 * Sets desired width / height
508 * @param width / hight
509 */
510 virtual void SetVideoResolution(int width, int height) {}
511
512 /*!
513 * Totel time in ms
514 * @remarks
515 */
516 virtual int GetTotalTime() { return -1; }
517
518 /*!
519 * Playing time in ms
520 * @remarks
521 */
522 virtual int GetTime() { return -1; }
523
524 /*!
525 * Get current timing values in PTS scale
526 * @remarks
527 */
528 virtual bool GetTimes(INPUTSTREAM_TIMES& times) { return false; }
529
530 /*!
531 * Positions inputstream to playing time given in ms
532 * @remarks
533 */
534 virtual bool PosTime(int ms) { return false; }
535
536 /*!
537 * Return currently selected chapter
538 * @remarks
539 */
540 virtual int GetChapter() { return -1; };
541
542 /*!
543 * Return number of available chapters
544 * @remarks
545 */
546 virtual int GetChapterCount() { return 0; };
547
548 /*!
549 * Return name of chapter # ch
550 * @remarks
551 */
552 virtual const char* GetChapterName(int ch) { return nullptr; };
553
554 /*!
555 * Return position if chapter # ch in milliseconds
556 * @remarks
557 */
558 virtual int64_t GetChapterPos(int ch) { return 0; };
559
560 /*!
561 * Seek to the beginning of chapter # ch
562 * @remarks
563 */
564 virtual bool SeekChapter(int ch) { return false; };
565
566 /*!
567 * Read from an open stream.
568 * @param buffer The buffer to store the data in.
569 * @param bufferSize The amount of bytes to read.
570 * @return The amount of bytes that were actually read from the stream.
571 * @remarks Return -1 if this add-on won't provide this function.
572 */
573 virtual int ReadStream(uint8_t* buffer, unsigned int bufferSize) { return -1; }
574
575 /*!
576 * Seek in a stream.
577 * @param position The position to seek to.
578 * @param whence ?
579 * @return The new position.
580 * @remarks Return -1 if this add-on won't provide this function.
581 */
582 virtual int64_t SeekStream(int64_t position, int whence = SEEK_SET) { return -1; }
583
584 /*!
585 * @return The position in the stream that's currently being read.
586 * @remarks Return -1 if this add-on won't provide this function.
587 */
588 virtual int64_t PositionStream() { return -1; }
589
590 /*!
591 * @return The total length of the stream that's currently being read.
592 * @remarks Return -1 if this add-on won't provide this function.
593 */
594 virtual int64_t LengthStream() { return -1; }
595
596 /*!
597 * @return Obtain the chunk size to use when reading streams.
598 * @remarks Return 0 if this add-on won't provide this function.
599 */
600 virtual int GetBlockSize() { return 0; }
601
602 /*!
603 * Check for real-time streaming
604 * @return true if current stream is real-time
605 */
606 virtual bool IsRealTimeStream() { return true; }
607
608 /*!
609 * @brief Allocate a demux packet. Free with FreeDemuxPacket
610 * @param dataSize The size of the data that will go into the packet
611 * @return The allocated packet
612 */
613 DemuxPacket* AllocateDemuxPacket(int dataSize)
614 {
615 return m_instanceData->toKodi.allocate_demux_packet(m_instanceData->toKodi.kodiInstance,
616 dataSize);
617 }
618
619 /*!
620 * @brief Allocate a demux packet. Free with FreeDemuxPacket
621 * @param dataSize The size of the data that will go into the packet
622 * @return The allocated packet
623 */
624 DemuxPacket* AllocateEncryptedDemuxPacket(int dataSize, unsigned int encryptedSubsampleCount)
625 {
626 return m_instanceData->toKodi.allocate_encrypted_demux_packet(
627 m_instanceData->toKodi.kodiInstance, dataSize, encryptedSubsampleCount);
628 }
629
630 /*!
631 * @brief Free a packet that was allocated with AllocateDemuxPacket
632 * @param packet The packet to free
633 */
634 void FreeDemuxPacket(DemuxPacket* packet)
635 {
636 return m_instanceData->toKodi.free_demux_packet(m_instanceData->toKodi.kodiInstance, packet);
637 }
638
639private:
640 static int compareVersion(const int v1[3], const int v2[3])
641 {
642 for (unsigned i(0); i < 3; ++i)
643 if (v1[i] != v2[i])
644 return v1[i] - v2[i];
645 return 0;
646 }
647
648 void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion)
649 {
650 if (instance == nullptr)
651 throw std::logic_error("kodi::addon::CInstanceInputStream: Creation with empty addon "
652 "structure not allowed, table must be given from Kodi!");
653 int api[3] = { 0, 0, 0 };
654 sscanf(kodiVersion.c_str(), "%d.%d.%d", &api[0], &api[1], &api[2]);
655
656 m_instanceData = static_cast<AddonInstance_InputStream*>(instance);
657 m_instanceData->toAddon.addonInstance = this;
658 m_instanceData->toAddon.open = ADDON_Open;
659 m_instanceData->toAddon.close = ADDON_Close;
660 m_instanceData->toAddon.get_capabilities = ADDON_GetCapabilities;
661
662 m_instanceData->toAddon.get_stream_ids = ADDON_GetStreamIds;
663 m_instanceData->toAddon.get_stream = ADDON_GetStream;
664 m_instanceData->toAddon.enable_stream = ADDON_EnableStream;
665 m_instanceData->toAddon.open_stream = ADDON_OpenStream;
666 m_instanceData->toAddon.demux_reset = ADDON_DemuxReset;
667 m_instanceData->toAddon.demux_abort = ADDON_DemuxAbort;
668 m_instanceData->toAddon.demux_flush = ADDON_DemuxFlush;
669 m_instanceData->toAddon.demux_read = ADDON_DemuxRead;
670 m_instanceData->toAddon.demux_seek_time = ADDON_DemuxSeekTime;
671 m_instanceData->toAddon.demux_set_speed = ADDON_DemuxSetSpeed;
672 m_instanceData->toAddon.set_video_resolution = ADDON_SetVideoResolution;
673
674 m_instanceData->toAddon.get_total_time = ADDON_GetTotalTime;
675 m_instanceData->toAddon.get_time = ADDON_GetTime;
676
677 m_instanceData->toAddon.get_times = ADDON_GetTimes;
678 m_instanceData->toAddon.pos_time = ADDON_PosTime;
679
680 m_instanceData->toAddon.read_stream = ADDON_ReadStream;
681 m_instanceData->toAddon.seek_stream = ADDON_SeekStream;
682 m_instanceData->toAddon.position_stream = ADDON_PositionStream;
683 m_instanceData->toAddon.length_stream = ADDON_LengthStream;
684 m_instanceData->toAddon.is_real_time_stream = ADDON_IsRealTimeStream;
685
686 int minChapterVersion[3] = { 2, 0, 10 };
687 if (compareVersion(api, minChapterVersion) >= 0)
688 {
689 m_instanceData->toAddon.get_chapter = ADDON_GetChapter;
690 m_instanceData->toAddon.get_chapter_count = ADDON_GetChapterCount;
691 m_instanceData->toAddon.get_chapter_name = ADDON_GetChapterName;
692 m_instanceData->toAddon.get_chapter_pos = ADDON_GetChapterPos;
693 m_instanceData->toAddon.seek_chapter = ADDON_SeekChapter;
694 }
695
696 int minBlockSizeVersion[3] = {2, 0, 12};
697 if (compareVersion(api, minBlockSizeVersion) >= 0)
698 {
699 m_instanceData->toAddon.block_size_stream = ADDON_GetBlockSize;
700 }
701 }
702
703 inline static bool ADDON_Open(const AddonInstance_InputStream* instance, INPUTSTREAM* props)
704 {
705 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->Open(*props);
706 }
707
708 inline static void ADDON_Close(const AddonInstance_InputStream* instance)
709 {
710 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->Close();
711 }
712
713 inline static void ADDON_GetCapabilities(const AddonInstance_InputStream* instance,
714 INPUTSTREAM_CAPABILITIES* capabilities)
715 {
716 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
717 ->GetCapabilities(*capabilities);
718 }
719
720
721 // IDemux
722 inline static struct INPUTSTREAM_IDS ADDON_GetStreamIds(const AddonInstance_InputStream* instance)
723 {
724 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetStreamIds();
725 }
726
727 inline static struct INPUTSTREAM_INFO ADDON_GetStream(const AddonInstance_InputStream* instance,
728 int streamid)
729 {
730 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetStream(streamid);
731 }
732
733 inline static void ADDON_EnableStream(const AddonInstance_InputStream* instance,
734 int streamid,
735 bool enable)
736 {
737 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
738 ->EnableStream(streamid, enable);
739 }
740
741 inline static bool ADDON_OpenStream(const AddonInstance_InputStream* instance, int streamid)
742 {
743 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
744 ->OpenStream(streamid);
745 }
746
747 inline static void ADDON_DemuxReset(const AddonInstance_InputStream* instance)
748 {
749 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->DemuxReset();
750 }
751
752 inline static void ADDON_DemuxAbort(const AddonInstance_InputStream* instance)
753 {
754 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->DemuxAbort();
755 }
756
757 inline static void ADDON_DemuxFlush(const AddonInstance_InputStream* instance)
758 {
759 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->DemuxFlush();
760 }
761
762 inline static DemuxPacket* ADDON_DemuxRead(const AddonInstance_InputStream* instance)
763 {
764 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->DemuxRead();
765 }
766
767 inline static bool ADDON_DemuxSeekTime(const AddonInstance_InputStream* instance,
768 double time,
769 bool backwards,
770 double* startpts)
771 {
772 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
773 ->DemuxSeekTime(time, backwards, *startpts);
774 }
775
776 inline static void ADDON_DemuxSetSpeed(const AddonInstance_InputStream* instance, int speed)
777 {
778 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->DemuxSetSpeed(speed);
779 }
780
781 inline static void ADDON_SetVideoResolution(const AddonInstance_InputStream* instance,
782 int width,
783 int height)
784 {
785 static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
786 ->SetVideoResolution(width, height);
787 }
788
789
790 // IDisplayTime
791 inline static int ADDON_GetTotalTime(const AddonInstance_InputStream* instance)
792 {
793 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetTotalTime();
794 }
795
796 inline static int ADDON_GetTime(const AddonInstance_InputStream* instance)
797 {
798 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetTime();
799 }
800
801 // ITime
802 inline static bool ADDON_GetTimes(const AddonInstance_InputStream* instance,
803 INPUTSTREAM_TIMES* times)
804 {
805 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetTimes(*times);
806 }
807
808 // IPosTime
809 inline static bool ADDON_PosTime(const AddonInstance_InputStream* instance, int ms)
810 {
811 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->PosTime(ms);
812 }
813
814 inline static int ADDON_GetChapter(const AddonInstance_InputStream* instance)
815 {
816 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetChapter();
817 }
818
819 inline static int ADDON_GetChapterCount(const AddonInstance_InputStream* instance)
820 {
821 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetChapterCount();
822 }
823
824 inline static const char* ADDON_GetChapterName(const AddonInstance_InputStream* instance, int ch)
825 {
826 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetChapterName(ch);
827 }
828
829 inline static int64_t ADDON_GetChapterPos(const AddonInstance_InputStream* instance, int ch)
830 {
831 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetChapterPos(ch);
832 }
833
834 inline static bool ADDON_SeekChapter(const AddonInstance_InputStream* instance, int ch)
835 {
836 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->SeekChapter(ch);
837 }
838
839 inline static int ADDON_ReadStream(const AddonInstance_InputStream* instance,
840 uint8_t* buffer,
841 unsigned int bufferSize)
842 {
843 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
844 ->ReadStream(buffer, bufferSize);
845 }
846
847 inline static int64_t ADDON_SeekStream(const AddonInstance_InputStream* instance,
848 int64_t position,
849 int whence)
850 {
851 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)
852 ->SeekStream(position, whence);
853 }
854
855 inline static int64_t ADDON_PositionStream(const AddonInstance_InputStream* instance)
856 {
857 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->PositionStream();
858 }
859
860 inline static int64_t ADDON_LengthStream(const AddonInstance_InputStream* instance)
861 {
862 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->LengthStream();
863 }
864
865 inline static int ADDON_GetBlockSize(const AddonInstance_InputStream* instance)
866 {
867 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->GetBlockSize();
868 }
869
870 inline static bool ADDON_IsRealTimeStream(const AddonInstance_InputStream* instance)
871 {
872 return static_cast<CInstanceInputStream*>(instance->toAddon.addonInstance)->IsRealTimeStream();
873 }
874
875 AddonInstance_InputStream* m_instanceData;
876};
877
878} /* namespace addon */
879} /* namespace kodi */
880
881#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PVR.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PVR.h
deleted file mode 100644
index 0bca8e2..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PVR.h
+++ /dev/null
@@ -1,3423 +0,0 @@
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 "../c-api/addon-instance/pvr.h"
12#include "pvr/ChannelGroups.h"
13#include "pvr/Channels.h"
14#include "pvr/EDL.h"
15#include "pvr/EPG.h"
16#include "pvr/General.h"
17#include "pvr/MenuHook.h"
18#include "pvr/Recordings.h"
19#include "pvr/Stream.h"
20#include "pvr/Timers.h"
21
22#ifdef __cplusplus
23
24/*!
25 * @internal
26 * @brief PVR "C++" API interface
27 *
28 * In this field are the pure addon-side C++ data.
29 *
30 * @note Changes can be made without problems and have no influence on other
31 * PVR addons that have already been created.\n
32 * \n
33 * Therefore, @ref ADDON_INSTANCE_VERSION_PVR_MIN can be ignored for these
34 * fields and only the @ref ADDON_INSTANCE_VERSION_PVR needs to be increased.\n
35 * \n
36 * Only must be min version increased if a new compile of addon breaks after
37 * changes here.
38 *
39 * Have by add of new parts a look about **Doxygen** `\\ingroup`, so that
40 * added parts included in documentation.
41 *
42 * If you add addon side related documentation, where his dev need know, use `///`.
43 * For parts only for Kodi make it like here.
44 *
45 * @endinternal
46 */
47
48namespace kodi
49{
50namespace addon
51{
52
53//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
54// "C++" Doxygen group set for the definitions
55//{{{
56
57//==============================================================================
58/// @defgroup cpp_kodi_addon_pvr_Defs Definitions, structures and enumerators
59/// @ingroup cpp_kodi_addon_pvr
60/// @brief **PVR client add-on instance definition values**\n
61/// All PVR functions associated data structures.
62///
63/// Used to exchange the available options between Kodi and addon.\n
64/// The groups described here correspond to the groups of functions on PVR
65/// instance class.
66///
67
68//##############################################################################
69/// @defgroup cpp_kodi_addon_pvr_Defs_General 1. General
70/// @ingroup cpp_kodi_addon_pvr_Defs
71/// @brief **PVR add-on general variables**\n
72/// Used to exchange the available options between Kodi and addon.
73///
74/// This group also includes @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities with
75/// which Kodi an @ref kodi::addon::CInstancePVRClient::GetCapabilities()
76/// queries the supported **modules** of the addon.
77///
78/// The standard values are also below, once for error messages and once to
79/// @ref kodi::addon::CInstancePVRClient::ConnectionStateChange() to give Kodi
80/// any information.
81///
82///@{
83//##############################################################################
84/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream class PVRStreamProperty & definition PVR_STREAM_PROPERTY
85/// @ingroup cpp_kodi_addon_pvr_Defs_General
86/// @brief **Inputstream variables**\n
87/// This includes values related to the outside of PVR available inputstream
88/// system.
89///
90/// This can be by separate instance on same addon, by handling in Kodi itself
91/// or to reference of another addon where support needed inputstream.
92///
93/// @note This is complete independent from own system included here
94/// @ref cpp_kodi_addon_pvr_Streams "inputstream".
95///
96//------------------------------------------------------------------------------
97///@}
98
99//##############################################################################
100/// @defgroup cpp_kodi_addon_pvr_Defs_Channel 2. Channel
101/// @ingroup cpp_kodi_addon_pvr_Defs
102/// @brief **PVR add-on channel**\n
103/// Used to exchange the available channel options between Kodi and addon.
104///
105/// Modules here are mainly intended for @ref cpp_kodi_addon_pvr_Channels "channels",
106/// but are also used on other modules to identify the respective TV/radio
107/// channel.
108///
109/// Because of @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus and
110/// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo is a special case at
111/// this point. This is currently only used on running streams, but it may be
112/// possible that this must always be usable in connection with PiP in the
113/// future.
114///
115//------------------------------------------------------------------------------
116
117//##############################################################################
118/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup 3. Channel Group
119/// @ingroup cpp_kodi_addon_pvr_Defs
120/// @brief **PVR add-on channel group**\n
121/// This group contains data classes and values which are used in PVR on
122/// @ref cpp_kodi_addon_pvr_supportsChannelGroups "channel groups".
123///
124//------------------------------------------------------------------------------
125
126//##############################################################################
127/// @defgroup cpp_kodi_addon_pvr_Defs_epg 4. EPG Tag
128/// @ingroup cpp_kodi_addon_pvr_Defs
129/// @brief **PVR add-on EPG data**\n
130/// Used on @ref cpp_kodi_addon_pvr_EPGTag "EPG methods in PVR instance class".
131///
132/// See related modules about, also below in this view are few macros where
133/// default values of associated places.
134///
135//------------------------------------------------------------------------------
136
137//##############################################################################
138/// @defgroup cpp_kodi_addon_pvr_Defs_Recording 5. Recording
139/// @ingroup cpp_kodi_addon_pvr_Defs
140/// @brief **Representation of a recording**\n
141/// Used to exchange the available recording data between Kodi and addon on
142/// @ref cpp_kodi_addon_pvr_Recordings "Recordings methods in PVR instance class".
143///
144//------------------------------------------------------------------------------
145
146//##############################################################################
147/// @defgroup cpp_kodi_addon_pvr_Defs_Timer 6. Timer
148/// @ingroup cpp_kodi_addon_pvr_Defs
149/// @brief **PVR add-on timer data**\n
150/// Used to exchange the available timer data between Kodi and addon on
151/// @ref cpp_kodi_addon_pvr_Timers "Timers methods in PVR instance class".
152///
153//------------------------------------------------------------------------------
154
155//##############################################################################
156/// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook 7. Menuhook
157/// @ingroup cpp_kodi_addon_pvr_Defs
158/// @brief **PVR Context menu data**\n
159/// Define data for the context menus available to the user
160///
161//------------------------------------------------------------------------------
162
163//##############################################################################
164/// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry 8. Edit decision list (EDL)
165/// @ingroup cpp_kodi_addon_pvr_Defs
166/// @brief **An edit decision list or EDL is used in the post-production process
167/// of film editing and video editing**\n
168/// Used on @ref kodi::addon::CInstancePVRClient::GetEPGTagEdl and
169/// @ref kodi::addon::CInstancePVRClient::GetRecordingEdl
170///
171//------------------------------------------------------------------------------
172
173//##############################################################################
174/// @defgroup cpp_kodi_addon_pvr_Defs_Stream 9. Inputstream
175/// @ingroup cpp_kodi_addon_pvr_Defs
176/// @brief **Inputstream**\n
177/// This includes classes and values that are used in the PVR inputstream.
178///
179/// Used on @ref cpp_kodi_addon_pvr_Streams "Inputstream methods in PVR instance class".
180///
181/// @note The parts here will be removed in the future and replaced by the
182/// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance".
183/// If there is already a possibility, new addons should do it via the
184/// inputstream instance.
185///
186//------------------------------------------------------------------------------
187
188//}}}
189//______________________________________________________________________________
190
191//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
192// "C++" PVR addon instance class
193//{{{
194
195//==============================================================================
196/// @addtogroup cpp_kodi_addon_pvr
197/// @brief \cpp_class{ kodi::addon::CInstancePVRClient }
198/// **PVR client add-on instance**
199///
200/// Kodi features powerful [Live TV](https://kodi.wiki/view/Live_TV) and
201/// [video recording (DVR/PVR)](http://en.wikipedia.org/wiki/Digital_video_recorder)
202/// abilities using a very flexible distributed application structure. That is, by
203/// leveraging other existing third-party
204/// [PVR backend applications](https://kodi.wiki/view/PVR_backend) or
205/// [DVR devices](https://kodi.wiki/view/PVR_backend)
206/// that specialize in receiving television signals and also support the same type
207/// of [client–server model](http://en.wikipedia.org/wiki/client%E2%80%93server_model)
208/// which Kodi uses, (following a [frontend-backend](http://en.wikipedia.org/wiki/Front_and_back_ends)
209/// design principle for [separation of concerns](http://en.wikipedia.org/wiki/Separation_of_concerns)),
210/// these PVR features in Kodi allow you to watch Live TV, listen to radio, view an EPG TV-Guide
211/// and schedule recordings, and also enables many other TV related features, all using
212/// Kodi as your primary interface once the initial pairing connection and
213/// configuration have been done.
214///
215/// @note It is very important to understand that with "Live TV" in the reference
216/// to PVR in Kodi, we do not mean [streaming video](http://en.wikipedia.org/wiki/Streaming_media)
217/// from the internet via websites providing [free content](https://kodi.wiki/view/Free_content)
218/// or online services such as Netflix, Hulu, Vudu and similar, no matter if that
219/// content is actually streamed live or not. If that is what you are looking for
220/// then you might want to look into [Video Addons](https://kodi.wiki/view/Add-ons)
221/// for Kodi instead, (which again is not the same as the "PVR" or "Live TV" we
222/// discuss in this article), but remember that [Kodi does not provide any video
223/// content or video streaming services](https://kodi.wiki/view/Free_content).
224///
225/// The use of the PVR is based on the @ref CInstancePVRClient.
226///
227/// Include the header @ref PVR.h "#include <kodi/addon-instance/PVR.h>"
228/// to use this class.
229///
230///
231/// ----------------------------------------------------------------------------
232///
233/// Here is an example of what the <b>`addon.xml.in`</b> would look like for an PVR addon:
234///
235/// ~~~~~~~~~~~~~{.xml}
236/// <?xml version="1.0" encoding="UTF-8"?>
237/// <addon
238/// id="pvr.myspecialnamefor"
239/// version="1.0.0"
240/// name="My special PVR addon"
241/// provider-name="Your Name">
242/// <requires>@ADDON_DEPENDS@</requires>
243/// <extension
244/// point="kodi.pvrclient"
245/// library_@PLATFORM@="@LIBRARY_FILENAME@"/>
246/// <extension point="xbmc.addon.metadata">
247/// <summary lang="en_GB">My PVR addon addon</summary>
248/// <description lang="en_GB">My PVR addon description</description>
249/// <platform>@PLATFORM@</platform>
250/// </extension>
251/// </addon>
252/// ~~~~~~~~~~~~~
253///
254///
255/// At <b>`<extension point="kodi.pvrclient" ...>`</b> the basic instance definition is declared, this is intended to identify the addon as an PVR and to see its supported types:
256/// | Name | Description
257/// |------|----------------------
258/// | <b>`point`</b> | The identification of the addon instance to inputstream is mandatory <b>`kodi.pvrclient`</b>. In addition, the instance declared in the first <b>`<extension ... />`</b> is also the main type of addon.
259/// | <b>`library_@PLATFORM@`</b> | The runtime library used for the addon. This is usually declared by cmake and correctly displayed in the translated `addon.xml`.
260///
261///
262/// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml.
263///
264///
265/// --------------------------------------------------------------------------
266///
267/// **Example:**
268///
269/// ~~~~~~~~~~~~~{.cpp}
270/// #include <kodi/addon-instance/PVR.h>
271///
272/// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient
273/// {
274/// public:
275/// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion);
276///
277/// PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) override;
278/// PVR_ERROR GetBackendName(std::string& name) override;
279/// PVR_ERROR GetBackendVersion(std::string& version) override;
280///
281/// PVR_ERROR GetChannelsAmount(int& amount) override;
282/// PVR_ERROR GetChannels(bool radio, std::vector<kodi::addon::PVRChannel>& channels) override;
283/// PVR_ERROR GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
284/// std::vector<kodi::addon::PVRStreamProperty>& properties) override;
285///
286/// private:
287/// std::vector<kodi::addon::PVRChannel> m_myChannels;
288/// };
289///
290/// CMyPVRClient::CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion)
291/// : CInstancePVRClient(instance, kodiVersion)
292/// {
293/// kodi::addon::PVRChannel channel;
294/// channel.SetUniqueId(123);
295/// channel.SetChannelNumber(1);
296/// channel.SetChannelName("My test channel");
297/// m_myChannels.push_back(channel);
298/// }
299///
300/// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities)
301/// {
302/// capabilities.SetSupportsTV(true);
303/// return PVR_ERROR_NO_ERROR;
304/// }
305///
306/// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name)
307/// {
308/// name = "My special PVR client";
309/// return PVR_ERROR_NO_ERROR;
310/// }
311///
312/// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version)
313/// {
314/// version = "1.0.0";
315/// return PVR_ERROR_NO_ERROR;
316/// }
317///
318/// PVR_ERROR CMyInstance::GetChannelsAmount(int& amount)
319/// {
320/// amount = m_myChannels.size();
321/// return PVR_ERROR_NO_ERROR;
322/// }
323///
324/// PVR_ERROR CMyPVRClient::GetChannels(bool radio, std::vector<kodi::addon::PVRChannel>& channels)
325/// {
326/// channels = m_myChannels;
327/// return PVR_ERROR_NO_ERROR;
328/// }
329///
330/// PVR_ERROR CMyPVRClient::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
331/// std::vector<kodi::addon::PVRStreamProperty>& properties)
332/// {
333/// if (channel.GetUniqueId() == 123)
334/// {
335/// properties.push_back(PVR_STREAM_PROPERTY_STREAMURL, "http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4");
336/// properties.push_back(PVR_STREAM_PROPERTY_ISREALTIMESTREAM, "true");
337/// return PVR_ERROR_NO_ERROR;
338/// }
339/// return PVR_ERROR_UNKNOWN;
340/// }
341///
342/// ...
343///
344/// //----------------------------------------------------------------------
345///
346/// class CMyAddon : public ::kodi::addon::CAddonBase
347/// {
348/// public:
349/// CMyAddon() = default;
350/// ADDON_STATUS CreateInstance(int instanceType,
351/// const std::string& instanceID,
352/// KODI_HANDLE instance,
353/// const std::string& version,
354/// KODI_HANDLE& addonInstance) override;
355/// };
356///
357/// // If you use only one instance in your add-on, can be instanceType and
358/// // instanceID ignored
359/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
360/// const std::string& instanceID,
361/// KODI_HANDLE instance,
362/// const std::string& version,
363/// KODI_HANDLE& addonInstance)
364/// {
365/// if (instanceType == ADDON_INSTANCE_PVR)
366/// {
367/// kodi::Log(ADDON_LOG_NOTICE, "Creating my PVR client instance");
368/// addonInstance = new CMyPVRClient(instance, version);
369/// return ADDON_STATUS_OK;
370/// }
371/// else if (...)
372/// {
373/// ...
374/// }
375/// return ADDON_STATUS_UNKNOWN;
376/// }
377///
378/// ADDONCREATOR(CMyAddon)
379/// ~~~~~~~~~~~~~
380///
381/// The destruction of the example class `CMyPVRClient` is called from
382/// Kodi's header. Manually deleting the add-on instance is not required.
383///
384class ATTRIBUTE_HIDDEN CInstancePVRClient : public IAddonInstance
385{
386public:
387 //============================================================================
388 /// @defgroup cpp_kodi_addon_pvr_Base 1. Basic functions
389 /// @ingroup cpp_kodi_addon_pvr
390 /// @brief **Functions to manage the addon and get basic information about it**\n
391 /// These are e.g. @ref GetCapabilities to know supported groups at
392 /// this addon or the others to get information about the source of the PVR
393 /// stream.
394 ///
395 /// The with "Valid implementation required." declared functions are mandatory,
396 /// all others are an option.
397 ///
398 ///
399 ///---------------------------------------------------------------------------
400 ///
401 /// **Basic parts in interface:**\n
402 /// Copy this to your project and extend with your parts or leave functions
403 /// complete away where not used or supported.
404 ///
405 /// @copydetails cpp_kodi_addon_pvr_Base_header_addon_auto_check
406 /// @copydetails cpp_kodi_addon_pvr_Base_source_addon_auto_check
407 ///
408 ///@{
409
410 //============================================================================
411 /// @brief PVR client class constructor.
412 ///
413 /// Used by an add-on that only supports only PVR and only in one instance.
414 ///
415 ///
416 /// --------------------------------------------------------------------------
417 ///
418 /// **Here's example about the use of this:**
419 /// ~~~~~~~~~~~~~{.cpp}
420 /// #include <kodi/addon-instance/PVR.h>
421 /// ...
422 ///
423 /// class ATTRIBUTE_HIDDEN CPVRExample
424 /// : public kodi::addon::CAddonBase,
425 /// public kodi::addon::CInstancePVRClient
426 /// {
427 /// public:
428 /// CPVRExample()
429 /// {
430 /// }
431 ///
432 /// ~CPVRExample() override;
433 /// {
434 /// }
435 ///
436 /// ...
437 /// };
438 ///
439 /// ADDONCREATOR(CPVRExample)
440 /// ~~~~~~~~~~~~~
441 ///
442 CInstancePVRClient() : IAddonInstance(ADDON_INSTANCE_PVR, GetKodiTypeVersion(ADDON_INSTANCE_PVR))
443 {
444 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
445 throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of more as one in single "
446 "instance way is not allowed!");
447
448 SetAddonStruct(CAddonBase::m_interface->firstKodiInstance, m_kodiVersion);
449 CAddonBase::m_interface->globalSingleInstance = this;
450 }
451 //----------------------------------------------------------------------------
452
453 //============================================================================
454 /// @brief PVR client class constructor used to support multiple instance
455 /// types.
456 ///
457 /// @param[in] instance The instance value given to
458 /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>.
459 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
460 /// allow compatibility to older Kodi versions.
461 ///
462 /// @note Recommended to set <b>`kodiVersion`</b>.
463 ///
464 ///
465 /// --------------------------------------------------------------------------
466 ///
467 /// **Here's example about the use of this:**
468 /// ~~~~~~~~~~~~~{.cpp}
469 /// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient
470 /// {
471 /// public:
472 /// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion)
473 /// : CInstancePVRClient(instance, kodiVersion)
474 /// {
475 /// ...
476 /// }
477 ///
478 /// ...
479 /// };
480 ///
481 /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
482 /// const std::string& instanceID,
483 /// KODI_HANDLE instance,
484 /// const std::string& version,
485 /// KODI_HANDLE& addonInstance)
486 /// {
487 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my PVR client instance");
488 /// addonInstance = new CMyPVRClient(instance, version);
489 /// return ADDON_STATUS_OK;
490 /// }
491 /// ~~~~~~~~~~~~~
492 ///
493 explicit CInstancePVRClient(KODI_HANDLE instance, const std::string& kodiVersion = "")
494 : IAddonInstance(ADDON_INSTANCE_PVR,
495 !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_PVR))
496 {
497 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
498 throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of multiple together with "
499 "single instance way is not allowed!");
500
501 SetAddonStruct(instance, m_kodiVersion);
502 }
503 //----------------------------------------------------------------------------
504
505 //============================================================================
506 /// @brief Destructor
507 ///
508 ~CInstancePVRClient() override = default;
509 //----------------------------------------------------------------------------
510
511 //--==----==----==----==----==----==----==----==----==----==----==----==----==
512
513 //============================================================================
514 /// @brief Get the list of features that this add-on provides.
515 ///
516 /// Called by Kodi to query the add-on's capabilities.
517 /// Used to check which options should be presented in the UI, which methods to call, etc.
518 /// All capabilities that the add-on supports should be set to true.
519 ///
520 /// @param capabilities The with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities defined add-on's capabilities.
521 /// @return @ref PVR_ERROR_NO_ERROR if the properties were fetched successfully.
522 ///
523 /// --------------------------------------------------------------------------
524 ///
525 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help
526 ///
527 ///
528 /// --------------------------------------------------------------------------
529 ///
530 /// **Example:**
531 /// ~~~~~~~~~~~~~{.cpp}
532 /// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities)
533 /// {
534 /// capabilities.SetSupportsTV(true);
535 /// capabilities.SetSupportsEPG(true);
536 /// return PVR_ERROR_NO_ERROR;
537 /// }
538 /// ~~~~~~~~~~~~~
539 ///
540 /// --------------------------------------------------------------------------
541 ///
542 /// @note Valid implementation required.
543 ///
544 virtual PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) = 0;
545 //----------------------------------------------------------------------------
546
547 //============================================================================
548 /// @brief Get the name reported by the backend that will be displayed in the UI.
549 ///
550 /// @param[out] name The name reported by the backend that will be displayed in the UI.
551 /// @return @ref PVR_ERROR_NO_ERROR if successfully done
552 ///
553 ///
554 /// --------------------------------------------------------------------------
555 ///
556 /// **Example:**
557 /// ~~~~~~~~~~~~~{.cpp}
558 /// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name)
559 /// {
560 /// name = "My special PVR client";
561 /// return PVR_ERROR_NO_ERROR;
562 /// }
563 /// ~~~~~~~~~~~~~
564 ///
565 /// --------------------------------------------------------------------------
566 ///
567 /// @note Valid implementation required.
568 ///
569 virtual PVR_ERROR GetBackendName(std::string& name) = 0;
570 //----------------------------------------------------------------------------
571
572 //============================================================================
573 /// @brief Get the version string reported by the backend that will be
574 /// displayed in the UI.
575 ///
576 /// @param[out] version The version string reported by the backend that will be
577 /// displayed in the UI.
578 /// @return @ref PVR_ERROR_NO_ERROR if successfully done
579 ///
580 ///
581 /// --------------------------------------------------------------------------
582 ///
583 /// **Example:**
584 /// ~~~~~~~~~~~~~{.cpp}
585 /// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version)
586 /// {
587 /// version = "1.0.0";
588 /// return PVR_ERROR_NO_ERROR;
589 /// }
590 /// ~~~~~~~~~~~~~
591 ///
592 /// --------------------------------------------------------------------------
593 ///
594 /// @note Valid implementation required.
595 ///
596 virtual PVR_ERROR GetBackendVersion(std::string& version) = 0;
597 //----------------------------------------------------------------------------
598
599 //============================================================================
600 /// @brief Get the hostname of the pvr backend server
601 ///
602 /// @param[out] hostname Hostname as ip address or alias. If backend does not
603 /// utilize a server, return empty string.
604 /// @return @ref PVR_ERROR_NO_ERROR if successfully done
605 ///
606 virtual PVR_ERROR GetBackendHostname(std::string& hostname) { return PVR_ERROR_NOT_IMPLEMENTED; }
607 //----------------------------------------------------------------------------
608
609 //============================================================================
610 /// @brief To get the connection string reported by the backend that will be
611 /// displayed in the UI.
612 ///
613 /// @param[out] connection The connection string reported by the backend that
614 /// will be displayed in the UI.
615 /// @return @ref PVR_ERROR_NO_ERROR if successfully done
616 ///
617 virtual PVR_ERROR GetConnectionString(std::string& connection)
618 {
619 return PVR_ERROR_NOT_IMPLEMENTED;
620 }
621 //----------------------------------------------------------------------------
622
623 //============================================================================
624 /// @brief Get the disk space reported by the backend (if supported).
625 ///
626 /// @param[in] total The total disk space in bytes.
627 /// @param[in] used The used disk space in bytes.
628 /// @return @ref PVR_ERROR_NO_ERROR if the drive space has been fetched
629 /// successfully.
630 ///
631 ///
632 /// --------------------------------------------------------------------------
633 ///
634 /// **Example:**
635 /// ~~~~~~~~~~~~~{.cpp}
636 /// PVR_ERROR CMyPVRClient::GetDriveSpace(uint64_t& total, uint64_t& used)
637 /// {
638 /// total = 10 * 1024 * 1024 * 1024; // To set complete size of drive in bytes
639 /// used = 122324243; // To set the used amount
640 /// return PVR_ERROR_NO_ERROR;
641 /// }
642 /// ~~~~~~~~~~~~~
643 ///
644 virtual PVR_ERROR GetDriveSpace(uint64_t& total, uint64_t& used)
645 {
646 return PVR_ERROR_NOT_IMPLEMENTED;
647 }
648 //----------------------------------------------------------------------------
649
650 //============================================================================
651 /// @brief Call one of the settings related menu hooks (if supported).
652 ///
653 /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook "menu hook "
654 /// instances have to be added in `constructor()`, by calling @ref AddMenuHook()
655 /// on the callback.
656 ///
657 /// @param[in] menuhook The hook to call.
658 /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully.
659 ///
660 /// --------------------------------------------------------------------------
661 ///
662 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
663 ///
664 ///
665 /// --------------------------------------------------------------------------
666 ///
667 /// **Example:**
668 /// ~~~~~~~~~~~~~{.cpp}
669 /// PVR_ERROR CMyPVRClient::CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook)
670 /// {
671 /// if (menuhook.GetHookId() == 2)
672 /// kodi::QueueNotification(QUEUE_INFO, "", kodi::GetLocalizedString(menuhook.GetLocalizedStringId()));
673 /// return PVR_ERROR_NO_ERROR;
674 /// }
675 /// ~~~~~~~~~~~~~
676 ///
677 virtual PVR_ERROR CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook)
678 {
679 return PVR_ERROR_NOT_IMPLEMENTED;
680 }
681 //----------------------------------------------------------------------------
682
683 //==========================================================================
684 /// @brief **Callback to Kodi Function**\nAdd or replace a menu hook for the context menu for this add-on
685 ///
686 /// This is a callback function, called from addon to give Kodi his context menu's.
687 ///
688 /// @param[in] menuhook The with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook defined hook to add
689 ///
690 /// @remarks Only called from addon itself
691 ///
692 /// --------------------------------------------------------------------------
693 ///
694 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
695 ///
696 ///
697 /// --------------------------------------------------------------------------
698 ///
699 /// **Here's an example of the use of it:**
700 /// ~~~~~~~~~~~~~{.cpp}
701 /// #include <kodi/addon-instance/PVR.h>
702 /// ...
703 ///
704 /// {
705 /// kodi::addon::PVRMenuhook hook;
706 /// hook.SetHookId(1);
707 /// hook.SetCategory(PVR_MENUHOOK_CHANNEL);
708 /// hook.SetLocalizedStringId(30000);
709 /// AddMenuHook(hook);
710 /// }
711 ///
712 /// {
713 /// kodi::addon::PVRMenuhook hook;
714 /// hook.SetHookId(2);
715 /// hook.SetCategory(PVR_MENUHOOK_SETTING);
716 /// hook.SetLocalizedStringId(30001);
717 /// AddMenuHook(hook);
718 /// }
719 /// ...
720 /// ~~~~~~~~~~~~~
721 ///
722 /// **Here another way:**
723 /// ~~~~~~~~~~~~~{.cpp}
724 /// #include <kodi/addon-instance/PVR.h>
725 /// ...
726 ///
727 /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30000, PVR_MENUHOOK_CHANNEL));
728 /// AddMenuHook(kodi::addon::PVRMenuhook(2, 30001, PVR_MENUHOOK_SETTING));
729 /// ...
730 /// ~~~~~~~~~~~~~
731 ///
732 inline void AddMenuHook(const kodi::addon::PVRMenuhook& hook)
733 {
734 m_instanceData->toKodi->AddMenuHook(m_instanceData->toKodi->kodiInstance, hook);
735 }
736 //----------------------------------------------------------------------------
737
738 //==========================================================================
739 /// @brief **Callback to Kodi Function**\n
740 /// Notify a state change for a PVR backend connection.
741 ///
742 /// @param[in] connectionString The connection string reported by the backend
743 /// that can be displayed in the UI.
744 /// @param[in] newState The by @ref PVR_CONNECTION_STATE defined new state.
745 /// @param[in] message A localized addon-defined string representing the new
746 /// state, that can be displayed in the UI or **empty** if
747 /// the Kodi-defined default string for the new state
748 /// shall be displayed.
749 ///
750 /// @remarks Only called from addon itself
751 ///
752 ///
753 /// --------------------------------------------------------------------------
754 ///
755 ///
756 /// **Here's an example of the use of it:**
757 /// ~~~~~~~~~~~~~{.cpp}
758 /// #include <kodi/addon-instance/PVR.h>
759 /// #include <kodi/General.h> /* for kodi::GetLocalizedString(...) */
760 /// ...
761 ///
762 /// ConnectionStateChange("PVR demo connection lost", PVR_CONNECTION_STATE_DISCONNECTED, kodi::GetLocalizedString(30005, "Lost connection to Server"););
763 /// ...
764 /// ~~~~~~~~~~~~~
765 ///
766 inline void ConnectionStateChange(const std::string& connectionString,
767 PVR_CONNECTION_STATE newState,
768 const std::string& message)
769 {
770 m_instanceData->toKodi->ConnectionStateChange(
771 m_instanceData->toKodi->kodiInstance, connectionString.c_str(), newState, message.c_str());
772 }
773 //----------------------------------------------------------------------------
774
775 //==========================================================================
776 /// @brief **Callback to Kodi Function**\n
777 /// Get user data path of the PVR addon.
778 ///
779 /// @return Path of current Kodi user
780 ///
781 /// @remarks Only called from addon itself
782 ///
783 /// @note Alternatively, @ref kodi::GetAddonPath() can be used for this.
784 ///
785 inline std::string UserPath() const { return m_instanceData->props->strUserPath; }
786 //----------------------------------------------------------------------------
787
788 //==========================================================================
789 /// @brief **Callback to Kodi Function**\n
790 /// Get main client path of the PVR addon.
791 ///
792 /// @return Path of addon client
793 ///
794 /// @remarks Only called from addon itself.
795 ///
796 /// @note Alternatively, @ref kodi::GetBaseUserPath() can be used for this.
797 ///
798 inline std::string ClientPath() const { return m_instanceData->props->strClientPath; }
799 //----------------------------------------------------------------------------
800
801 ///@}
802 //--==----==----==----==----==----==----==----==----==----==----==----==----==
803
804 //============================================================================
805 /// @defgroup cpp_kodi_addon_pvr_Channels 2. Channels (required)
806 /// @ingroup cpp_kodi_addon_pvr
807 /// @brief **Functions to get available TV or Radio channels**\n
808 /// These are mandatory functions for using this addon to get the available
809 /// channels.
810 ///
811 /// @remarks Either @ref PVRCapabilities::SetSupportsTV "SetSupportsTV()" or
812 /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio()" is required to
813 /// be set to <b>`true`</b>.\n
814 /// If a channel changes after the initial import, or if a new one was added,
815 /// then the add-on should call @ref TriggerChannelUpdate().
816 ///
817 ///
818 ///---------------------------------------------------------------------------
819 ///
820 /// **Channel parts in interface:**\n
821 /// Copy this to your project and extend with your parts or leave functions
822 /// complete away where not used or supported.
823 ///
824 /// @copydetails cpp_kodi_addon_pvr_Channels_header_addon_auto_check
825 /// @copydetails cpp_kodi_addon_pvr_Channels_source_addon_auto_check
826 ///
827 ///@{
828
829 //============================================================================
830 /// @brief The total amount of channels on the backend
831 ///
832 /// @param[out] amount The total amount of channels on the backend
833 /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully.
834 ///
835 /// @remarks Valid implementation required.
836 ///
837 virtual PVR_ERROR GetChannelsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; }
838 //----------------------------------------------------------------------------
839
840 //============================================================================
841 /// @brief Request the list of all channels from the backend.
842 ///
843 /// @param[in] radio True to get the radio channels, false to get the TV channels.
844 /// @param[out] results The channels defined with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel
845 /// and available at the addon, them transferred with
846 /// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet.
847 /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully.
848 ///
849 /// --------------------------------------------------------------------------
850 ///
851 /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help
852 ///
853 ///
854 /// --------------------------------------------------------------------------
855 ///
856 /// @remarks
857 /// If @ref PVRCapabilities::SetSupportsTV() is set to
858 /// <b>`true`</b>, a valid result set needs to be provided for <b>`radio = false`</b>.\n
859 /// If @ref PVRCapabilities::SetSupportsRadio() is set to
860 /// <b>`true`</b>, a valid result set needs to be provided for <b>`radio = true`</b>.
861 /// At least one of these two must provide a valid result set.
862 ///
863 ///
864 ///---------------------------------------------------------------------------
865 ///
866 /// **Example:**
867 /// ~~~~~~~~~~~~~{.cpp}
868 /// ...
869 /// PVR_ERROR CMyPVRInstance::GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results)
870 /// {
871 /// // Minimal demo example, in reality bigger and loop to transfer all
872 /// kodi::addon::PVRChannel channel;
873 /// channel.SetUniqueId(123);
874 /// channel.SetIsRadio(false);
875 /// channel.SetChannelNumber(1);
876 /// channel.SetChannelName("My channel name");
877 /// ...
878 ///
879 /// // Give it now to Kodi
880 /// results.Add(channel);
881 /// return PVR_ERROR_NO_ERROR;
882 /// }
883 /// ...
884 /// ~~~~~~~~~~~~~
885 ///
886 virtual PVR_ERROR GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results)
887 {
888 return PVR_ERROR_NOT_IMPLEMENTED;
889 }
890 //----------------------------------------------------------------------------
891
892 //============================================================================
893 /// @brief Get the stream properties for a channel from the backend.
894 ///
895 /// @param[in] channel The channel to get the stream properties for.
896 /// @param[out] properties the properties required to play the stream.
897 /// @return @ref PVR_ERROR_NO_ERROR if the stream is available.
898 ///
899 /// @remarks If @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" or
900 /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" are set to true
901 /// and @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" is
902 /// set to false.\n\n
903 /// In this case the implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL
904 /// with the URL Kodi should resolve to playback the channel.
905 ///
906 /// @note The value directly related to inputstream must always begin with the
907 /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>.
908 ///
909 ///
910 ///---------------------------------------------------------------------------
911 ///
912 /// **Example:**
913 /// ~~~~~~~~~~~~~{.cpp}
914 /// ...
915 /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
916 /// std::vector<kodi::addon::PVRStreamProperty>& properties)
917 /// {
918 /// ...
919 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
920 /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd");
921 /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full");
922 /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash");
923 /// return PVR_ERROR_NO_ERROR;
924 /// }
925 /// ...
926 /// ~~~~~~~~~~~~~
927 ///
928 virtual PVR_ERROR GetChannelStreamProperties(
929 const kodi::addon::PVRChannel& channel,
930 std::vector<kodi::addon::PVRStreamProperty>& properties)
931 {
932 return PVR_ERROR_NOT_IMPLEMENTED;
933 }
934 //----------------------------------------------------------------------------
935
936 //============================================================================
937 /// @brief Get the signal status of the stream that's currently open.
938 ///
939 /// @param[out] signalStatus The signal status.
940 /// @return @ref PVR_ERROR_NO_ERROR if the signal status has been read successfully, false otherwise.
941 ///
942 /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream"
943 /// is set to true.
944 ///
945 /// --------------------------------------------------------------------------
946 ///
947 /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help
948 ///
949 ///
950 /// --------------------------------------------------------------------------
951 ///
952 ///
953 /// **Here's example about the use of this:**
954 /// ~~~~~~~~~~~~~{.cpp}
955 /// #include <kodi/addon-instance/PVR.h>
956 /// ...
957 ///
958 /// class ATTRIBUTE_HIDDEN CPVRExample
959 /// : public kodi::addon::CAddonBase,
960 /// public kodi::addon::CInstancePVRClient
961 /// {
962 /// public:
963 /// ...
964 /// PVR_ERROR SignalStatus(PVRSignalStatus &signalStatus) override
965 /// {
966 /// signalStatus.SetAapterName("Example adapter 1");
967 /// signalStatus.SetAdapterStatus("OK");
968 /// signalStatus.SetSignal(0xFFFF); // 100%
969 ///
970 /// return PVR_ERROR_NO_ERROR;
971 /// }
972 /// };
973 ///
974 /// ADDONCREATOR(CPVRExample)
975 /// ~~~~~~~~~~~~~
976 ///
977 virtual PVR_ERROR GetSignalStatus(int channelUid, kodi::addon::PVRSignalStatus& signalStatus)
978 {
979 return PVR_ERROR_NOT_IMPLEMENTED;
980 }
981 //----------------------------------------------------------------------------
982
983 //============================================================================
984 /// @brief Get the descramble information of the stream that's currently open.
985 ///
986 /// @param[out] descrambleInfo The descramble information.
987 /// @return @ref PVR_ERROR_NO_ERROR if the descramble information has been
988 /// read successfully, false otherwise.
989 ///
990 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsDescrambleInfo "supportsDescrambleInfo"
991 /// is set to true.
992 ///
993 /// --------------------------------------------------------------------------
994 ///
995 /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help
996 ///
997 virtual PVR_ERROR GetDescrambleInfo(int channelUid,
998 kodi::addon::PVRDescrambleInfo& descrambleInfo)
999 {
1000 return PVR_ERROR_NOT_IMPLEMENTED;
1001 }
1002 //----------------------------------------------------------------------------
1003
1004 //============================================================================
1005 /// @brief **Callback to Kodi Function**\n
1006 /// Request Kodi to update it's list of channels.
1007 ///
1008 /// @remarks Only called from addon itself.
1009 ///
1010 inline void TriggerChannelUpdate()
1011 {
1012 m_instanceData->toKodi->TriggerChannelUpdate(m_instanceData->toKodi->kodiInstance);
1013 }
1014 //----------------------------------------------------------------------------
1015
1016 ///@}
1017 //--==----==----==----==----==----==----==----==----==----==----==----==----==
1018
1019 //============================================================================
1020 /// @defgroup cpp_kodi_addon_pvr_supportsChannelGroups 3. Channel Groups (optional)
1021 /// @ingroup cpp_kodi_addon_pvr
1022 /// @brief <b>Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups"
1023 /// to true</b>\n
1024 /// This is used to divide available addon channels into groups, which can
1025 /// then be selected by the user.
1026 ///
1027 ///
1028 ///---------------------------------------------------------------------------
1029 ///
1030 /// **Channel group parts in interface:**\n
1031 /// Copy this to your project and extend with your parts or leave functions
1032 /// complete away where not used or supported.
1033 ///
1034 /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_header_addon_auto_check
1035 /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_source_addon_auto_check
1036 ///
1037 ///@{
1038
1039 //============================================================================
1040 /// @brief Get the total amount of channel groups on the backend if it supports channel groups.
1041 ///
1042 /// @param[out] amount The total amount of channel groups on the backend
1043 /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully.
1044 ///
1045 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" is set to true.
1046 ///
1047 virtual PVR_ERROR GetChannelGroupsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; }
1048 //----------------------------------------------------------------------------
1049
1050 //============================================================================
1051 /// @brief Get a list of available channel groups on addon
1052 ///
1053 /// Request the list of all channel groups from the backend if it supports
1054 /// channel groups.
1055 ///
1056 /// @param[in] radio True to get the radio channel groups, false to get the
1057 /// TV channel groups.
1058 /// @param[out] results List of available groups on addon defined with
1059 /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup,
1060 /// them transferred with
1061 /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet.
1062 /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully.
1063 ///
1064 /// --------------------------------------------------------------------------
1065 ///
1066 /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help
1067 ///
1068 ///
1069 /// --------------------------------------------------------------------------
1070 ///
1071 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups"
1072 /// is set to true.
1073 ///
1074 ///
1075 ///---------------------------------------------------------------------------
1076 ///
1077 /// **Example:**
1078 /// ~~~~~~~~~~~~~{.cpp}
1079 /// ...
1080 /// PVR_ERROR CMyPVRInstance::GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& groups)
1081 /// {
1082 /// kodi::addon::PVRChannelGroup group;
1083 /// group.SetIsRadio(false);
1084 /// group.SetGroupName("My group name");
1085 /// group.SetPosition(1);
1086 /// ...
1087 ///
1088 /// // Give it now to Kodi
1089 /// results.Add(group);
1090 /// return PVR_ERROR_NO_ERROR;
1091 /// }
1092 /// ...
1093 /// ~~~~~~~~~~~~~
1094 ///
1095 virtual PVR_ERROR GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& results)
1096 {
1097 return PVR_ERROR_NOT_IMPLEMENTED;
1098 }
1099 //----------------------------------------------------------------------------
1100
1101 //============================================================================
1102 /// @brief Get a list of members on a group
1103 ///
1104 /// Request the list of all group members of a group from the backend if it
1105 /// supports channel groups.
1106 ///
1107 /// @param[in] group The group to get the members for.
1108 /// @param[out] results List of available group member channels defined with
1109 /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember,
1110 /// them transferred with
1111 /// @ref PVRChannelGroupMembersResultSet.
1112 /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully.
1113 ///
1114 /// --------------------------------------------------------------------------
1115 ///
1116 /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help
1117 ///
1118 /// --------------------------------------------------------------------------
1119 ///
1120 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups"
1121 /// is set to true.
1122 ///
1123 ///
1124 ///---------------------------------------------------------------------------
1125 ///
1126 /// **Example:**
1127 /// ~~~~~~~~~~~~~{.cpp}
1128 /// ...
1129 /// PVR_ERROR CMyPVRInstance::GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group,
1130 /// kodi::addon::PVRChannelGroupMembersResultSet& results)
1131 /// {
1132 /// for (const auto& myGroup : m_myGroups)
1133 /// {
1134 /// if (myGroup.strGroupName == group.GetGroupName())
1135 /// {
1136 /// for (unsigned int iChannelPtr = 0; iChannelPtr < myGroup.members.size(); iChannelPtr++)
1137 /// {
1138 /// int iId = myGroup.members.at(iChannelPtr) - 1;
1139 /// if (iId < 0 || iId > (int)m_channels.size() - 1)
1140 /// continue;
1141 ///
1142 /// PVRDemoChannel &channel = m_channels.at(iId);
1143 /// kodi::addon::PVRChannelGroupMember kodiGroupMember;
1144 /// kodiGroupMember.SetGroupName(group.GetGroupName());
1145 /// kodiGroupMember.SetChannelUniqueId(channel.iUniqueId);
1146 /// kodiGroupMember.SetChannelNumber(channel.iChannelNumber);
1147 /// kodiGroupMember.SetSubChannelNumber(channel.iSubChannelNumber);
1148 ///
1149 /// results.Add(kodiGroupMember);
1150 /// }
1151 /// }
1152 /// }
1153 /// return PVR_ERROR_NO_ERROR;
1154 /// }
1155 /// ...
1156 /// ~~~~~~~~~~~~~
1157 ///
1158 virtual PVR_ERROR GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group,
1159 kodi::addon::PVRChannelGroupMembersResultSet& results)
1160 {
1161 return PVR_ERROR_NOT_IMPLEMENTED;
1162 }
1163 //----------------------------------------------------------------------------
1164
1165 //============================================================================
1166 /// @brief **Callback to Kodi Function**\n
1167 /// Request Kodi to update it's list of channel groups.
1168 ///
1169 /// @remarks Only called from addon itself
1170 ///
1171 inline void TriggerChannelGroupsUpdate()
1172 {
1173 m_instanceData->toKodi->TriggerChannelGroupsUpdate(m_instanceData->toKodi->kodiInstance);
1174 }
1175 //----------------------------------------------------------------------------
1176
1177 ///@}
1178 //--==----==----==----==----==----==----==----==----==----==----==----==----==
1179
1180 //============================================================================
1181 /// @defgroup cpp_kodi_addon_pvr_supportsChannelEdit 4. Channel edit (optional)
1182 /// @ingroup cpp_kodi_addon_pvr
1183 /// @brief <b>Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings"
1184 /// to true or for @ref OpenDialogChannelScan() set @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan"
1185 /// to true</b>\n
1186 /// The support of this is a pure option and not mandatory.
1187 ///
1188 ///
1189 ///---------------------------------------------------------------------------
1190 ///
1191 /// **Channel edit parts in interface:**\n
1192 /// Copy this to your project and extend with your parts or leave functions
1193 /// complete away where not used or supported.
1194 ///
1195 /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_header_addon_auto_check
1196 /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_source_addon_auto_check
1197 ///
1198 ///@{
1199
1200 //============================================================================
1201 /// @brief Delete a channel from the backend.
1202 ///
1203 /// @param[in] channel The channel to delete.
1204 /// @return @ref PVR_ERROR_NO_ERROR if the channel has been deleted successfully.
1205 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings"
1206 /// is set to true.
1207 ///
1208 virtual PVR_ERROR DeleteChannel(const kodi::addon::PVRChannel& channel)
1209 {
1210 return PVR_ERROR_NOT_IMPLEMENTED;
1211 }
1212 //----------------------------------------------------------------------------
1213
1214 //==========================================================================
1215 /// @brief Rename a channel on the backend.
1216 ///
1217 /// @param[in] channel The channel to rename, containing the new channel name.
1218 /// @return @ref PVR_ERROR_NO_ERROR if the channel has been renamed successfully.
1219 ///
1220 /// --------------------------------------------------------------------------
1221 ///
1222 /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help
1223 ///
1224 ///
1225 /// --------------------------------------------------------------------------
1226 ///
1227 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings"
1228 /// is set to true.
1229 ///
1230 virtual PVR_ERROR RenameChannel(const kodi::addon::PVRChannel& channel)
1231 {
1232 return PVR_ERROR_NOT_IMPLEMENTED;
1233 }
1234 //----------------------------------------------------------------------------
1235
1236 //==========================================================================
1237 /// @brief Show the channel settings dialog, if supported by the backend.
1238 ///
1239 /// @param[in] channel The channel to show the dialog for.
1240 /// @return @ref PVR_ERROR_NO_ERROR if the dialog has been displayed successfully.
1241 ///
1242 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true.
1243 /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them.
1244 ///
1245 virtual PVR_ERROR OpenDialogChannelSettings(const kodi::addon::PVRChannel& channel)
1246 {
1247 return PVR_ERROR_NOT_IMPLEMENTED;
1248 }
1249 //----------------------------------------------------------------------------
1250
1251 //==========================================================================
1252 /// @brief Show the dialog to add a channel on the backend, if supported by the backend.
1253 ///
1254 /// @param[in] channel The channel to add.
1255 /// @return @ref PVR_ERROR_NO_ERROR if the channel has been added successfully.
1256 ///
1257 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true.
1258 /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them.
1259 ///
1260 virtual PVR_ERROR OpenDialogChannelAdd(const kodi::addon::PVRChannel& channel)
1261 {
1262 return PVR_ERROR_NOT_IMPLEMENTED;
1263 }
1264 //----------------------------------------------------------------------------
1265
1266 //==========================================================================
1267 /// @brief Show the channel scan dialog if this backend supports it.
1268 ///
1269 /// @return @ref PVR_ERROR_NO_ERROR if the dialog was displayed successfully.
1270 ///
1271 /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan" is set to true.
1272 /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them.
1273 ///
1274 virtual PVR_ERROR OpenDialogChannelScan() { return PVR_ERROR_NOT_IMPLEMENTED; }
1275 //----------------------------------------------------------------------------
1276
1277 //==========================================================================
1278 /// @brief Call one of the channel related menu hooks (if supported).
1279 ///
1280 /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in
1281 /// `constructor()`, by calling @ref AddMenuHook() on the callback.
1282 ///
1283 /// @param[in] menuhook The hook to call.
1284 /// @param[in] item The selected channel item for which the hook was called.
1285 /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully.
1286 ///
1287 /// --------------------------------------------------------------------------
1288 ///
1289 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
1290 ///
1291 virtual PVR_ERROR CallChannelMenuHook(const kodi::addon::PVRMenuhook& menuhook,
1292 const kodi::addon::PVRChannel& item)
1293 {
1294 return PVR_ERROR_NOT_IMPLEMENTED;
1295 }
1296 //----------------------------------------------------------------------------
1297
1298 ///@}
1299 //--==----==----==----==----==----==----==----==----==----==----==----==----==
1300
1301 //============================================================================
1302 /// @defgroup cpp_kodi_addon_pvr_EPGTag 4. EPG methods (optional)
1303 /// @ingroup cpp_kodi_addon_pvr
1304 /// @brief **PVR EPG methods**\n
1305 /// These C ++ class functions of are intended for processing EPG information
1306 /// and for giving it to Kodi.
1307 ///
1308 /// The necessary data is transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag.
1309 ///
1310 /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsEPG "supportsEPG"
1311 /// is set to true.\n\n
1312 ///
1313 ///
1314 ///---------------------------------------------------------------------------
1315 ///
1316 /// **EPG parts in interface:**\n
1317 /// Copy this to your project and extend with your parts or leave functions
1318 /// complete away where not used or supported.
1319 ///
1320 /// @copydetails cpp_kodi_addon_pvr_EPGTag_header_addon_auto_check
1321 /// @copydetails cpp_kodi_addon_pvr_EPGTag_source_addon_auto_check
1322 ///
1323 ///@{
1324
1325 //============================================================================
1326 /// @brief Request the EPG for a channel from the backend.
1327 ///
1328 /// @param[in] channelUid The UID of the channel to get the EPG table for.
1329 /// @param[in] start Get events after this time (UTC).
1330 /// @param[in] end Get events before this time (UTC).
1331 /// @param[out] results List where available EPG information becomes
1332 /// transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag
1333 /// and given to Kodi
1334 /// @return @ref PVR_ERROR_NO_ERROR if the table has been fetched successfully.
1335 ///
1336 /// --------------------------------------------------------------------------
1337 ///
1338 /// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help
1339 ///
1340 ///
1341 /// --------------------------------------------------------------------------
1342 ///
1343 /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true.
1344 ///
1345 ///
1346 ///---------------------------------------------------------------------------
1347 ///
1348 /// **Example:**
1349 /// ~~~~~~~~~~~~~{.cpp}
1350 /// ...
1351 /// PVR_ERROR CMyPVRInstance::GetEPGForChannel(int channelUid,
1352 /// time_t start,
1353 /// time_t end,
1354 /// kodi::addon::PVREPGTagsResultSet& results)
1355 /// {
1356 /// // Minimal demo example, in reality bigger, loop to transfer all and to
1357 /// // match wanted times.
1358 /// kodi::addon::PVREPGTag tag;
1359 /// tag.SetUniqueBroadcastId(123);
1360 /// tag.SetUniqueChannelId(123);
1361 /// tag.SetTitle("My epg entry name");
1362 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA);
1363 /// tag.SetStartTime(1589148283); // Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC
1364 /// tag.SetEndTime(1589151913);
1365 /// ...
1366 ///
1367 /// // Give it now to Kodi
1368 /// results.Add(tag);
1369 /// return PVR_ERROR_NO_ERROR;
1370 /// }
1371 /// ...
1372 /// ~~~~~~~~~~~~~
1373 ///
1374 virtual PVR_ERROR GetEPGForChannel(int channelUid,
1375 time_t start,
1376 time_t end,
1377 kodi::addon::PVREPGTagsResultSet& results)
1378 {
1379 return PVR_ERROR_NOT_IMPLEMENTED;
1380 }
1381 //----------------------------------------------------------------------------
1382
1383 //============================================================================
1384 /// @brief Check if the given EPG tag can be recorded.
1385 ///
1386 /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check.
1387 /// @param[out] isRecordable Set to true if the tag can be recorded.
1388 /// @return @ref PVR_ERROR_NO_ERROR if bIsRecordable has been set successfully.
1389 ///
1390 /// @remarks Optional, it return @ref PVR_ERROR_NOT_IMPLEMENTED by parent to let Kodi decide.
1391 ///
1392 virtual PVR_ERROR IsEPGTagRecordable(const kodi::addon::PVREPGTag& tag, bool& isRecordable)
1393 {
1394 return PVR_ERROR_NOT_IMPLEMENTED;
1395 }
1396 //----------------------------------------------------------------------------
1397
1398 //============================================================================
1399 /// @brief Check if the given EPG tag can be played.
1400 ///
1401 /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check.
1402 /// @param[out] isPlayable Set to true if the tag can be played.
1403 /// @return @ref PVR_ERROR_NO_ERROR if bIsPlayable has been set successfully.
1404 ///
1405 /// @remarks Required if add-on supports playing epg tags.
1406 ///
1407 virtual PVR_ERROR IsEPGTagPlayable(const kodi::addon::PVREPGTag& tag, bool& isPlayable)
1408 {
1409 return PVR_ERROR_NOT_IMPLEMENTED;
1410 }
1411 //----------------------------------------------------------------------------
1412
1413 //============================================================================
1414 /// @brief Retrieve the edit decision list (EDL) of an EPG tag on the backend.
1415 ///
1416 /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag".
1417 /// @param[out] edl The function has to write the EDL into this array.
1418 /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists.
1419 ///
1420 /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true.
1421 ///
1422 /// --------------------------------------------------------------------------
1423 ///
1424 /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help
1425 ///
1426 ///
1427 /// --------------------------------------------------------------------------
1428 ///
1429 /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true.
1430 ///
1431 virtual PVR_ERROR GetEPGTagEdl(const kodi::addon::PVREPGTag& tag,
1432 std::vector<kodi::addon::PVREDLEntry>& edl)
1433 {
1434 return PVR_ERROR_NOT_IMPLEMENTED;
1435 }
1436 //----------------------------------------------------------------------------
1437
1438 //============================================================================
1439 /// @brief Get the stream properties for an epg tag from the backend.
1440 ///
1441 /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to get the stream properties for.
1442 /// @param[out] properties the properties required to play the stream.
1443 /// @return @ref PVR_ERROR_NO_ERROR if the stream is available.
1444 ///
1445 /// @remarks Required if add-on supports playing epg tags.
1446 /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL
1447 /// with the URL Kodi should resolve to playback the epg tag.
1448 /// It return @ref PVR_ERROR_NOT_IMPLEMENTED from parent if this add-on won't provide this function.
1449 ///
1450 /// @note The value directly related to inputstream must always begin with the
1451 /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>.
1452 ///
1453 ///
1454 ///---------------------------------------------------------------------------
1455 ///
1456 /// **Example:**
1457 /// ~~~~~~~~~~~~~{.cpp}
1458 /// ...
1459 /// PVR_ERROR CMyPVRInstance::GetEPGTagStreamProperties(const kodi::addon::PVREPGTag& tag,
1460 /// std::vector<kodi::addon::PVRStreamProperty>& properties)
1461 /// {
1462 /// ...
1463 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
1464 /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd");
1465 /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full");
1466 /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash");
1467 /// return PVR_ERROR_NO_ERROR;
1468 /// }
1469 /// ...
1470 /// ~~~~~~~~~~~~~
1471 ///
1472 virtual PVR_ERROR GetEPGTagStreamProperties(
1473 const kodi::addon::PVREPGTag& tag, std::vector<kodi::addon::PVRStreamProperty>& properties)
1474 {
1475 return PVR_ERROR_NOT_IMPLEMENTED;
1476 }
1477 //----------------------------------------------------------------------------
1478
1479 //============================================================================
1480 /// @brief Tell the client the time frame to use when notifying epg events back to Kodi
1481 ///
1482 /// The client might push epg events asynchronously to Kodi using the callback function
1483 /// @ref EpgEventStateChange. To be able to only push events that are actually of
1484 /// interest for Kodi, client needs to know about the epg time frame Kodi uses. Kodi
1485 /// supplies the current epg time frame value in @ref EpgMaxDays() when creating the
1486 /// addon and calls @ref SetEPGTimeFrame later whenever Kodi's epg time frame value
1487 /// changes.
1488 ///
1489 /// @param[in] days number of days from "now". @ref EPG_TIMEFRAME_UNLIMITED means that Kodi
1490 /// is interested in all epg events, regardless of event times.
1491 /// @return @ref PVR_ERROR_NO_ERROR if new value was successfully set.
1492 ///
1493 /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true.
1494 ///
1495 virtual PVR_ERROR SetEPGTimeFrame(int days) { return PVR_ERROR_NOT_IMPLEMENTED; }
1496 //----------------------------------------------------------------------------
1497
1498 //==========================================================================
1499 /// @brief Call one of the EPG related menu hooks (if supported).
1500 ///
1501 /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in
1502 /// `constructor()`, by calling @ref AddMenuHook() on the callback.
1503 ///
1504 /// @param[in] menuhook The hook to call.
1505 /// @param[in] tag The selected EPG item for which the hook was called.
1506 /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully.
1507 ///
1508 /// --------------------------------------------------------------------------
1509 ///
1510 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
1511 ///
1512 virtual PVR_ERROR CallEPGMenuHook(const kodi::addon::PVRMenuhook& menuhook,
1513 const kodi::addon::PVREPGTag& tag)
1514 {
1515 return PVR_ERROR_NOT_IMPLEMENTED;
1516 }
1517 //----------------------------------------------------------------------------
1518
1519 //==========================================================================
1520 /// @brief **Callback to Kodi Function**\n
1521 /// Get the Max days handled by Kodi.
1522 ///
1523 /// If > @ref EPG_TIMEFRAME_UNLIMITED, in async epg mode, deliver only events
1524 /// in the range from 'end time > now' to 'start time < now + EpgMaxDays().
1525 /// @ref EPG_TIMEFRAME_UNLIMITED, notify all events.
1526 ///
1527 /// @return The Max days handled by Kodi
1528 ///
1529 inline int EpgMaxDays() const { return m_instanceData->props->iEpgMaxDays; }
1530 //----------------------------------------------------------------------------
1531
1532 //==========================================================================
1533 /// @brief **Callback to Kodi Function**\n
1534 /// Schedule an EPG update for the given channel channel.
1535 ///
1536 /// @param[in] channelUid The unique id of the channel for this add-on
1537 ///
1538 /// @remarks Only called from addon itself
1539 ///
1540 inline void TriggerEpgUpdate(unsigned int channelUid)
1541 {
1542 m_instanceData->toKodi->TriggerEpgUpdate(m_instanceData->toKodi->kodiInstance, channelUid);
1543 }
1544 //----------------------------------------------------------------------------
1545
1546 //==========================================================================
1547 /// @brief **Callback to Kodi Function**\n
1548 /// Notify a state change for an EPG event.
1549 ///
1550 /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag" where have event.
1551 /// @param[in] newState The new state.
1552 /// - For @ref EPG_EVENT_CREATED and @ref EPG_EVENT_UPDATED, tag must be filled with all available event data, not just a delta.
1553 /// - For @ref EPG_EVENT_DELETED, it is sufficient to fill @ref kodi::addon::PVREPGTag::SetUniqueBroadcastId
1554 ///
1555 /// @remarks Only called from addon itself,
1556 ///
1557 ///
1558 ///---------------------------------------------------------------------------
1559 ///
1560 /// **Example:**
1561 /// ~~~~~~~~~~~~~{.cpp}
1562 /// ...
1563 ///
1564 /// void CMyPVRInstance::MyProcessFunction()
1565 /// {
1566 /// ...
1567 /// kodi::addon::PVREPGTag tag; // Here as mini add, in real it should be a complete tag
1568 /// tag.SetUniqueId(123);
1569 ///
1570 /// // added namespace here not needed to have, only to have more clear for where is
1571 /// kodi::addon::CInstancePVRClient::EpgEventStateChange(tag, EPG_EVENT_UPDATED);
1572 /// ...
1573 /// }
1574 ///
1575 /// ...
1576 /// ~~~~~~~~~~~~~
1577 ///
1578 inline void EpgEventStateChange(kodi::addon::PVREPGTag& tag, EPG_EVENT_STATE newState)
1579 {
1580 m_instanceData->toKodi->EpgEventStateChange(m_instanceData->toKodi->kodiInstance, tag.GetTag(),
1581 newState);
1582 }
1583 //----------------------------------------------------------------------------
1584
1585 ///@}
1586 //--==----==----==----==----==----==----==----==----==----==----==----==----==
1587
1588 //============================================================================
1589 /// @defgroup cpp_kodi_addon_pvr_Recordings 5. Recordings (optional)
1590 /// @ingroup cpp_kodi_addon_pvr
1591 /// @brief **PVR recording methods**\n
1592 /// To transfer available recordings of the PVR backend and to allow possible
1593 /// playback.
1594 ///
1595 /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings"
1596 /// is set to true.\n\n
1597 /// If a recordings changes after the initial import, or if a new one was added,
1598 /// then the add-on should call @ref TriggerRecordingUpdate().
1599 ///
1600 ///
1601 ///---------------------------------------------------------------------------
1602 ///
1603 /// **Recordings parts in interface:**\n
1604 /// Copy this to your project and extend with your parts or leave functions
1605 /// complete away where not used or supported.
1606 ///
1607 /// @copydetails cpp_kodi_addon_pvr_Recordings_header_addon_auto_check
1608 /// @copydetails cpp_kodi_addon_pvr_Recordings_source_addon_auto_check
1609 ///
1610 ///@{
1611
1612 //============================================================================
1613 /// @brief To get amount of recording present on backend
1614 ///
1615 /// @param[in] deleted if set return deleted recording (called if
1616 /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete"
1617 /// set to true)
1618 /// @param[out] amount The total amount of recordings on the backend
1619 /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully.
1620 ///
1621 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" is set to true.
1622 ///
1623 virtual PVR_ERROR GetRecordingsAmount(bool deleted, int& amount)
1624 {
1625 return PVR_ERROR_NOT_IMPLEMENTED;
1626 }
1627 //----------------------------------------------------------------------------
1628
1629 //============================================================================
1630 /// @brief Request the list of all recordings from the backend, if supported.
1631 ///
1632 /// Recording entries are added to Kodi by calling TransferRecordingEntry() on the callback.
1633 ///
1634 /// @param[in] deleted if set return deleted recording (called if
1635 /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete"
1636 /// set to true)
1637 /// @param[out] results List of available recordings with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
1638 /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet
1639 /// and given to Kodi
1640 /// @return @ref PVR_ERROR_NO_ERROR if the recordings have been fetched successfully.
1641 ///
1642 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings"
1643 /// is set to true.
1644 ///
1645 /// --------------------------------------------------------------------------
1646 ///
1647 /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help
1648 ///
1649 ///
1650 ///---------------------------------------------------------------------------
1651 ///
1652 /// **Example:**
1653 /// ~~~~~~~~~~~~~{.cpp}
1654 /// ...
1655 /// PVR_ERROR CMyPVRInstance::GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results)
1656 /// {
1657 /// // Minimal demo example, in reality bigger and loop to transfer all
1658 /// kodi::addon::PVRRecording recording;
1659 /// recording.SetRecordingId(123);
1660 /// recording.SetTitle("My recording name");
1661 /// ...
1662 ///
1663 /// // Give it now to Kodi
1664 /// results.Add(recording);
1665 /// return PVR_ERROR_NO_ERROR;
1666 /// }
1667 /// ...
1668 /// ~~~~~~~~~~~~~
1669 ///
1670 virtual PVR_ERROR GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results)
1671 {
1672 return PVR_ERROR_NOT_IMPLEMENTED;
1673 }
1674 //----------------------------------------------------------------------------
1675
1676 //============================================================================
1677 /// @brief Delete a recording on the backend.
1678 ///
1679 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to delete.
1680 /// @return @ref PVR_ERROR_NO_ERROR if the recording has been deleted successfully.
1681 ///
1682 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings"
1683 /// is set to true.
1684 ///
1685 virtual PVR_ERROR DeleteRecording(const kodi::addon::PVRRecording& recording)
1686 {
1687 return PVR_ERROR_NOT_IMPLEMENTED;
1688 }
1689 //----------------------------------------------------------------------------
1690
1691 //============================================================================
1692 /// @brief Undelete a recording on the backend.
1693 ///
1694 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to undelete.
1695 /// @return @ref PVR_ERROR_NO_ERROR if the recording has been undeleted successfully.
1696 ///
1697 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete"
1698 /// is set to true.
1699 ///
1700 virtual PVR_ERROR UndeleteRecording(const kodi::addon::PVRRecording& recording)
1701 {
1702 return PVR_ERROR_NOT_IMPLEMENTED;
1703 }
1704 //----------------------------------------------------------------------------
1705
1706 //============================================================================
1707 /// @brief Delete all recordings permanent which in the deleted folder on the backend.
1708 ///
1709 /// @return @ref PVR_ERROR_NO_ERROR if the recordings has been deleted successfully.
1710 ///
1711 virtual PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; }
1712 //----------------------------------------------------------------------------
1713
1714 //============================================================================
1715 /// @brief Rename a recording on the backend.
1716 ///
1717 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
1718 /// to rename, containing the new name.
1719 /// @return @ref PVR_ERROR_NO_ERROR if the recording has been renamed successfully.
1720 ///
1721 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings"
1722 /// is set to true.
1723 ///
1724 virtual PVR_ERROR RenameRecording(const kodi::addon::PVRRecording& recording)
1725 {
1726 return PVR_ERROR_NOT_IMPLEMENTED;
1727 }
1728 //----------------------------------------------------------------------------
1729
1730 //============================================================================
1731 /// @brief Set the lifetime of a recording on the backend.
1732 ///
1733 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
1734 /// to change the lifetime for. recording.iLifetime
1735 /// contains the new lieftime value.
1736 /// @return @ref PVR_ERROR_NO_ERROR if the recording's lifetime has been set
1737 /// successfully.
1738 ///
1739 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "supportsRecordingsLifetimeChange"
1740 /// is set to true.
1741 ///
1742 virtual PVR_ERROR SetRecordingLifetime(const kodi::addon::PVRRecording& recording)
1743 {
1744 return PVR_ERROR_NOT_IMPLEMENTED;
1745 }
1746 //----------------------------------------------------------------------------
1747
1748 //============================================================================
1749 /// @brief Set the play count of a recording on the backend.
1750 ///
1751 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
1752 /// to change the play count.
1753 /// @param[in] count Play count.
1754 /// @return @ref PVR_ERROR_NO_ERROR if the recording's play count has been set
1755 /// successfully.
1756 ///
1757 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount"
1758 /// is set to true.
1759 ///
1760 virtual PVR_ERROR SetRecordingPlayCount(const kodi::addon::PVRRecording& recording, int count)
1761 {
1762 return PVR_ERROR_NOT_IMPLEMENTED;
1763 }
1764 //----------------------------------------------------------------------------
1765
1766 //============================================================================
1767 /// @brief Set the last watched position of a recording on the backend.
1768 ///
1769 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording.
1770 /// @param[in] lastplayedposition The last watched position in seconds
1771 /// @return @ref PVR_ERROR_NO_ERROR if the position has been stored successfully.
1772 ///
1773 /// @remarks Required if @ref PVRCapabilities::SetSupportsLastPlayedPosition "supportsLastPlayedPosition"
1774 /// is set to true.
1775 ///
1776 virtual PVR_ERROR SetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording,
1777 int lastplayedposition)
1778 {
1779 return PVR_ERROR_NOT_IMPLEMENTED;
1780 }
1781 //----------------------------------------------------------------------------
1782
1783 //============================================================================
1784 /// @brief Retrieve the last watched position of a recording on the backend.
1785 ///
1786 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording.
1787 /// @param[out] position The last watched position in seconds
1788 /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully.
1789 ///
1790 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount"
1791 /// is set to true.
1792 ///
1793 virtual PVR_ERROR GetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording,
1794 int& position)
1795 {
1796 return PVR_ERROR_NOT_IMPLEMENTED;
1797 }
1798 //----------------------------------------------------------------------------
1799
1800 //============================================================================
1801 /// @brief Retrieve the edit decision list (EDL) of a recording on the backend.
1802 ///
1803 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording.
1804 /// @param[out] edl The function has to write the EDL into this array.
1805 /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists.
1806 ///
1807 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingEdl "supportsRecordingEdl"
1808 /// is set to true.
1809 ///
1810 /// --------------------------------------------------------------------------
1811 ///
1812 /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help
1813 ///
1814 virtual PVR_ERROR GetRecordingEdl(const kodi::addon::PVRRecording& recording,
1815 std::vector<kodi::addon::PVREDLEntry>& edl)
1816 {
1817 return PVR_ERROR_NOT_IMPLEMENTED;
1818 }
1819 //----------------------------------------------------------------------------
1820
1821 //============================================================================
1822 /// @brief Retrieve the size of a recording on the backend.
1823 ///
1824 /// @param[in] recording The recording to get the size in bytes for.
1825 /// @param[out] size The size in bytes of the recording
1826 /// @return @ref PVR_ERROR_NO_ERROR if the recording's size has been set successfully.
1827 ///
1828 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingSize "supportsRecordingSize"
1829 /// is set to true.
1830 ///
1831 virtual PVR_ERROR GetRecordingSize(const kodi::addon::PVRRecording& recording, int64_t& size)
1832 {
1833 return PVR_ERROR_NOT_IMPLEMENTED;
1834 }
1835 //----------------------------------------------------------------------------
1836
1837 //============================================================================
1838 /// @brief Get the stream properties for a recording from the backend.
1839 ///
1840 /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
1841 /// to get the stream properties for.
1842 /// @param[out] properties The properties required to play the stream.
1843 /// @return @ref PVR_ERROR_NO_ERROR if the stream is available.
1844 ///
1845 /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings"
1846 /// is set to true and the add-on does not implement recording stream functions
1847 /// (@ref OpenRecordedStream, ...).\n
1848 /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL
1849 /// with the URL Kodi should resolve to playback the recording.
1850 ///
1851 /// @note The value directly related to inputstream must always begin with the
1852 /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>.
1853 ///
1854 ///
1855 ///---------------------------------------------------------------------------
1856 ///
1857 /// **Example:**
1858 /// ~~~~~~~~~~~~~{.cpp}
1859 /// ...
1860 /// PVR_ERROR CMyPVRInstance::GetRecordingStreamProperties(const kodi::addon::PVRRecording& recording,
1861 /// std::vector<kodi::addon::PVRStreamProperty>& properties)
1862 /// {
1863 /// ...
1864 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
1865 /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd");
1866 /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full");
1867 /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash");
1868 /// return PVR_ERROR_NO_ERROR;
1869 /// }
1870 /// ...
1871 /// ~~~~~~~~~~~~~
1872 ///
1873 virtual PVR_ERROR GetRecordingStreamProperties(
1874 const kodi::addon::PVRRecording& recording,
1875 std::vector<kodi::addon::PVRStreamProperty>& properties)
1876 {
1877 return PVR_ERROR_NOT_IMPLEMENTED;
1878 }
1879 //----------------------------------------------------------------------------
1880
1881 //==========================================================================
1882 /// @brief Call one of the recording related menu hooks (if supported).
1883 ///
1884 /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in
1885 /// `constructor()`, by calling @ref AddMenuHook() on the callback.
1886 ///
1887 /// @param[in] menuhook The hook to call.
1888 /// @param[in] item The selected recording item for which the hook was called.
1889 /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully.
1890 ///
1891 /// --------------------------------------------------------------------------
1892 ///
1893 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
1894 ///
1895 virtual PVR_ERROR CallRecordingMenuHook(const kodi::addon::PVRMenuhook& menuhook,
1896 const kodi::addon::PVRRecording& item)
1897 {
1898 return PVR_ERROR_NOT_IMPLEMENTED;
1899 }
1900 //----------------------------------------------------------------------------
1901
1902 //============================================================================
1903 /// @brief **Callback to Kodi Function**\n
1904 /// Display a notification in Kodi that a recording started or stopped on the
1905 /// server.
1906 ///
1907 /// @param[in] recordingName The name of the recording to display
1908 /// @param[in] fileName The filename of the recording
1909 /// @param[in] on True when recording started, false when it stopped
1910 ///
1911 /// @remarks Only called from addon itself
1912 ///
1913 inline void RecordingNotification(const std::string& recordingName,
1914 const std::string& fileName,
1915 bool on)
1916 {
1917 m_instanceData->toKodi->RecordingNotification(m_instanceData->toKodi->kodiInstance,
1918 recordingName.c_str(), fileName.c_str(), on);
1919 }
1920 //----------------------------------------------------------------------------
1921
1922 //============================================================================
1923 /// @brief **Callback to Kodi Function**\n
1924 /// Request Kodi to update it's list of recordings.
1925 ///
1926 /// @remarks Only called from addon itself
1927 ///
1928 inline void TriggerRecordingUpdate()
1929 {
1930 m_instanceData->toKodi->TriggerRecordingUpdate(m_instanceData->toKodi->kodiInstance);
1931 }
1932 //----------------------------------------------------------------------------
1933
1934 ///@}
1935 //--==----==----==----==----==----==----==----==----==----==----==----==----==
1936
1937 //============================================================================
1938 /// @defgroup cpp_kodi_addon_pvr_Timers 6. Timers (optional)
1939 /// @ingroup cpp_kodi_addon_pvr
1940 /// @brief **PVR timer methods**\n
1941 /// For editing and displaying timed work, such as video recording.
1942 ///
1943 /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
1944 /// is set to true.\n\n
1945 /// If a timer changes after the initial import, or if a new one was added,
1946 /// then the add-on should call @ref TriggerTimerUpdate().
1947 ///
1948 ///
1949 ///---------------------------------------------------------------------------
1950 ///
1951 /// **Timer parts in interface:**\n
1952 /// Copy this to your project and extend with your parts or leave functions
1953 /// complete away where not used or supported.
1954 ///
1955 /// @copydetails cpp_kodi_addon_pvr_Timers_header_addon_auto_check
1956 /// @copydetails cpp_kodi_addon_pvr_Timers_source_addon_auto_check
1957 ///
1958 ///@{
1959
1960 //============================================================================
1961 /// @brief Retrieve the timer types supported by the backend.
1962 ///
1963 /// @param[out] types The function has to write the definition of the
1964 /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType types
1965 /// into this array.
1966 /// @return @ref PVR_ERROR_NO_ERROR if the types were successfully written to
1967 /// the array.
1968 ///
1969 /// @note Maximal 32 entries are allowed inside.
1970 ///
1971 /// --------------------------------------------------------------------------
1972 ///
1973 /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help
1974 ///
1975 virtual PVR_ERROR GetTimerTypes(std::vector<kodi::addon::PVRTimerType>& types)
1976 {
1977 return PVR_ERROR_NOT_IMPLEMENTED;
1978 }
1979 //----------------------------------------------------------------------------
1980
1981 //============================================================================
1982 /// @brief To get total amount of timers on the backend or -1 on error.
1983 ///
1984 /// @param[out] amount The total amount of timers on the backend
1985 /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully.
1986 ///
1987 /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
1988 /// is set to true.
1989 ///
1990 virtual PVR_ERROR GetTimersAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; }
1991 //----------------------------------------------------------------------------
1992
1993 //============================================================================
1994 /// @brief Request the list of all timers from the backend if supported.
1995 ///
1996 /// @param[out] results List of available timers with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer
1997 /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet
1998 /// and given to Kodi
1999 /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully.
2000 ///
2001 /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
2002 /// is set to true.
2003 ///
2004 /// --------------------------------------------------------------------------
2005 ///
2006 /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help
2007 ///
2008 ///
2009 ///---------------------------------------------------------------------------
2010 ///
2011 /// **Example:**
2012 /// ~~~~~~~~~~~~~{.cpp}
2013 /// ...
2014 /// PVR_ERROR CMyPVRInstance::GetTimers(kodi::addon::PVRTimersResultSet& results)
2015 /// {
2016 /// // Minimal demo example, in reality bigger and loop to transfer all
2017 /// kodi::addon::PVRTimer timer;
2018 /// timer.SetClientIndex(123);
2019 /// timer.SetState(PVR_TIMER_STATE_SCHEDULED);
2020 /// timer.SetTitle("My timer name");
2021 /// ...
2022 ///
2023 /// // Give it now to Kodi
2024 /// results.Add(timer);
2025 /// return PVR_ERROR_NO_ERROR;
2026 /// }
2027 /// ...
2028 /// ~~~~~~~~~~~~~
2029 ///
2030 virtual PVR_ERROR GetTimers(kodi::addon::PVRTimersResultSet& results)
2031 {
2032 return PVR_ERROR_NOT_IMPLEMENTED;
2033 }
2034 //----------------------------------------------------------------------------
2035
2036 //============================================================================
2037 /// @brief Add a timer on the backend.
2038 ///
2039 /// @param[in] timer The timer to add.
2040 /// @return @ref PVR_ERROR_NO_ERROR if the timer has been added successfully.
2041 ///
2042 /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
2043 /// is set to true.
2044 ///
2045 virtual PVR_ERROR AddTimer(const kodi::addon::PVRTimer& timer)
2046 {
2047 return PVR_ERROR_NOT_IMPLEMENTED;
2048 }
2049 //----------------------------------------------------------------------------
2050
2051 //============================================================================
2052 /// @brief Delete a timer on the backend.
2053 ///
2054 /// @param[in] timer The timer to delete.
2055 /// @param[in] forceDelete Set to true to delete a timer that is currently
2056 /// recording a program.
2057 /// @return @ref PVR_ERROR_NO_ERROR if the timer has been deleted successfully.
2058 ///
2059 /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
2060 /// is set to true.
2061 ///
2062 virtual PVR_ERROR DeleteTimer(const kodi::addon::PVRTimer& timer, bool forceDelete)
2063 {
2064 return PVR_ERROR_NOT_IMPLEMENTED;
2065 }
2066 //----------------------------------------------------------------------------
2067
2068 //============================================================================
2069 /// @brief Update the timer information on the backend.
2070 ///
2071 /// @param[in] timer The timer to update.
2072 /// @return @ref PVR_ERROR_NO_ERROR if the timer has been updated successfully.
2073 ///
2074 /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers"
2075 /// is set to true.
2076 ///
2077 virtual PVR_ERROR UpdateTimer(const kodi::addon::PVRTimer& timer)
2078 {
2079 return PVR_ERROR_NOT_IMPLEMENTED;
2080 }
2081 //----------------------------------------------------------------------------
2082
2083 //============================================================================
2084 /// @brief Call one of the timer related menu hooks (if supported).
2085 ///
2086 /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have
2087 /// to be added in `constructor()`, by calling @ref AddMenuHook() on the
2088 /// callback.
2089 ///
2090 /// @param[in] menuhook The hook to call.
2091 /// @param[in] item The selected timer item for which the hook was called.
2092 /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully.
2093 ///
2094 /// --------------------------------------------------------------------------
2095 ///
2096 /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
2097 ///
2098 virtual PVR_ERROR CallTimerMenuHook(const kodi::addon::PVRMenuhook& menuhook,
2099 const kodi::addon::PVRTimer& item)
2100 {
2101 return PVR_ERROR_NOT_IMPLEMENTED;
2102 }
2103 //----------------------------------------------------------------------------
2104
2105 //============================================================================
2106 /// @brief **Callback to Kodi Function**\n
2107 /// Request Kodi to update it's list of timers.
2108 ///
2109 /// @remarks Only called from addon itself
2110 ///
2111 inline void TriggerTimerUpdate()
2112 {
2113 m_instanceData->toKodi->TriggerTimerUpdate(m_instanceData->toKodi->kodiInstance);
2114 }
2115 //----------------------------------------------------------------------------
2116
2117 ///@}
2118 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2119
2120 //============================================================================
2121 /// @defgroup cpp_kodi_addon_pvr_PowerManagement 7. Power management events (optional)
2122 /// @ingroup cpp_kodi_addon_pvr
2123 /// @brief **Used to notify the pvr addon for power management events**\n
2124 /// Used to allow any energy savings.
2125 ///
2126 ///
2127 ///---------------------------------------------------------------------------
2128 ///
2129 /// **Power management events in interface:**\n
2130 /// Copy this to your project and extend with your parts or leave functions
2131 /// complete away where not used or supported.
2132 ///
2133 /// @copydetails cpp_kodi_addon_pvr_PowerManagement_header_addon_auto_check
2134 /// @copydetails cpp_kodi_addon_pvr_PowerManagement_source_addon_auto_check
2135 ///
2136 ///@{
2137
2138 //============================================================================
2139 /// @brief To notify addon about system sleep
2140 ///
2141 /// @return @ref PVR_ERROR_NO_ERROR If successfully done.
2142 ///
2143 virtual PVR_ERROR OnSystemSleep() { return PVR_ERROR_NOT_IMPLEMENTED; }
2144 //----------------------------------------------------------------------------
2145
2146 //============================================================================
2147 /// @brief To notify addon about system wake up
2148 ///
2149 /// @return @ref PVR_ERROR_NO_ERROR If successfully done.
2150 ///
2151 virtual PVR_ERROR OnSystemWake() { return PVR_ERROR_NOT_IMPLEMENTED; }
2152 //----------------------------------------------------------------------------
2153
2154 //============================================================================
2155 /// @brief To notify addon power saving on system is activated
2156 ///
2157 /// @return @ref PVR_ERROR_NO_ERROR If successfully done.
2158 ///
2159 virtual PVR_ERROR OnPowerSavingActivated() { return PVR_ERROR_NOT_IMPLEMENTED; }
2160 //----------------------------------------------------------------------------
2161
2162 //============================================================================
2163 /// @brief To notify addon power saving on system is deactivated
2164 ///
2165 /// @return @ref PVR_ERROR_NO_ERROR If successfully done.
2166 ///
2167 virtual PVR_ERROR OnPowerSavingDeactivated() { return PVR_ERROR_NOT_IMPLEMENTED; }
2168 //----------------------------------------------------------------------------
2169
2170 ///@}
2171 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2172
2173 //============================================================================
2174 /// @defgroup cpp_kodi_addon_pvr_Streams 8. Inputstream
2175 /// @ingroup cpp_kodi_addon_pvr
2176 /// @brief **PVR Inputstream**\n
2177 /// This includes functions that are used in the PVR inputstream.
2178 ///
2179 /// @warning The parts here will be removed in the future and replaced by the
2180 /// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance".
2181 /// If there is already a possibility, new addons should do it via the
2182 /// inputstream instance.
2183 ///
2184 ///@{
2185
2186 //============================================================================
2187 /// @defgroup cpp_kodi_addon_pvr_Streams_TV 8.1. TV stream
2188 /// @ingroup cpp_kodi_addon_pvr_Streams
2189 /// @brief **PVR TV stream**\n
2190 /// Stream processing regarding live TV.
2191 ///
2192 ///
2193 ///---------------------------------------------------------------------------
2194 ///
2195 /// **TV stream parts in interface:**\n
2196 /// Copy this to your project and extend with your parts or leave functions
2197 /// complete away where not used or supported.
2198 ///
2199 /// @copydetails cpp_kodi_addon_pvr_Streams_TV_header_addon_auto_check
2200 /// @copydetails cpp_kodi_addon_pvr_Streams_TV_source_addon_auto_check
2201 ///
2202 ///@{
2203
2204 //============================================================================
2205 /// @brief Open a live stream on the backend.
2206 ///
2207 /// @param[in] channel The channel to stream.
2208 /// @return True if the stream has been opened successfully, false otherwise.
2209 ///
2210 /// --------------------------------------------------------------------------
2211 ///
2212 /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help
2213 ///
2214 ///
2215 /// --------------------------------------------------------------------------
2216 ///
2217 /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or
2218 /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true.
2219 /// @ref CloseLiveStream() will always be called by Kodi prior to calling this
2220 /// function.
2221 ///
2222 virtual bool OpenLiveStream(const kodi::addon::PVRChannel& channel) { return false; }
2223 //----------------------------------------------------------------------------
2224
2225 //============================================================================
2226 /// @brief Close an open live stream.
2227 ///
2228 /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or
2229 /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true.
2230 ///
2231 virtual void CloseLiveStream() {}
2232 //----------------------------------------------------------------------------
2233
2234 //============================================================================
2235 /// @brief Read from an open live stream.
2236 ///
2237 /// @param[in] pBuffer The buffer to store the data in.
2238 /// @param[in] iBufferSize The amount of bytes to read.
2239 /// @return The amount of bytes that were actually read from the stream.
2240 ///
2241 /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() is set
2242 /// to true.
2243 ///
2244 virtual int ReadLiveStream(unsigned char* buffer, unsigned int size) { return 0; }
2245 //----------------------------------------------------------------------------
2246
2247 //============================================================================
2248 /// @brief Seek in a live stream on a backend that supports timeshifting.
2249 ///
2250 /// @param[in] position The position to seek to.
2251 /// @param[in] whence [optional] offset relative to
2252 /// You can set the value of whence to one of three things:
2253 /// | Value | int | Description |
2254 /// |:--------:|:---:|:----------------------------------------------------|
2255 /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence.
2256 /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes."
2257 /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion.
2258 ///
2259 /// @return The new position.
2260 ///
2261 /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream()
2262 /// is set to true.
2263 ///
2264 virtual int64_t SeekLiveStream(int64_t position, int whence) { return 0; }
2265 //----------------------------------------------------------------------------
2266
2267 //============================================================================
2268 /// @brief Obtain the length of a live stream.
2269 ///
2270 /// @return The total length of the stream that's currently being read.
2271 ///
2272 /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream()
2273 /// is set to true.
2274 ///
2275 virtual int64_t LengthLiveStream() { return 0; }
2276 //----------------------------------------------------------------------------
2277
2278 //============================================================================
2279 /// @defgroup cpp_kodi_addon_pvr_Streams_TV_Demux 8.1.1. Stream demuxing
2280 /// @ingroup cpp_kodi_addon_pvr_Streams_TV
2281 /// @brief **PVR stream demuxing**\n
2282 /// Read TV streams with own demux within addon.
2283 ///
2284 /// This is only on Live TV streams and only if @ref PVRCapabilities::SetHandlesDemuxing()
2285 /// has been set to "true".
2286 ///
2287 ///
2288 ///---------------------------------------------------------------------------
2289 ///
2290 /// **Stream demuxing parts in interface:**\n
2291 /// Copy this to your project and extend with your parts or leave functions
2292 /// complete away where not used or supported.
2293 ///
2294 /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_header_addon_auto_check
2295 /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_source_addon_auto_check
2296 ///
2297 ///@{
2298
2299 //============================================================================
2300 /// @brief Get the stream properties of the stream that's currently being read.
2301 ///
2302 /// @param[in] properties The properties of the currently playing stream.
2303 /// @return @ref PVR_ERROR_NO_ERROR if the properties have been fetched successfully.
2304 ///
2305 /// @remarks Required, and only used if addon has its own demuxer.
2306 ///
2307 virtual PVR_ERROR GetStreamProperties(std::vector<kodi::addon::PVRStreamProperties>& properties)
2308 {
2309 return PVR_ERROR_NOT_IMPLEMENTED;
2310 }
2311 //----------------------------------------------------------------------------
2312
2313 //============================================================================
2314 /// @brief Read the next packet from the demultiplexer, if there is one.
2315 ///
2316 /// @return The next packet.
2317 /// If there is no next packet, then the add-on should return the packet
2318 /// created by calling @ref AllocateDemuxPacket(0) on the callback.
2319 /// If the stream changed and Kodi's player needs to be reinitialised, then,
2320 /// the add-on should call @ref AllocateDemuxPacket(0) on the callback, and set
2321 /// the streamid to @ref DMX_SPECIALID_STREAMCHANGE and return the value.
2322 /// The add-on should return `nullptr` if an error occurred.
2323 ///
2324 /// @remarks Required, and only used if addon has its own demuxer.
2325 /// Return `nullptr` if this add-on won't provide this function.
2326 ///
2327 virtual DemuxPacket* DemuxRead() { return nullptr; }
2328 //----------------------------------------------------------------------------
2329
2330 //============================================================================
2331 /// @brief Reset the demultiplexer in the add-on.
2332 ///
2333 /// @remarks Required, and only used if addon has its own demuxer.
2334 ///
2335 virtual void DemuxReset() {}
2336 //----------------------------------------------------------------------------
2337
2338 //============================================================================
2339 /// @brief Abort the demultiplexer thread in the add-on.
2340 ///
2341 /// @remarks Required, and only used if addon has its own demuxer.
2342 ///
2343 virtual void DemuxAbort() {}
2344 //----------------------------------------------------------------------------
2345
2346 //============================================================================
2347 /// @brief Flush all data that's currently in the demultiplexer buffer in the
2348 /// add-on.
2349 ///
2350 /// @remarks Required, and only used if addon has its own demuxer.
2351 ///
2352 virtual void DemuxFlush() {}
2353 //----------------------------------------------------------------------------
2354
2355 //============================================================================
2356 /// @brief Notify the pvr addon/demuxer that Kodi wishes to change playback
2357 /// speed.
2358 ///
2359 /// @param[in] speed The requested playback speed
2360 ///
2361 /// @remarks Optional, and only used if addon has its own demuxer.
2362 ///
2363 virtual void SetSpeed(int speed) {}
2364 //----------------------------------------------------------------------------
2365
2366 //============================================================================
2367 /// @brief Notify the pvr addon/demuxer that Kodi wishes to fill demux queue.
2368 ///
2369 /// @param[in] mode The requested filling mode
2370 ///
2371 /// @remarks Optional, and only used if addon has its own demuxer.
2372 ///
2373 virtual void FillBuffer(bool mode) {}
2374 //----------------------------------------------------------------------------
2375
2376 //============================================================================
2377 /// @brief Notify the pvr addon/demuxer that Kodi wishes to seek the stream by
2378 /// time.
2379 ///
2380 /// @param[in] time The absolute time since stream start
2381 /// @param[in] backwards True to seek to keyframe BEFORE time, else AFTER
2382 /// @param[in] startpts can be updated to point to where display should start
2383 /// @return True if the seek operation was possible
2384 ///
2385 /// @remarks Optional, and only used if addon has its own demuxer.
2386 /// Return False if this add-on won't provide this function.
2387 ///
2388 virtual bool SeekTime(double time, bool backwards, double& startpts) { return false; }
2389 //----------------------------------------------------------------------------
2390
2391 //============================================================================
2392 /// @brief **Callback to Kodi Function**\n
2393 /// Get the codec id used by Kodi.
2394 ///
2395 /// @param[in] codecName The name of the codec
2396 /// @return The codec_id, or a codec_id with 0 values when not supported
2397 ///
2398 /// @remarks Only called from addon itself
2399 ///
2400 inline PVRCodec GetCodecByName(const std::string& codecName) const
2401 {
2402 return PVRCodec(m_instanceData->toKodi->GetCodecByName(m_instanceData->toKodi->kodiInstance,
2403 codecName.c_str()));
2404 }
2405 //----------------------------------------------------------------------------
2406
2407 //============================================================================
2408 /// @brief **Callback to Kodi Function**\n
2409 /// Allocate a demux packet. Free with @ref FreeDemuxPacket().
2410 ///
2411 /// @param[in] iDataSize The size of the data that will go into the packet
2412 /// @return The allocated packet
2413 ///
2414 /// @remarks Only called from addon itself
2415 ///
2416 inline DemuxPacket* AllocateDemuxPacket(int iDataSize)
2417 {
2418 return m_instanceData->toKodi->AllocateDemuxPacket(m_instanceData->toKodi->kodiInstance,
2419 iDataSize);
2420 }
2421 //----------------------------------------------------------------------------
2422
2423 //============================================================================
2424 /// @brief **Callback to Kodi Function**\n
2425 /// Free a packet that was allocated with @ref AllocateDemuxPacket().
2426 ///
2427 /// @param[in] pPacket The packet to free
2428 ///
2429 /// @remarks Only called from addon itself.
2430 ///
2431 inline void FreeDemuxPacket(DemuxPacket* pPacket)
2432 {
2433 m_instanceData->toKodi->FreeDemuxPacket(m_instanceData->toKodi->kodiInstance, pPacket);
2434 }
2435 //----------------------------------------------------------------------------
2436 ///@}
2437
2438 ///@}
2439 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2440
2441 //============================================================================
2442 /// @defgroup cpp_kodi_addon_pvr_Streams_Recording 8.2. Recording stream
2443 /// @ingroup cpp_kodi_addon_pvr_Streams
2444 /// @brief **PVR Recording stream**\n
2445 /// Stream processing regarding recordings.
2446 ///
2447 /// @note Demuxing is not possible with the recordings.
2448 ///
2449 ///
2450 ///---------------------------------------------------------------------------
2451 ///
2452 /// **Recording stream parts in interface:**\n
2453 /// Copy this to your project and extend with your parts or leave functions
2454 /// complete away where not used or supported.
2455 ///
2456 /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_header_addon_auto_check
2457 /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_source_addon_auto_check
2458 ///
2459 ///@{
2460
2461 //============================================================================
2462 /// @brief Open a stream to a recording on the backend.
2463 ///
2464 /// @param[in] recording The recording to open.
2465 /// @return True if the stream has been opened successfully, false otherwise.
2466 ///
2467 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings()
2468 /// is set to true. @ref CloseRecordedStream() will always be called by Kodi
2469 /// prior to calling this function.
2470 ///
2471 virtual bool OpenRecordedStream(const kodi::addon::PVRRecording& recording) { return false; }
2472 //----------------------------------------------------------------------------
2473
2474 //============================================================================
2475 /// @brief Close an open stream from a recording.
2476 ///
2477 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings()
2478 /// is set to true.
2479 ///
2480 virtual void CloseRecordedStream() {}
2481 //----------------------------------------------------------------------------
2482
2483 //============================================================================
2484 /// @brief Read from a recording.
2485 ///
2486 /// @param[in] buffer The buffer to store the data in.
2487 /// @param[in] size The amount of bytes to read.
2488 /// @return The amount of bytes that were actually read from the stream.
2489 ///
2490 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings()
2491 /// is set to true.
2492 ///
2493 virtual int ReadRecordedStream(unsigned char* buffer, unsigned int size) { return 0; }
2494 //----------------------------------------------------------------------------
2495
2496 //============================================================================
2497 /// @brief Seek in a recorded stream.
2498 ///
2499 /// @param[in] position The position to seek to.
2500 /// @param[in] whence [optional] offset relative to
2501 /// You can set the value of whence to one of three things:
2502 /// | Value | int | Description |
2503 /// |:--------:|:---:|:----------------------------------------------------|
2504 /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence.
2505 /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes."
2506 /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion.
2507 ///
2508 /// @return The new position.
2509 ///
2510 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings()
2511 /// is set to true.
2512 ///
2513 virtual int64_t SeekRecordedStream(int64_t position, int whence) { return 0; }
2514 //----------------------------------------------------------------------------
2515
2516 //============================================================================
2517 /// @brief Obtain the length of a recorded stream.
2518 ///
2519 /// @return The total length of the stream that's currently being read.
2520 ///
2521 /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings()
2522 /// is true (=> @ref ReadRecordedStream).
2523 ///
2524 virtual int64_t LengthRecordedStream() { return 0; }
2525 //----------------------------------------------------------------------------
2526
2527 ///@}
2528 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2529
2530 //============================================================================
2531 /// @defgroup cpp_kodi_addon_pvr_Streams_Various 8.3. Various functions
2532 /// @ingroup cpp_kodi_addon_pvr_Streams
2533 /// @brief **Various other PVR stream related functions**\n
2534 /// These apply to all other groups in inputstream and are therefore declared
2535 /// as several.
2536 ///
2537 ///
2538 ///---------------------------------------------------------------------------
2539 ///
2540 /// **Various stream parts in interface:**\n
2541 /// Copy this to your project and extend with your parts or leave functions
2542 /// complete away where not used or supported.
2543 ///
2544 /// @copydetails cpp_kodi_addon_pvr_Streams_Various_header_addon_auto_check
2545 /// @copydetails cpp_kodi_addon_pvr_Streams_Various_source_addon_auto_check
2546 ///
2547 ///@{
2548
2549 //============================================================================
2550 ///
2551 /// @brief Check if the backend support pausing the currently playing stream.
2552 ///
2553 /// This will enable/disable the pause button in Kodi based on the return
2554 /// value.
2555 ///
2556 /// @return false if the PVR addon/backend does not support pausing, true if
2557 /// possible
2558 ///
2559 virtual bool CanPauseStream() { return false; }
2560 //----------------------------------------------------------------------------
2561
2562 //============================================================================
2563 ///
2564 /// @brief Check if the backend supports seeking for the currently playing
2565 /// stream.
2566 ///
2567 /// This will enable/disable the rewind/forward buttons in Kodi based on the
2568 /// return value.
2569 ///
2570 /// @return false if the PVR addon/backend does not support seeking, true if
2571 /// possible
2572 ///
2573 virtual bool CanSeekStream() { return false; }
2574 //----------------------------------------------------------------------------
2575
2576 //============================================================================
2577 ///
2578 /// @brief Notify the pvr addon that Kodi (un)paused the currently playing
2579 /// stream.
2580 ///
2581 /// @param[in] paused To inform by `true` is paused and with `false` playing
2582 ///
2583 virtual void PauseStream(bool paused) {}
2584 //----------------------------------------------------------------------------
2585
2586 //============================================================================
2587 ///
2588 /// @brief Check for real-time streaming.
2589 ///
2590 /// @return true if current stream is real-time
2591 ///
2592 virtual bool IsRealTimeStream() { return false; }
2593 //----------------------------------------------------------------------------
2594
2595 //============================================================================
2596 ///
2597 /// @brief Get stream times.
2598 ///
2599 /// @param[out] times A pointer to the data to be filled by the implementation.
2600 /// @return @ref PVR_ERROR_NO_ERROR on success.
2601 ///
2602 virtual PVR_ERROR GetStreamTimes(kodi::addon::PVRStreamTimes& times)
2603 {
2604 return PVR_ERROR_NOT_IMPLEMENTED;
2605 }
2606 //----------------------------------------------------------------------------
2607
2608 //============================================================================
2609 ///
2610 /// @brief Obtain the chunk size to use when reading streams.
2611 ///
2612 /// @param[out] chunksize must be filled with the chunk size in bytes.
2613 /// @return @ref PVR_ERROR_NO_ERROR if the chunk size has been fetched successfully.
2614 ///
2615 /// @remarks Optional, and only used if not reading from demuxer (=> @ref DemuxRead) and
2616 /// @ref PVRCapabilities::SetSupportsRecordings() is true (=> @ref ReadRecordedStream) or
2617 /// @ref PVRCapabilities::SetHandlesInputStream() is true (=> @ref ReadLiveStream).
2618 ///
2619 virtual PVR_ERROR GetStreamReadChunkSize(int& chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; }
2620 //----------------------------------------------------------------------------
2621
2622 ///@}
2623 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2624
2625private:
2626 void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion)
2627 {
2628 if (instance == nullptr)
2629 throw std::logic_error("kodi::addon::CInstancePVRClient: Creation with empty addon "
2630 "structure not allowed, table must be given from Kodi!");
2631
2632 m_instanceData = static_cast<AddonInstance_PVR*>(instance);
2633 m_instanceData->toAddon->addonInstance = this;
2634 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2635 m_instanceData->toAddon->GetCapabilities = ADDON_GetCapabilities;
2636 m_instanceData->toAddon->GetConnectionString = ADDON_GetConnectionString;
2637 m_instanceData->toAddon->GetBackendName = ADDON_GetBackendName;
2638 m_instanceData->toAddon->GetBackendVersion = ADDON_GetBackendVersion;
2639 m_instanceData->toAddon->GetBackendHostname = ADDON_GetBackendHostname;
2640 m_instanceData->toAddon->GetDriveSpace = ADDON_GetDriveSpace;
2641 m_instanceData->toAddon->CallSettingsMenuHook = ADDON_CallSettingsMenuHook;
2642 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2643 m_instanceData->toAddon->GetChannelsAmount = ADDON_GetChannelsAmount;
2644 m_instanceData->toAddon->GetChannels = ADDON_GetChannels;
2645 m_instanceData->toAddon->GetChannelStreamProperties = ADDON_GetChannelStreamProperties;
2646 m_instanceData->toAddon->GetSignalStatus = ADDON_GetSignalStatus;
2647 m_instanceData->toAddon->GetDescrambleInfo = ADDON_GetDescrambleInfo;
2648 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2649 m_instanceData->toAddon->GetChannelGroupsAmount = ADDON_GetChannelGroupsAmount;
2650 m_instanceData->toAddon->GetChannelGroups = ADDON_GetChannelGroups;
2651 m_instanceData->toAddon->GetChannelGroupMembers = ADDON_GetChannelGroupMembers;
2652 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2653 m_instanceData->toAddon->DeleteChannel = ADDON_DeleteChannel;
2654 m_instanceData->toAddon->RenameChannel = ADDON_RenameChannel;
2655 m_instanceData->toAddon->OpenDialogChannelSettings = ADDON_OpenDialogChannelSettings;
2656 m_instanceData->toAddon->OpenDialogChannelAdd = ADDON_OpenDialogChannelAdd;
2657 m_instanceData->toAddon->OpenDialogChannelScan = ADDON_OpenDialogChannelScan;
2658 m_instanceData->toAddon->CallChannelMenuHook = ADDON_CallChannelMenuHook;
2659 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2660 m_instanceData->toAddon->GetEPGForChannel = ADDON_GetEPGForChannel;
2661 m_instanceData->toAddon->IsEPGTagRecordable = ADDON_IsEPGTagRecordable;
2662 m_instanceData->toAddon->IsEPGTagPlayable = ADDON_IsEPGTagPlayable;
2663 m_instanceData->toAddon->GetEPGTagEdl = ADDON_GetEPGTagEdl;
2664 m_instanceData->toAddon->GetEPGTagStreamProperties = ADDON_GetEPGTagStreamProperties;
2665 m_instanceData->toAddon->SetEPGTimeFrame = ADDON_SetEPGTimeFrame;
2666 m_instanceData->toAddon->CallEPGMenuHook = ADDON_CallEPGMenuHook;
2667 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2668 m_instanceData->toAddon->GetRecordingsAmount = ADDON_GetRecordingsAmount;
2669 m_instanceData->toAddon->GetRecordings = ADDON_GetRecordings;
2670 m_instanceData->toAddon->DeleteRecording = ADDON_DeleteRecording;
2671 m_instanceData->toAddon->UndeleteRecording = ADDON_UndeleteRecording;
2672 m_instanceData->toAddon->DeleteAllRecordingsFromTrash = ADDON_DeleteAllRecordingsFromTrash;
2673 m_instanceData->toAddon->RenameRecording = ADDON_RenameRecording;
2674 m_instanceData->toAddon->SetRecordingLifetime = ADDON_SetRecordingLifetime;
2675 m_instanceData->toAddon->SetRecordingPlayCount = ADDON_SetRecordingPlayCount;
2676 m_instanceData->toAddon->SetRecordingLastPlayedPosition = ADDON_SetRecordingLastPlayedPosition;
2677 m_instanceData->toAddon->GetRecordingLastPlayedPosition = ADDON_GetRecordingLastPlayedPosition;
2678 m_instanceData->toAddon->GetRecordingEdl = ADDON_GetRecordingEdl;
2679 m_instanceData->toAddon->GetRecordingSize = ADDON_GetRecordingSize;
2680 m_instanceData->toAddon->GetRecordingStreamProperties = ADDON_GetRecordingStreamProperties;
2681 m_instanceData->toAddon->CallRecordingMenuHook = ADDON_CallRecordingMenuHook;
2682 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2683 m_instanceData->toAddon->GetTimerTypes = ADDON_GetTimerTypes;
2684 m_instanceData->toAddon->GetTimersAmount = ADDON_GetTimersAmount;
2685 m_instanceData->toAddon->GetTimers = ADDON_GetTimers;
2686 m_instanceData->toAddon->AddTimer = ADDON_AddTimer;
2687 m_instanceData->toAddon->DeleteTimer = ADDON_DeleteTimer;
2688 m_instanceData->toAddon->UpdateTimer = ADDON_UpdateTimer;
2689 m_instanceData->toAddon->CallTimerMenuHook = ADDON_CallTimerMenuHook;
2690 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2691 m_instanceData->toAddon->OnSystemSleep = ADDON_OnSystemSleep;
2692 m_instanceData->toAddon->OnSystemWake = ADDON_OnSystemWake;
2693 m_instanceData->toAddon->OnPowerSavingActivated = ADDON_OnPowerSavingActivated;
2694 m_instanceData->toAddon->OnPowerSavingDeactivated = ADDON_OnPowerSavingDeactivated;
2695 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2696 m_instanceData->toAddon->OpenLiveStream = ADDON_OpenLiveStream;
2697 m_instanceData->toAddon->CloseLiveStream = ADDON_CloseLiveStream;
2698 m_instanceData->toAddon->ReadLiveStream = ADDON_ReadLiveStream;
2699 m_instanceData->toAddon->SeekLiveStream = ADDON_SeekLiveStream;
2700 m_instanceData->toAddon->LengthLiveStream = ADDON_LengthLiveStream;
2701 m_instanceData->toAddon->GetStreamProperties = ADDON_GetStreamProperties;
2702 m_instanceData->toAddon->GetStreamReadChunkSize = ADDON_GetStreamReadChunkSize;
2703 m_instanceData->toAddon->IsRealTimeStream = ADDON_IsRealTimeStream;
2704 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2705 m_instanceData->toAddon->OpenRecordedStream = ADDON_OpenRecordedStream;
2706 m_instanceData->toAddon->CloseRecordedStream = ADDON_CloseRecordedStream;
2707 m_instanceData->toAddon->ReadRecordedStream = ADDON_ReadRecordedStream;
2708 m_instanceData->toAddon->SeekRecordedStream = ADDON_SeekRecordedStream;
2709 m_instanceData->toAddon->LengthRecordedStream = ADDON_LengthRecordedStream;
2710 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2711 m_instanceData->toAddon->DemuxReset = ADDON_DemuxReset;
2712 m_instanceData->toAddon->DemuxAbort = ADDON_DemuxAbort;
2713 m_instanceData->toAddon->DemuxFlush = ADDON_DemuxFlush;
2714 m_instanceData->toAddon->DemuxRead = ADDON_DemuxRead;
2715 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2716 m_instanceData->toAddon->CanPauseStream = ADDON_CanPauseStream;
2717 m_instanceData->toAddon->PauseStream = ADDON_PauseStream;
2718 m_instanceData->toAddon->CanSeekStream = ADDON_CanSeekStream;
2719 m_instanceData->toAddon->SeekTime = ADDON_SeekTime;
2720 m_instanceData->toAddon->SetSpeed = ADDON_SetSpeed;
2721 m_instanceData->toAddon->FillBuffer = ADDON_FillBuffer;
2722 m_instanceData->toAddon->GetStreamTimes = ADDON_GetStreamTimes;
2723 }
2724
2725 inline static PVR_ERROR ADDON_GetCapabilities(const AddonInstance_PVR* instance,
2726 PVR_ADDON_CAPABILITIES* capabilities)
2727 {
2728 PVRCapabilities cppCapabilities(capabilities);
2729 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2730 ->GetCapabilities(cppCapabilities);
2731 }
2732
2733 inline static PVR_ERROR ADDON_GetBackendName(const AddonInstance_PVR* instance,
2734 char* str,
2735 int memSize)
2736 {
2737 std::string backendName;
2738 PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2739 ->GetBackendName(backendName);
2740 if (err == PVR_ERROR_NO_ERROR)
2741 strncpy(str, backendName.c_str(), memSize);
2742 return err;
2743 }
2744
2745 inline static PVR_ERROR ADDON_GetBackendVersion(const AddonInstance_PVR* instance,
2746 char* str,
2747 int memSize)
2748 {
2749 std::string backendVersion;
2750 PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2751 ->GetBackendVersion(backendVersion);
2752 if (err == PVR_ERROR_NO_ERROR)
2753 strncpy(str, backendVersion.c_str(), memSize);
2754 return err;
2755 }
2756
2757 inline static PVR_ERROR ADDON_GetBackendHostname(const AddonInstance_PVR* instance,
2758 char* str,
2759 int memSize)
2760 {
2761 std::string backendHostname;
2762 PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2763 ->GetBackendHostname(backendHostname);
2764 if (err == PVR_ERROR_NO_ERROR)
2765 strncpy(str, backendHostname.c_str(), memSize);
2766 return err;
2767 }
2768
2769 inline static PVR_ERROR ADDON_GetConnectionString(const AddonInstance_PVR* instance,
2770 char* str,
2771 int memSize)
2772 {
2773 std::string connectionString;
2774 PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2775 ->GetConnectionString(connectionString);
2776 if (err == PVR_ERROR_NO_ERROR)
2777 strncpy(str, connectionString.c_str(), memSize);
2778 return err;
2779 }
2780
2781 inline static PVR_ERROR ADDON_GetDriveSpace(const AddonInstance_PVR* instance,
2782 uint64_t* total,
2783 uint64_t* used)
2784 {
2785 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2786 ->GetDriveSpace(*total, *used);
2787 }
2788
2789 inline static PVR_ERROR ADDON_CallSettingsMenuHook(const AddonInstance_PVR* instance,
2790 const PVR_MENUHOOK* menuhook)
2791 {
2792 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2793 ->CallSettingsMenuHook(menuhook);
2794 }
2795
2796 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2797
2798 inline static PVR_ERROR ADDON_GetChannelsAmount(const AddonInstance_PVR* instance, int* amount)
2799 {
2800 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2801 ->GetChannelsAmount(*amount);
2802 }
2803
2804 inline static PVR_ERROR ADDON_GetChannels(const AddonInstance_PVR* instance,
2805 ADDON_HANDLE handle,
2806 bool radio)
2807 {
2808 PVRChannelsResultSet result(instance, handle);
2809 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2810 ->GetChannels(radio, result);
2811 }
2812
2813 inline static PVR_ERROR ADDON_GetChannelStreamProperties(const AddonInstance_PVR* instance,
2814 const PVR_CHANNEL* channel,
2815 PVR_NAMED_VALUE* properties,
2816 unsigned int* propertiesCount)
2817 {
2818 *propertiesCount = 0;
2819 std::vector<PVRStreamProperty> propertiesList;
2820 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2821 ->GetChannelStreamProperties(channel, propertiesList);
2822 if (error == PVR_ERROR_NO_ERROR)
2823 {
2824 for (const auto& property : propertiesList)
2825 {
2826 strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName,
2827 sizeof(properties[*propertiesCount].strName) - 1);
2828 strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue,
2829 sizeof(properties[*propertiesCount].strValue) - 1);
2830 ++*propertiesCount;
2831 if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT)
2832 break;
2833 }
2834 }
2835 return error;
2836 }
2837
2838 inline static PVR_ERROR ADDON_GetSignalStatus(const AddonInstance_PVR* instance,
2839 int channelUid,
2840 PVR_SIGNAL_STATUS* signalStatus)
2841 {
2842 PVRSignalStatus cppSignalStatus(signalStatus);
2843 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2844 ->GetSignalStatus(channelUid, cppSignalStatus);
2845 }
2846
2847 inline static PVR_ERROR ADDON_GetDescrambleInfo(const AddonInstance_PVR* instance,
2848 int channelUid,
2849 PVR_DESCRAMBLE_INFO* descrambleInfo)
2850 {
2851 PVRDescrambleInfo cppDescrambleInfo(descrambleInfo);
2852 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2853 ->GetDescrambleInfo(channelUid, cppDescrambleInfo);
2854 }
2855
2856 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2857
2858 inline static PVR_ERROR ADDON_GetChannelGroupsAmount(const AddonInstance_PVR* instance,
2859 int* amount)
2860 {
2861 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2862 ->GetChannelGroupsAmount(*amount);
2863 }
2864
2865 inline static PVR_ERROR ADDON_GetChannelGroups(const AddonInstance_PVR* instance,
2866 ADDON_HANDLE handle,
2867 bool radio)
2868 {
2869 PVRChannelGroupsResultSet result(instance, handle);
2870 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2871 ->GetChannelGroups(radio, result);
2872 }
2873
2874 inline static PVR_ERROR ADDON_GetChannelGroupMembers(const AddonInstance_PVR* instance,
2875 ADDON_HANDLE handle,
2876 const PVR_CHANNEL_GROUP* group)
2877 {
2878 PVRChannelGroupMembersResultSet result(instance, handle);
2879 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2880 ->GetChannelGroupMembers(group, result);
2881 }
2882
2883 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2884
2885 inline static PVR_ERROR ADDON_DeleteChannel(const AddonInstance_PVR* instance,
2886 const PVR_CHANNEL* channel)
2887 {
2888 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2889 ->DeleteChannel(channel);
2890 }
2891
2892 inline static PVR_ERROR ADDON_RenameChannel(const AddonInstance_PVR* instance,
2893 const PVR_CHANNEL* channel)
2894 {
2895 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2896 ->RenameChannel(channel);
2897 }
2898
2899 inline static PVR_ERROR ADDON_OpenDialogChannelSettings(const AddonInstance_PVR* instance,
2900 const PVR_CHANNEL* channel)
2901 {
2902 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2903 ->OpenDialogChannelSettings(channel);
2904 }
2905
2906 inline static PVR_ERROR ADDON_OpenDialogChannelAdd(const AddonInstance_PVR* instance,
2907 const PVR_CHANNEL* channel)
2908 {
2909 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2910 ->OpenDialogChannelAdd(channel);
2911 }
2912
2913 inline static PVR_ERROR ADDON_OpenDialogChannelScan(const AddonInstance_PVR* instance)
2914 {
2915 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2916 ->OpenDialogChannelScan();
2917 }
2918
2919 inline static PVR_ERROR ADDON_CallChannelMenuHook(const AddonInstance_PVR* instance,
2920 const PVR_MENUHOOK* menuhook,
2921 const PVR_CHANNEL* channel)
2922 {
2923 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2924 ->CallChannelMenuHook(menuhook, channel);
2925 }
2926
2927 //--==----==----==----==----==----==----==----==----==----==----==----==----==
2928
2929 inline static PVR_ERROR ADDON_GetEPGForChannel(const AddonInstance_PVR* instance,
2930 ADDON_HANDLE handle,
2931 int channelUid,
2932 time_t start,
2933 time_t end)
2934 {
2935 PVREPGTagsResultSet result(instance, handle);
2936 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2937 ->GetEPGForChannel(channelUid, start, end, result);
2938 }
2939
2940 inline static PVR_ERROR ADDON_IsEPGTagRecordable(const AddonInstance_PVR* instance,
2941 const EPG_TAG* tag,
2942 bool* isRecordable)
2943 {
2944 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2945 ->IsEPGTagRecordable(tag, *isRecordable);
2946 }
2947
2948 inline static PVR_ERROR ADDON_IsEPGTagPlayable(const AddonInstance_PVR* instance,
2949 const EPG_TAG* tag,
2950 bool* isPlayable)
2951 {
2952 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2953 ->IsEPGTagPlayable(tag, *isPlayable);
2954 }
2955
2956 inline static PVR_ERROR ADDON_GetEPGTagEdl(const AddonInstance_PVR* instance,
2957 const EPG_TAG* tag,
2958 PVR_EDL_ENTRY* edl,
2959 int* size)
2960 {
2961 *size = 0;
2962 std::vector<PVREDLEntry> edlList;
2963 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2964 ->GetEPGTagEdl(tag, edlList);
2965 if (error == PVR_ERROR_NO_ERROR)
2966 {
2967 for (const auto& edlEntry : edlList)
2968 {
2969 edl[*size] = *edlEntry;
2970 ++*size;
2971 }
2972 }
2973 return error;
2974 }
2975
2976 inline static PVR_ERROR ADDON_GetEPGTagStreamProperties(const AddonInstance_PVR* instance,
2977 const EPG_TAG* tag,
2978 PVR_NAMED_VALUE* properties,
2979 unsigned int* propertiesCount)
2980 {
2981 *propertiesCount = 0;
2982 std::vector<PVRStreamProperty> propertiesList;
2983 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
2984 ->GetEPGTagStreamProperties(tag, propertiesList);
2985 if (error == PVR_ERROR_NO_ERROR)
2986 {
2987 for (const auto& property : propertiesList)
2988 {
2989 strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName,
2990 sizeof(properties[*propertiesCount].strName) - 1);
2991 strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue,
2992 sizeof(properties[*propertiesCount].strValue) - 1);
2993 ++*propertiesCount;
2994 if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT)
2995 break;
2996 }
2997 }
2998 return error;
2999 }
3000
3001 inline static PVR_ERROR ADDON_SetEPGTimeFrame(const AddonInstance_PVR* instance, int days)
3002 {
3003 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3004 ->SetEPGTimeFrame(days);
3005 }
3006
3007 inline static PVR_ERROR ADDON_CallEPGMenuHook(const AddonInstance_PVR* instance,
3008 const PVR_MENUHOOK* menuhook,
3009 const EPG_TAG* tag)
3010 {
3011 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3012 ->CallEPGMenuHook(menuhook, tag);
3013 }
3014
3015 //--==----==----==----==----==----==----==----==----==----==----==----==----==
3016
3017 inline static PVR_ERROR ADDON_GetRecordingsAmount(const AddonInstance_PVR* instance,
3018 bool deleted,
3019 int* amount)
3020 {
3021 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3022 ->GetRecordingsAmount(deleted, *amount);
3023 }
3024
3025 inline static PVR_ERROR ADDON_GetRecordings(const AddonInstance_PVR* instance,
3026 ADDON_HANDLE handle,
3027 bool deleted)
3028 {
3029 PVRRecordingsResultSet result(instance, handle);
3030 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3031 ->GetRecordings(deleted, result);
3032 }
3033
3034 inline static PVR_ERROR ADDON_DeleteRecording(const AddonInstance_PVR* instance,
3035 const PVR_RECORDING* recording)
3036 {
3037 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3038 ->DeleteRecording(recording);
3039 }
3040
3041 inline static PVR_ERROR ADDON_UndeleteRecording(const AddonInstance_PVR* instance,
3042 const PVR_RECORDING* recording)
3043 {
3044 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3045 ->UndeleteRecording(recording);
3046 }
3047
3048 inline static PVR_ERROR ADDON_DeleteAllRecordingsFromTrash(const AddonInstance_PVR* instance)
3049 {
3050 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3051 ->DeleteAllRecordingsFromTrash();
3052 }
3053
3054 inline static PVR_ERROR ADDON_RenameRecording(const AddonInstance_PVR* instance,
3055 const PVR_RECORDING* recording)
3056 {
3057 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3058 ->RenameRecording(recording);
3059 }
3060
3061 inline static PVR_ERROR ADDON_SetRecordingLifetime(const AddonInstance_PVR* instance,
3062 const PVR_RECORDING* recording)
3063 {
3064 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3065 ->SetRecordingLifetime(recording);
3066 }
3067
3068 inline static PVR_ERROR ADDON_SetRecordingPlayCount(const AddonInstance_PVR* instance,
3069 const PVR_RECORDING* recording,
3070 int count)
3071 {
3072 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3073 ->SetRecordingPlayCount(recording, count);
3074 }
3075
3076 inline static PVR_ERROR ADDON_SetRecordingLastPlayedPosition(const AddonInstance_PVR* instance,
3077 const PVR_RECORDING* recording,
3078 int lastplayedposition)
3079 {
3080 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3081 ->SetRecordingLastPlayedPosition(recording, lastplayedposition);
3082 }
3083
3084 inline static PVR_ERROR ADDON_GetRecordingLastPlayedPosition(const AddonInstance_PVR* instance,
3085 const PVR_RECORDING* recording,
3086 int* position)
3087 {
3088 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3089 ->GetRecordingLastPlayedPosition(recording, *position);
3090 }
3091
3092 inline static PVR_ERROR ADDON_GetRecordingEdl(const AddonInstance_PVR* instance,
3093 const PVR_RECORDING* recording,
3094 PVR_EDL_ENTRY* edl,
3095 int* size)
3096 {
3097 *size = 0;
3098 std::vector<PVREDLEntry> edlList;
3099 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3100 ->GetRecordingEdl(recording, edlList);
3101 if (error == PVR_ERROR_NO_ERROR)
3102 {
3103 for (const auto& edlEntry : edlList)
3104 {
3105 edl[*size] = *edlEntry;
3106 ++*size;
3107 }
3108 }
3109 return error;
3110 }
3111
3112 inline static PVR_ERROR ADDON_GetRecordingSize(const AddonInstance_PVR* instance,
3113 const PVR_RECORDING* recording,
3114 int64_t* size)
3115 {
3116 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3117 ->GetRecordingSize(recording, *size);
3118 }
3119
3120 inline static PVR_ERROR ADDON_GetRecordingStreamProperties(const AddonInstance_PVR* instance,
3121 const PVR_RECORDING* recording,
3122 PVR_NAMED_VALUE* properties,
3123 unsigned int* propertiesCount)
3124 {
3125 *propertiesCount = 0;
3126 std::vector<PVRStreamProperty> propertiesList;
3127 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3128 ->GetRecordingStreamProperties(recording, propertiesList);
3129 if (error == PVR_ERROR_NO_ERROR)
3130 {
3131 for (const auto& property : propertiesList)
3132 {
3133 strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName,
3134 sizeof(properties[*propertiesCount].strName) - 1);
3135 strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue,
3136 sizeof(properties[*propertiesCount].strValue) - 1);
3137 ++*propertiesCount;
3138 if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT)
3139 break;
3140 }
3141 }
3142 return error;
3143 }
3144
3145 inline static PVR_ERROR ADDON_CallRecordingMenuHook(const AddonInstance_PVR* instance,
3146 const PVR_MENUHOOK* menuhook,
3147 const PVR_RECORDING* recording)
3148 {
3149 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3150 ->CallRecordingMenuHook(menuhook, recording);
3151 }
3152
3153 //--==----==----==----==----==----==----==----==----==----==----==----==----==
3154
3155
3156 inline static PVR_ERROR ADDON_GetTimerTypes(const AddonInstance_PVR* instance,
3157 PVR_TIMER_TYPE* types,
3158 int* typesCount)
3159 {
3160 *typesCount = 0;
3161 std::vector<PVRTimerType> timerTypes;
3162 PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3163 ->GetTimerTypes(timerTypes);
3164 if (error == PVR_ERROR_NO_ERROR)
3165 {
3166 for (const auto& timerType : timerTypes)
3167 {
3168 types[*typesCount] = *timerType;
3169 ++*typesCount;
3170 if (*typesCount >= PVR_ADDON_TIMERTYPE_ARRAY_SIZE)
3171 break;
3172 }
3173 }
3174 return error;
3175 }
3176
3177 inline static PVR_ERROR ADDON_GetTimersAmount(const AddonInstance_PVR* instance, int* amount)
3178 {
3179 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3180 ->GetTimersAmount(*amount);
3181 }
3182
3183 inline static PVR_ERROR ADDON_GetTimers(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
3184 {
3185 PVRTimersResultSet result(instance, handle);
3186 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->GetTimers(result);
3187 }
3188
3189 inline static PVR_ERROR ADDON_AddTimer(const AddonInstance_PVR* instance, const PVR_TIMER* timer)
3190 {
3191 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->AddTimer(timer);
3192 }
3193
3194 inline static PVR_ERROR ADDON_DeleteTimer(const AddonInstance_PVR* instance,
3195 const PVR_TIMER* timer,
3196 bool forceDelete)
3197 {
3198 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3199 ->DeleteTimer(timer, forceDelete);
3200 }
3201
3202 inline static PVR_ERROR ADDON_UpdateTimer(const AddonInstance_PVR* instance,
3203 const PVR_TIMER* timer)
3204 {
3205 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->UpdateTimer(timer);
3206 }
3207
3208 inline static PVR_ERROR ADDON_CallTimerMenuHook(const AddonInstance_PVR* instance,
3209 const PVR_MENUHOOK* menuhook,
3210 const PVR_TIMER* timer)
3211 {
3212 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3213 ->CallTimerMenuHook(menuhook, timer);
3214 }
3215
3216 //--==----==----==----==----==----==----==----==----==----==----==----==----==
3217
3218 inline static PVR_ERROR ADDON_OnSystemSleep(const AddonInstance_PVR* instance)
3219 {
3220 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->OnSystemSleep();
3221 }
3222
3223 inline static PVR_ERROR ADDON_OnSystemWake(const AddonInstance_PVR* instance)
3224 {
3225 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->OnSystemWake();
3226 }
3227
3228 inline static PVR_ERROR ADDON_OnPowerSavingActivated(const AddonInstance_PVR* instance)
3229 {
3230 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3231 ->OnPowerSavingActivated();
3232 }
3233
3234 inline static PVR_ERROR ADDON_OnPowerSavingDeactivated(const AddonInstance_PVR* instance)
3235 {
3236 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3237 ->OnPowerSavingDeactivated();
3238 }
3239
3240 // obsolete parts below
3241 ///@{
3242
3243 inline static bool ADDON_OpenLiveStream(const AddonInstance_PVR* instance,
3244 const PVR_CHANNEL* channel)
3245 {
3246 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3247 ->OpenLiveStream(channel);
3248 }
3249
3250 inline static void ADDON_CloseLiveStream(const AddonInstance_PVR* instance)
3251 {
3252 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CloseLiveStream();
3253 }
3254
3255 inline static int ADDON_ReadLiveStream(const AddonInstance_PVR* instance,
3256 unsigned char* buffer,
3257 unsigned int size)
3258 {
3259 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3260 ->ReadLiveStream(buffer, size);
3261 }
3262
3263 inline static int64_t ADDON_SeekLiveStream(const AddonInstance_PVR* instance,
3264 int64_t position,
3265 int whence)
3266 {
3267 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3268 ->SeekLiveStream(position, whence);
3269 }
3270
3271 inline static int64_t ADDON_LengthLiveStream(const AddonInstance_PVR* instance)
3272 {
3273 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->LengthLiveStream();
3274 }
3275
3276 inline static PVR_ERROR ADDON_GetStreamProperties(const AddonInstance_PVR* instance,
3277 PVR_STREAM_PROPERTIES* properties)
3278 {
3279 properties->iStreamCount = 0;
3280 std::vector<PVRStreamProperties> cppProperties;
3281 PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3282 ->GetStreamProperties(cppProperties);
3283 if (err == PVR_ERROR_NO_ERROR)
3284 {
3285 for (unsigned int i = 0; i < cppProperties.size(); ++i)
3286 {
3287 memcpy(&properties->stream[i],
3288 static_cast<PVR_STREAM_PROPERTIES::PVR_STREAM*>(cppProperties[i]),
3289 sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM));
3290 ++properties->iStreamCount;
3291
3292 if (properties->iStreamCount >= PVR_STREAM_MAX_STREAMS)
3293 {
3294 kodi::Log(
3295 ADDON_LOG_ERROR,
3296 "CInstancePVRClient::%s: Addon given with '%li' more allowed streams where '%i'",
3297 __func__, cppProperties.size(), PVR_STREAM_MAX_STREAMS);
3298 break;
3299 }
3300 }
3301 }
3302
3303 return err;
3304 }
3305
3306 inline static PVR_ERROR ADDON_GetStreamReadChunkSize(const AddonInstance_PVR* instance,
3307 int* chunksize)
3308 {
3309 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3310 ->GetStreamReadChunkSize(*chunksize);
3311 }
3312
3313 inline static bool ADDON_IsRealTimeStream(const AddonInstance_PVR* instance)
3314 {
3315 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->IsRealTimeStream();
3316 }
3317
3318 inline static bool ADDON_OpenRecordedStream(const AddonInstance_PVR* instance,
3319 const PVR_RECORDING* recording)
3320 {
3321 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3322 ->OpenRecordedStream(recording);
3323 }
3324
3325 inline static void ADDON_CloseRecordedStream(const AddonInstance_PVR* instance)
3326 {
3327 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CloseRecordedStream();
3328 }
3329
3330 inline static int ADDON_ReadRecordedStream(const AddonInstance_PVR* instance,
3331 unsigned char* buffer,
3332 unsigned int size)
3333 {
3334 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3335 ->ReadRecordedStream(buffer, size);
3336 }
3337
3338 inline static int64_t ADDON_SeekRecordedStream(const AddonInstance_PVR* instance,
3339 int64_t position,
3340 int whence)
3341 {
3342 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3343 ->SeekRecordedStream(position, whence);
3344 }
3345
3346 inline static int64_t ADDON_LengthRecordedStream(const AddonInstance_PVR* instance)
3347 {
3348 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3349 ->LengthRecordedStream();
3350 }
3351
3352 inline static void ADDON_DemuxReset(const AddonInstance_PVR* instance)
3353 {
3354 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxReset();
3355 }
3356
3357 inline static void ADDON_DemuxAbort(const AddonInstance_PVR* instance)
3358 {
3359 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxAbort();
3360 }
3361
3362 inline static void ADDON_DemuxFlush(const AddonInstance_PVR* instance)
3363 {
3364 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxFlush();
3365 }
3366
3367 inline static DemuxPacket* ADDON_DemuxRead(const AddonInstance_PVR* instance)
3368 {
3369 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxRead();
3370 }
3371
3372 inline static bool ADDON_CanPauseStream(const AddonInstance_PVR* instance)
3373 {
3374 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CanPauseStream();
3375 }
3376
3377 inline static bool ADDON_CanSeekStream(const AddonInstance_PVR* instance)
3378 {
3379 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CanSeekStream();
3380 }
3381
3382 inline static void ADDON_PauseStream(const AddonInstance_PVR* instance, bool bPaused)
3383 {
3384 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->PauseStream(bPaused);
3385 }
3386
3387 inline static bool ADDON_SeekTime(const AddonInstance_PVR* instance,
3388 double time,
3389 bool backwards,
3390 double* startpts)
3391 {
3392 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3393 ->SeekTime(time, backwards, *startpts);
3394 }
3395
3396 inline static void ADDON_SetSpeed(const AddonInstance_PVR* instance, int speed)
3397 {
3398 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->SetSpeed(speed);
3399 }
3400
3401 inline static void ADDON_FillBuffer(const AddonInstance_PVR* instance, bool mode)
3402 {
3403 static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->FillBuffer(mode);
3404 }
3405
3406 inline static PVR_ERROR ADDON_GetStreamTimes(const AddonInstance_PVR* instance,
3407 PVR_STREAM_TIMES* times)
3408 {
3409 PVRStreamTimes cppTimes(times);
3410 return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)
3411 ->GetStreamTimes(cppTimes);
3412 }
3413 ///@}
3414
3415 AddonInstance_PVR* m_instanceData = nullptr;
3416};
3417//}}}
3418//______________________________________________________________________________
3419
3420} /* namespace addon */
3421} /* namespace kodi */
3422
3423#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Peripheral.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Peripheral.h
deleted file mode 100644
index 2067d51..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Peripheral.h
+++ /dev/null
@@ -1,847 +0,0 @@
1/*
2 * Copyright (C) 2014-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 "../AddonBase.h"
12
13namespace kodi { namespace addon { class CInstancePeripheral; }}
14
15/* indicates a joystick has no preference for port number */
16#define NO_PORT_REQUESTED (-1)
17
18/* joystick's driver button/hat/axis index is unknown */
19#define DRIVER_INDEX_UNKNOWN (-1)
20
21extern "C"
22{
23
24 /// @name Peripheral types
25 ///{
26
27 /*!
28 * @brief API error codes
29 */
30 typedef enum PERIPHERAL_ERROR
31 {
32 PERIPHERAL_NO_ERROR = 0, // no error occurred
33 PERIPHERAL_ERROR_UNKNOWN = -1, // an unknown error occurred
34 PERIPHERAL_ERROR_FAILED = -2, // the command failed
35 PERIPHERAL_ERROR_INVALID_PARAMETERS = -3, // the parameters of the method are invalid for this operation
36 PERIPHERAL_ERROR_NOT_IMPLEMENTED = -4, // the method that the frontend called is not implemented
37 PERIPHERAL_ERROR_NOT_CONNECTED = -5, // no peripherals are connected
38 PERIPHERAL_ERROR_CONNECTION_FAILED = -6, // peripherals are connected, but command was interrupted
39 } PERIPHERAL_ERROR;
40
41 /*!
42 * @brief Peripheral types
43 */
44 typedef enum PERIPHERAL_TYPE
45 {
46 PERIPHERAL_TYPE_UNKNOWN,
47 PERIPHERAL_TYPE_JOYSTICK,
48 PERIPHERAL_TYPE_KEYBOARD,
49 } PERIPHERAL_TYPE;
50
51 /*!
52 * @brief Information shared between peripherals
53 */
54 typedef struct PERIPHERAL_INFO
55 {
56 PERIPHERAL_TYPE type; /*!< @brief type of peripheral */
57 char* name; /*!< @brief name of peripheral */
58 uint16_t vendor_id; /*!< @brief vendor ID of peripheral, 0x0000 if unknown */
59 uint16_t product_id; /*!< @brief product ID of peripheral, 0x0000 if unknown */
60 unsigned int index; /*!< @brief the order in which the add-on identified this peripheral */
61 } ATTRIBUTE_PACKED PERIPHERAL_INFO;
62
63 /*!
64 * @brief Peripheral add-on capabilities.
65 */
66 typedef struct PERIPHERAL_CAPABILITIES
67 {
68 bool provides_joysticks; /*!< @brief true if the add-on provides joysticks */
69 bool provides_joystick_rumble;
70 bool provides_joystick_power_off;
71 bool provides_buttonmaps; /*!< @brief true if the add-on provides button maps */
72 } ATTRIBUTE_PACKED PERIPHERAL_CAPABILITIES;
73 ///}
74
75 /// @name Event types
76 ///{
77
78 /*!
79 * @brief Types of events that can be sent and received
80 */
81 typedef enum PERIPHERAL_EVENT_TYPE
82 {
83 PERIPHERAL_EVENT_TYPE_NONE, /*!< @brief unknown event */
84 PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON, /*!< @brief state changed for joystick driver button */
85 PERIPHERAL_EVENT_TYPE_DRIVER_HAT, /*!< @brief state changed for joystick driver hat */
86 PERIPHERAL_EVENT_TYPE_DRIVER_AXIS, /*!< @brief state changed for joystick driver axis */
87 PERIPHERAL_EVENT_TYPE_SET_MOTOR, /*!< @brief set the state for joystick rumble motor */
88 } PERIPHERAL_EVENT_TYPE;
89
90 /*!
91 * @brief States a button can have
92 */
93 typedef enum JOYSTICK_STATE_BUTTON
94 {
95 JOYSTICK_STATE_BUTTON_UNPRESSED = 0x0, /*!< @brief button is released */
96 JOYSTICK_STATE_BUTTON_PRESSED = 0x1, /*!< @brief button is pressed */
97 } JOYSTICK_STATE_BUTTON;
98
99 /*!
100 * @brief States a D-pad (also called a hat) can have
101 */
102 typedef enum JOYSTICK_STATE_HAT
103 {
104 JOYSTICK_STATE_HAT_UNPRESSED = 0x0, /*!< @brief no directions are pressed */
105 JOYSTICK_STATE_HAT_LEFT = 0x1, /*!< @brief only left is pressed */
106 JOYSTICK_STATE_HAT_RIGHT = 0x2, /*!< @brief only right is pressed */
107 JOYSTICK_STATE_HAT_UP = 0x4, /*!< @brief only up is pressed */
108 JOYSTICK_STATE_HAT_DOWN = 0x8, /*!< @brief only down is pressed */
109 JOYSTICK_STATE_HAT_LEFT_UP = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_UP,
110 JOYSTICK_STATE_HAT_LEFT_DOWN = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_DOWN,
111 JOYSTICK_STATE_HAT_RIGHT_UP = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_UP,
112 JOYSTICK_STATE_HAT_RIGHT_DOWN = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_DOWN,
113 } JOYSTICK_STATE_HAT;
114
115 /*!
116 * @brief Axis value in the closed interval [-1.0, 1.0]
117 *
118 * The axis state uses the XInput coordinate system:
119 * - Negative values signify down or to the left
120 * - Positive values signify up or to the right
121 */
122 typedef float JOYSTICK_STATE_AXIS;
123
124 /*!
125 * @brief Motor value in the closed interval [0.0, 1.0]
126 */
127 typedef float JOYSTICK_STATE_MOTOR;
128
129 /*!
130 * @brief Event information
131 */
132 typedef struct PERIPHERAL_EVENT
133 {
134 /*! @brief Index of the peripheral handling/receiving the event */
135 unsigned int peripheral_index;
136
137 /*! @brief Type of the event used to determine which enum field to access below */
138 PERIPHERAL_EVENT_TYPE type;
139
140 /*! @brief The index of the event source */
141 unsigned int driver_index;
142
143 JOYSTICK_STATE_BUTTON driver_button_state;
144 JOYSTICK_STATE_HAT driver_hat_state;
145 JOYSTICK_STATE_AXIS driver_axis_state;
146 JOYSTICK_STATE_MOTOR motor_state;
147 } ATTRIBUTE_PACKED PERIPHERAL_EVENT;
148 ///}
149
150 /// @name Joystick types
151 ///{
152
153 /*!
154 * @brief Info specific to joystick peripherals
155 */
156 typedef struct JOYSTICK_INFO
157 {
158 PERIPHERAL_INFO peripheral; /*!< @brief peripheral info for this joystick */
159 char* provider; /*!< @brief name of the driver or interface providing the joystick */
160 int requested_port; /*!< @brief requested port number (such as for 360 controllers), or NO_PORT_REQUESTED */
161 unsigned int button_count; /*!< @brief number of buttons reported by the driver */
162 unsigned int hat_count; /*!< @brief number of hats reported by the driver */
163 unsigned int axis_count; /*!< @brief number of axes reported by the driver */
164 unsigned int motor_count; /*!< @brief number of motors reported by the driver */
165 bool supports_poweroff; /*!< @brief whether the joystick supports being powered off */
166 } ATTRIBUTE_PACKED JOYSTICK_INFO;
167
168 /*!
169 * @brief Driver input primitives
170 *
171 * Mapping lower-level driver values to higher-level controller features is
172 * non-injective; two triggers can share a single axis.
173 *
174 * To handle this, driver values are subdivided into "primitives" that map
175 * injectively to higher-level features.
176 */
177 typedef enum JOYSTICK_DRIVER_PRIMITIVE_TYPE
178 {
179 JOYSTICK_DRIVER_PRIMITIVE_TYPE_UNKNOWN,
180 JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON,
181 JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION,
182 JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS,
183 JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR,
184 JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY,
185 JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON,
186 JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION,
187 } JOYSTICK_DRIVER_PRIMITIVE_TYPE;
188
189 /*!
190 * @brief Button primitive
191 */
192 typedef struct JOYSTICK_DRIVER_BUTTON
193 {
194 int index;
195 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_BUTTON;
196
197 /*!
198 * @brief Hat direction
199 */
200 typedef enum JOYSTICK_DRIVER_HAT_DIRECTION
201 {
202 JOYSTICK_DRIVER_HAT_UNKNOWN,
203 JOYSTICK_DRIVER_HAT_LEFT,
204 JOYSTICK_DRIVER_HAT_RIGHT,
205 JOYSTICK_DRIVER_HAT_UP,
206 JOYSTICK_DRIVER_HAT_DOWN,
207 } JOYSTICK_DRIVER_HAT_DIRECTION;
208
209 /*!
210 * @brief Hat direction primitive
211 */
212 typedef struct JOYSTICK_DRIVER_HAT
213 {
214 int index;
215 JOYSTICK_DRIVER_HAT_DIRECTION direction;
216 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_HAT;
217
218 /*!
219 * @brief Semiaxis direction
220 */
221 typedef enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION
222 {
223 JOYSTICK_DRIVER_SEMIAXIS_NEGATIVE = -1, /*!< @brief negative half of the axis */
224 JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN = 0, /*!< @brief unknown direction */
225 JOYSTICK_DRIVER_SEMIAXIS_POSITIVE = 1, /*!< @brief positive half of the axis */
226 } JOYSTICK_DRIVER_SEMIAXIS_DIRECTION;
227
228 /*!
229 * @brief Semiaxis primitive
230 */
231 typedef struct JOYSTICK_DRIVER_SEMIAXIS
232 {
233 int index;
234 int center;
235 JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction;
236 unsigned int range;
237 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_SEMIAXIS;
238
239 /*!
240 * @brief Motor primitive
241 */
242 typedef struct JOYSTICK_DRIVER_MOTOR
243 {
244 int index;
245 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOTOR;
246
247 /*!
248 * @brief Keyboard key primitive
249 */
250 typedef struct JOYSTICK_DRIVER_KEY
251 {
252 char keycode[16];
253 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_KEY;
254
255 /*!
256 * @brief Mouse buttons
257 */
258 typedef enum JOYSTICK_DRIVER_MOUSE_INDEX
259 {
260 JOYSTICK_DRIVER_MOUSE_INDEX_UNKNOWN,
261 JOYSTICK_DRIVER_MOUSE_INDEX_LEFT,
262 JOYSTICK_DRIVER_MOUSE_INDEX_RIGHT,
263 JOYSTICK_DRIVER_MOUSE_INDEX_MIDDLE,
264 JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON4,
265 JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON5,
266 JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_UP,
267 JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_DOWN,
268 JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_LEFT,
269 JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_RIGHT,
270 } JOYSTICK_DRIVER_MOUSE_INDEX;
271
272 /*!
273 * @brief Mouse button primitive
274 */
275 typedef struct JOYSTICK_DRIVER_MOUSE_BUTTON
276 {
277 JOYSTICK_DRIVER_MOUSE_INDEX button;
278 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOUSE_BUTTON;
279
280 /*!
281 * @brief Relative pointer direction
282 */
283 typedef enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION
284 {
285 JOYSTICK_DRIVER_RELPOINTER_UNKNOWN,
286 JOYSTICK_DRIVER_RELPOINTER_LEFT,
287 JOYSTICK_DRIVER_RELPOINTER_RIGHT,
288 JOYSTICK_DRIVER_RELPOINTER_UP,
289 JOYSTICK_DRIVER_RELPOINTER_DOWN,
290 } JOYSTICK_DRIVER_RELPOINTER_DIRECTION;
291
292 /*!
293 * @brief Relative pointer direction primitive
294 */
295 typedef struct JOYSTICK_DRIVER_RELPOINTER
296 {
297 JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction;
298 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_RELPOINTER;
299
300 /*!
301 * @brief Driver primitive struct
302 */
303 typedef struct JOYSTICK_DRIVER_PRIMITIVE
304 {
305 JOYSTICK_DRIVER_PRIMITIVE_TYPE type;
306 union
307 {
308 struct JOYSTICK_DRIVER_BUTTON button;
309 struct JOYSTICK_DRIVER_HAT hat;
310 struct JOYSTICK_DRIVER_SEMIAXIS semiaxis;
311 struct JOYSTICK_DRIVER_MOTOR motor;
312 struct JOYSTICK_DRIVER_KEY key;
313 struct JOYSTICK_DRIVER_MOUSE_BUTTON mouse;
314 struct JOYSTICK_DRIVER_RELPOINTER relpointer;
315 };
316 } ATTRIBUTE_PACKED JOYSTICK_DRIVER_PRIMITIVE;
317
318 /*!
319 * @brief Controller feature
320 *
321 * Controller features are an abstraction over driver values. Each feature
322 * maps to one or more driver primitives.
323 */
324 typedef enum JOYSTICK_FEATURE_TYPE
325 {
326 JOYSTICK_FEATURE_TYPE_UNKNOWN,
327 JOYSTICK_FEATURE_TYPE_SCALAR,
328 JOYSTICK_FEATURE_TYPE_ANALOG_STICK,
329 JOYSTICK_FEATURE_TYPE_ACCELEROMETER,
330 JOYSTICK_FEATURE_TYPE_MOTOR,
331 JOYSTICK_FEATURE_TYPE_RELPOINTER,
332 JOYSTICK_FEATURE_TYPE_ABSPOINTER,
333 JOYSTICK_FEATURE_TYPE_WHEEL,
334 JOYSTICK_FEATURE_TYPE_THROTTLE,
335 JOYSTICK_FEATURE_TYPE_KEY,
336 } JOYSTICK_FEATURE_TYPE;
337
338 /*!
339 * @brief Indices used to access a feature's driver primitives
340 */
341 typedef enum JOYSTICK_FEATURE_PRIMITIVE
342 {
343 // Scalar feature (a button, hat direction or semiaxis)
344 JOYSTICK_SCALAR_PRIMITIVE = 0,
345
346 // Analog stick
347 JOYSTICK_ANALOG_STICK_UP = 0,
348 JOYSTICK_ANALOG_STICK_DOWN = 1,
349 JOYSTICK_ANALOG_STICK_RIGHT = 2,
350 JOYSTICK_ANALOG_STICK_LEFT = 3,
351
352 // Accelerometer
353 JOYSTICK_ACCELEROMETER_POSITIVE_X = 0,
354 JOYSTICK_ACCELEROMETER_POSITIVE_Y = 1,
355 JOYSTICK_ACCELEROMETER_POSITIVE_Z = 2,
356
357 // Motor
358 JOYSTICK_MOTOR_PRIMITIVE = 0,
359
360 // Wheel
361 JOYSTICK_WHEEL_LEFT = 0,
362 JOYSTICK_WHEEL_RIGHT = 1,
363
364 // Throttle
365 JOYSTICK_THROTTLE_UP = 0,
366 JOYSTICK_THROTTLE_DOWN = 1,
367
368 // Key
369 JOYSTICK_KEY_PRIMITIVE = 0,
370
371 // Mouse button
372 JOYSTICK_MOUSE_BUTTON = 0,
373
374 // Relative pointer direction
375 JOYSTICK_RELPOINTER_UP = 0,
376 JOYSTICK_RELPOINTER_DOWN = 1,
377 JOYSTICK_RELPOINTER_RIGHT = 2,
378 JOYSTICK_RELPOINTER_LEFT = 3,
379
380 // Maximum number of primitives
381 JOYSTICK_PRIMITIVE_MAX = 4,
382 } JOYSTICK_FEATURE_PRIMITIVE;
383
384 /*!
385 * @brief Mapping between higher-level controller feature and its driver primitives
386 */
387 typedef struct JOYSTICK_FEATURE
388 {
389 char* name;
390 JOYSTICK_FEATURE_TYPE type;
391 struct JOYSTICK_DRIVER_PRIMITIVE primitives[JOYSTICK_PRIMITIVE_MAX];
392 } ATTRIBUTE_PACKED JOYSTICK_FEATURE;
393 ///}
394
395 typedef struct AddonProps_Peripheral
396 {
397 const char* user_path; /*!< @brief path to the user profile */
398 const char* addon_path; /*!< @brief path to this add-on */
399 } ATTRIBUTE_PACKED AddonProps_Peripheral;
400
401 struct AddonInstance_Peripheral;
402
403 typedef struct AddonToKodiFuncTable_Peripheral
404 {
405 KODI_HANDLE kodiInstance;
406 void (*trigger_scan)(void* kodiInstance);
407 void (*refresh_button_maps)(void* kodiInstance, const char* device_name, const char* controller_id);
408 unsigned int (*feature_count)(void* kodiInstance, const char* controller_id, JOYSTICK_FEATURE_TYPE type);
409 JOYSTICK_FEATURE_TYPE (*feature_type)(void* kodiInstance, const char* controller_id, const char* feature_name);
410 } AddonToKodiFuncTable_Peripheral;
411
412 //! @todo Mouse, light gun, multitouch
413
414 typedef struct KodiToAddonFuncTable_Peripheral
415 {
416 kodi::addon::CInstancePeripheral* addonInstance;
417
418 void (__cdecl* get_capabilities)(const AddonInstance_Peripheral* addonInstance, PERIPHERAL_CAPABILITIES* capabilities);
419 PERIPHERAL_ERROR (__cdecl* perform_device_scan)(const AddonInstance_Peripheral* addonInstance, unsigned int* peripheral_count, PERIPHERAL_INFO** scan_results);
420 void (__cdecl* free_scan_results)(const AddonInstance_Peripheral* addonInstance, unsigned int peripheral_count, PERIPHERAL_INFO* scan_results);
421 PERIPHERAL_ERROR (__cdecl* get_events)(const AddonInstance_Peripheral* addonInstance, unsigned int* event_count, PERIPHERAL_EVENT** events);
422 void (__cdecl* free_events)(const AddonInstance_Peripheral* addonInstance, unsigned int event_count, PERIPHERAL_EVENT* events);
423 bool (__cdecl* send_event)(const AddonInstance_Peripheral* addonInstance, const PERIPHERAL_EVENT* event);
424
425 /// @name Joystick operations
426 ///{
427 PERIPHERAL_ERROR (__cdecl* get_joystick_info)(const AddonInstance_Peripheral* addonInstance, unsigned int index, JOYSTICK_INFO* info);
428 void (__cdecl* free_joystick_info)(const AddonInstance_Peripheral* addonInstance, JOYSTICK_INFO* info);
429 PERIPHERAL_ERROR (__cdecl* get_features)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, const char* controller_id, unsigned int* feature_count, JOYSTICK_FEATURE** features);
430 void (__cdecl* free_features)(const AddonInstance_Peripheral* addonInstance, unsigned int feature_count, JOYSTICK_FEATURE* features);
431 PERIPHERAL_ERROR (__cdecl* map_features)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, const char* controller_id, unsigned int feature_count, const JOYSTICK_FEATURE* features);
432 PERIPHERAL_ERROR (__cdecl* get_ignored_primitives)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, unsigned int* feature_count, JOYSTICK_DRIVER_PRIMITIVE** primitives);
433 void (__cdecl* free_primitives)(const AddonInstance_Peripheral* addonInstance, unsigned int, JOYSTICK_DRIVER_PRIMITIVE* primitives);
434 PERIPHERAL_ERROR (__cdecl* set_ignored_primitives)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, unsigned int primitive_count, const JOYSTICK_DRIVER_PRIMITIVE* primitives);
435 void (__cdecl* save_button_map)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick);
436 void (__cdecl* revert_button_map)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick);
437 void (__cdecl* reset_button_map)(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, const char* controller_id);
438 void (__cdecl* power_off_joystick)(const AddonInstance_Peripheral* addonInstance, unsigned int index);
439 ///}
440 } KodiToAddonFuncTable_Peripheral;
441
442 typedef struct AddonInstance_Peripheral
443 {
444 AddonProps_Peripheral props;
445 AddonToKodiFuncTable_Peripheral toKodi;
446 KodiToAddonFuncTable_Peripheral toAddon;
447 } AddonInstance_Peripheral;
448
449} /* extern "C" */
450
451namespace kodi
452{
453namespace addon
454{
455
456 class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance
457 {
458 public:
459 CInstancePeripheral()
460 : IAddonInstance(ADDON_INSTANCE_PERIPHERAL, GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL))
461 {
462 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
463 throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of more as one in single instance way is not allowed!");
464
465 SetAddonStruct(CAddonBase::m_interface->firstKodiInstance);
466 CAddonBase::m_interface->globalSingleInstance = this;
467 }
468
469 explicit CInstancePeripheral(KODI_HANDLE instance, const std::string& kodiVersion = "")
470 : IAddonInstance(ADDON_INSTANCE_PERIPHERAL,
471 !kodiVersion.empty() ? kodiVersion
472 : GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL))
473 {
474 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
475 throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of multiple together with single instance way is not allowed!");
476
477 SetAddonStruct(instance);
478 }
479
480 ~CInstancePeripheral() override = default;
481
482 /// @name Peripheral operations
483 ///{
484 /*!
485 * @brief Get the list of features that this add-on provides
486 * @param capabilities The add-on's capabilities.
487 * @remarks Valid implementation required.
488 *
489 * Called by the frontend to query the add-on's capabilities and supported
490 * peripherals. All capabilities that the add-on supports should be set to true.
491 *
492 */
493 virtual void GetCapabilities(PERIPHERAL_CAPABILITIES &capabilities) { }
494
495 /*!
496 * @brief Perform a scan for joysticks
497 * @param peripheral_count Assigned to the number of peripherals allocated
498 * @param scan_results Assigned to allocated memory
499 * @return PERIPHERAL_NO_ERROR if successful; peripherals must be freed using
500 * FreeScanResults() in this case
501 *
502 * The frontend calls this when a hardware change is detected. If an add-on
503 * detects a hardware change, it can trigger this function using the
504 * TriggerScan() callback.
505 */
506 virtual PERIPHERAL_ERROR PerformDeviceScan(unsigned int* peripheral_count, PERIPHERAL_INFO** scan_results) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
507
508 /*!
509 * @brief Free the memory allocated in PerformDeviceScan()
510 *
511 * Must be called if PerformDeviceScan() returns PERIPHERAL_NO_ERROR.
512 *
513 * @param peripheral_count The number of events allocated for the events array
514 * @param scan_results The array of allocated peripherals
515 */
516 virtual void FreeScanResults(unsigned int peripheral_count, PERIPHERAL_INFO* scan_results) { }
517
518 /*!
519 * @brief Get all events that have occurred since the last call to GetEvents()
520 * @return PERIPHERAL_NO_ERROR if successful; events must be freed using
521 * FreeEvents() in this case
522 */
523 virtual PERIPHERAL_ERROR GetEvents(unsigned int* event_count, PERIPHERAL_EVENT** events) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
524
525 /*!
526 * @brief Free the memory allocated in GetEvents()
527 *
528 * Must be called if GetEvents() returns PERIPHERAL_NO_ERROR.
529 *
530 * @param event_count The number of events allocated for the events array
531 * @param events The array of allocated events
532 */
533 virtual void FreeEvents(unsigned int event_count, PERIPHERAL_EVENT* events) { }
534
535 /*!
536 * @brief Send an input event to the peripheral
537 * @param event The input event
538 * @return true if the event was handled, false otherwise
539 */
540 virtual bool SendEvent(const PERIPHERAL_EVENT* event) { return false; }
541 ///}
542
543 /// @name Joystick operations
544 /*!
545 * @note #define PERIPHERAL_ADDON_JOYSTICKS before including kodi_peripheral_dll.h
546 * in the add-on if the add-on provides joysticks and add provides_joysticks="true"
547 * to the kodi.peripheral extension point node in addon.xml.
548 */
549 ///{
550 /*!
551 * @brief Get extended info about an attached joystick
552 * @param index The joystick's driver index
553 * @param info The container for the allocated joystick info
554 * @return PERIPHERAL_NO_ERROR if successful; array must be freed using
555 * FreeJoystickInfo() in this case
556 */
557 virtual PERIPHERAL_ERROR GetJoystickInfo(unsigned int index, JOYSTICK_INFO* info) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
558
559 /*!
560 * @brief Free the memory allocated in GetJoystickInfo()
561 */
562 virtual void FreeJoystickInfo(JOYSTICK_INFO* info) { }
563
564 /*!
565 * @brief Get the features that allow translating the joystick into the controller profile
566 * @param joystick The device's joystick properties; unknown values may be left at their default
567 * @param controller_id The controller profile being requested, e.g. game.controller.default
568 * @param feature_count The number of features allocated for the features array
569 * @param features The array of allocated features
570 * @return PERIPHERAL_NO_ERROR if successful; array must be freed using
571 * FreeButtonMap() in this case
572 */
573 virtual PERIPHERAL_ERROR GetFeatures(const JOYSTICK_INFO* joystick, const char* controller_id,
574 unsigned int* feature_count, JOYSTICK_FEATURE** features) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
575
576 /*!
577 * @brief Free the memory allocated in GetFeatures()
578 *
579 * Must be called if GetFeatures() returns PERIPHERAL_NO_ERROR.
580 *
581 * @param feature_count The number of features allocated for the features array
582 * @param features The array of allocated features
583 */
584 virtual void FreeFeatures(unsigned int feature_count, JOYSTICK_FEATURE* features) { }
585
586 /*!
587 * @brief Add or update joystick features
588 * @param joystick The device's joystick properties; unknown values may be left at their default
589 * @param controller_id The game controller profile being updated
590 * @param feature_count The number of features in the features array
591 * @param features The array of features
592 * @return PERIPHERAL_NO_ERROR if successful
593 */
594 virtual PERIPHERAL_ERROR MapFeatures(const JOYSTICK_INFO* joystick, const char* controller_id,
595 unsigned int feature_count, const JOYSTICK_FEATURE* features) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
596
597 /*!
598 * @brief Get the driver primitives that should be ignored while mapping the device
599 * @param joystick The device's joystick properties; unknown values may be left at their default
600 * @param primitive_count The number of features allocated for the primitives array
601 * @param primitives The array of allocated driver primitives to be ignored
602 * @return PERIPHERAL_NO_ERROR if successful; array must be freed using
603 * FreePrimitives() in this case
604 */
605 virtual PERIPHERAL_ERROR GetIgnoredPrimitives(const JOYSTICK_INFO* joystick,
606 unsigned int* primitive_count,
607 JOYSTICK_DRIVER_PRIMITIVE** primitives) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
608
609 /*!
610 * @brief Free the memory allocated in GetIgnoredPrimitives()
611 *
612 * Must be called if GetIgnoredPrimitives() returns PERIPHERAL_NO_ERROR.
613 *
614 * @param primitive_count The number of driver primitives allocated for the primitives array
615 * @param primitives The array of allocated driver primitives
616 */
617 virtual void FreePrimitives(unsigned int primitive_count, JOYSTICK_DRIVER_PRIMITIVE* primitives) { }
618
619 /*!
620 * @brief Set the list of driver primitives that are ignored for the device
621 * @param joystick The device's joystick properties; unknown values may be left at their default
622 * @param primitive_count The number of driver features in the primitives array
623 * @param primitives The array of driver primitives to ignore
624 * @return PERIPHERAL_NO_ERROR if successful
625 */
626 virtual PERIPHERAL_ERROR SetIgnoredPrimitives(const JOYSTICK_INFO* joystick,
627 unsigned int primitive_count,
628 const JOYSTICK_DRIVER_PRIMITIVE* primitives) { return PERIPHERAL_ERROR_NOT_IMPLEMENTED; }
629
630 /*!
631 * @brief Save the button map for the given joystick
632 * @param joystick The device's joystick properties
633 */
634 virtual void SaveButtonMap(const JOYSTICK_INFO* joystick) { }
635
636 /*!
637 * @brief Revert the button map to the last time it was loaded or committed to disk
638 * @param joystick The device's joystick properties
639 */
640 virtual void RevertButtonMap(const JOYSTICK_INFO* joystick) { }
641
642 /*!
643 * @brief Reset the button map for the given joystick and controller profile ID
644 * @param joystick The device's joystick properties
645 * @param controller_id The game controller profile being reset
646 */
647 virtual void ResetButtonMap(const JOYSTICK_INFO* joystick, const char* controller_id) { }
648
649 /*!
650 * @brief Powers off the given joystick if supported
651 * @param index The joystick's driver index
652 */
653 virtual void PowerOffJoystick(unsigned int index) { }
654
655 const std::string AddonPath() const
656 {
657 return m_instanceData->props.addon_path;
658 }
659
660 const std::string UserPath() const
661 {
662 return m_instanceData->props.user_path;
663 }
664
665 /*!
666 * @brief Trigger a scan for peripherals
667 *
668 * The add-on calls this if a change in hardware is detected.
669 */
670 void TriggerScan(void)
671 {
672 return m_instanceData->toKodi.trigger_scan(m_instanceData->toKodi.kodiInstance);
673 }
674
675 /*!
676 * @brief Notify the frontend that button maps have changed
677 *
678 * @param[optional] deviceName The name of the device to refresh, or empty/null for all devices
679 * @param[optional] controllerId The controller ID to refresh, or empty/null for all controllers
680 */
681 void RefreshButtonMaps(const std::string& deviceName = "", const std::string& controllerId = "")
682 {
683 return m_instanceData->toKodi.refresh_button_maps(m_instanceData->toKodi.kodiInstance, deviceName.c_str(), controllerId.c_str());
684 }
685
686 /*!
687 * @brief Return the number of features belonging to the specified controller
688 *
689 * @param controllerId The controller ID to enumerate
690 * @param type[optional] Type to filter by, or JOYSTICK_FEATURE_TYPE_UNKNOWN for all features
691 *
692 * @return The number of features matching the request parameters
693 */
694 unsigned int FeatureCount(const std::string& controllerId, JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN)
695 {
696 return m_instanceData->toKodi.feature_count(m_instanceData->toKodi.kodiInstance, controllerId.c_str(), type);
697 }
698
699 /*!
700 * @brief Return the type of the feature
701 *
702 * @param controllerId The controller ID to check
703 * @param featureName The feature to check
704 *
705 * @return The type of the specified feature, or JOYSTICK_FEATURE_TYPE_UNKNOWN
706 * if unknown
707 */
708 JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId, const std::string &featureName)
709 {
710 return m_instanceData->toKodi.feature_type(m_instanceData->toKodi.kodiInstance, controllerId.c_str(), featureName.c_str());
711 }
712
713 private:
714 void SetAddonStruct(KODI_HANDLE instance)
715 {
716 if (instance == nullptr)
717 throw std::logic_error("kodi::addon::CInstancePeripheral: Creation with empty addon structure not allowed, table must be given from Kodi!");
718
719 m_instanceData = static_cast<AddonInstance_Peripheral*>(instance);
720 m_instanceData->toAddon.addonInstance = this;
721
722 m_instanceData->toAddon.get_capabilities = ADDON_GetCapabilities;
723 m_instanceData->toAddon.perform_device_scan = ADDON_PerformDeviceScan;
724 m_instanceData->toAddon.free_scan_results = ADDON_FreeScanResults;
725 m_instanceData->toAddon.get_events = ADDON_GetEvents;
726 m_instanceData->toAddon.free_events = ADDON_FreeEvents;
727 m_instanceData->toAddon.send_event = ADDON_SendEvent;
728
729 m_instanceData->toAddon.get_joystick_info = ADDON_GetJoystickInfo;
730 m_instanceData->toAddon.free_joystick_info = ADDON_FreeJoystickInfo;
731 m_instanceData->toAddon.get_features = ADDON_GetFeatures;
732 m_instanceData->toAddon.free_features = ADDON_FreeFeatures;
733 m_instanceData->toAddon.map_features = ADDON_MapFeatures;
734 m_instanceData->toAddon.get_ignored_primitives = ADDON_GetIgnoredPrimitives;
735 m_instanceData->toAddon.free_primitives = ADDON_FreePrimitives;
736 m_instanceData->toAddon.set_ignored_primitives = ADDON_SetIgnoredPrimitives;
737 m_instanceData->toAddon.save_button_map = ADDON_SaveButtonMap;
738 m_instanceData->toAddon.revert_button_map = ADDON_RevertButtonMap;
739 m_instanceData->toAddon.reset_button_map = ADDON_ResetButtonMap;
740 m_instanceData->toAddon.power_off_joystick = ADDON_PowerOffJoystick;
741 }
742
743 inline static void ADDON_GetCapabilities(const AddonInstance_Peripheral* addonInstance, PERIPHERAL_CAPABILITIES *capabilities)
744 {
745 addonInstance->toAddon.addonInstance->GetCapabilities(*capabilities);
746 }
747
748 inline static PERIPHERAL_ERROR ADDON_PerformDeviceScan(const AddonInstance_Peripheral* addonInstance, unsigned int* peripheral_count, PERIPHERAL_INFO** scan_results)
749 {
750 return addonInstance->toAddon.addonInstance->PerformDeviceScan(peripheral_count, scan_results);
751 }
752
753 inline static void ADDON_FreeScanResults(const AddonInstance_Peripheral* addonInstance, unsigned int peripheral_count, PERIPHERAL_INFO* scan_results)
754 {
755 addonInstance->toAddon.addonInstance->FreeScanResults(peripheral_count, scan_results);
756 }
757
758 inline static PERIPHERAL_ERROR ADDON_GetEvents(const AddonInstance_Peripheral* addonInstance, unsigned int* event_count, PERIPHERAL_EVENT** events)
759 {
760 return addonInstance->toAddon.addonInstance->GetEvents(event_count, events);
761 }
762
763 inline static void ADDON_FreeEvents(const AddonInstance_Peripheral* addonInstance, unsigned int event_count, PERIPHERAL_EVENT* events)
764 {
765 addonInstance->toAddon.addonInstance->FreeEvents(event_count, events);
766 }
767
768 inline static bool ADDON_SendEvent(const AddonInstance_Peripheral* addonInstance, const PERIPHERAL_EVENT* event)
769 {
770 return addonInstance->toAddon.addonInstance->SendEvent(event);
771 }
772
773
774 inline static PERIPHERAL_ERROR ADDON_GetJoystickInfo(const AddonInstance_Peripheral* addonInstance, unsigned int index, JOYSTICK_INFO* info)
775 {
776 return addonInstance->toAddon.addonInstance->GetJoystickInfo(index, info);
777 }
778
779 inline static void ADDON_FreeJoystickInfo(const AddonInstance_Peripheral* addonInstance, JOYSTICK_INFO* info)
780 {
781 addonInstance->toAddon.addonInstance->FreeJoystickInfo(info);
782 }
783
784 inline static PERIPHERAL_ERROR ADDON_GetFeatures(const AddonInstance_Peripheral* addonInstance,
785 const JOYSTICK_INFO* joystick, const char* controller_id,
786 unsigned int* feature_count, JOYSTICK_FEATURE** features)
787 {
788 return addonInstance->toAddon.addonInstance->GetFeatures(joystick, controller_id, feature_count, features);
789 }
790
791 inline static void ADDON_FreeFeatures(const AddonInstance_Peripheral* addonInstance, unsigned int feature_count, JOYSTICK_FEATURE* features)
792 {
793 addonInstance->toAddon.addonInstance->FreeFeatures(feature_count, features);
794 }
795
796 inline static PERIPHERAL_ERROR ADDON_MapFeatures(const AddonInstance_Peripheral* addonInstance,
797 const JOYSTICK_INFO* joystick, const char* controller_id,
798 unsigned int feature_count, const JOYSTICK_FEATURE* features)
799 {
800 return addonInstance->toAddon.addonInstance->MapFeatures(joystick, controller_id, feature_count, features);
801 }
802
803 inline static PERIPHERAL_ERROR ADDON_GetIgnoredPrimitives(const AddonInstance_Peripheral* addonInstance,
804 const JOYSTICK_INFO* joystick, unsigned int* primitive_count,
805 JOYSTICK_DRIVER_PRIMITIVE** primitives)
806 {
807 return addonInstance->toAddon.addonInstance->GetIgnoredPrimitives(joystick, primitive_count, primitives);
808 }
809
810 inline static void ADDON_FreePrimitives(const AddonInstance_Peripheral* addonInstance,
811 unsigned int primitive_count, JOYSTICK_DRIVER_PRIMITIVE* primitives)
812 {
813 addonInstance->toAddon.addonInstance->FreePrimitives(primitive_count, primitives);
814 }
815
816 inline static PERIPHERAL_ERROR ADDON_SetIgnoredPrimitives(const AddonInstance_Peripheral* addonInstance,
817 const JOYSTICK_INFO* joystick, unsigned int primitive_count,
818 const JOYSTICK_DRIVER_PRIMITIVE* primitives)
819 {
820 return addonInstance->toAddon.addonInstance->SetIgnoredPrimitives(joystick, primitive_count, primitives);
821 }
822
823 inline static void ADDON_SaveButtonMap(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick)
824 {
825 addonInstance->toAddon.addonInstance->SaveButtonMap(joystick);
826 }
827
828 inline static void ADDON_RevertButtonMap(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick)
829 {
830 addonInstance->toAddon.addonInstance->RevertButtonMap(joystick);
831 }
832
833 inline static void ADDON_ResetButtonMap(const AddonInstance_Peripheral* addonInstance, const JOYSTICK_INFO* joystick, const char* controller_id)
834 {
835 addonInstance->toAddon.addonInstance->ResetButtonMap(joystick, controller_id);
836 }
837
838 inline static void ADDON_PowerOffJoystick(const AddonInstance_Peripheral* addonInstance, unsigned int index)
839 {
840 addonInstance->toAddon.addonInstance->PowerOffJoystick(index);
841 }
842
843 AddonInstance_Peripheral* m_instanceData;
844 };
845
846} /* namespace addon */
847} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PeripheralUtils.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PeripheralUtils.h
deleted file mode 100644
index 62e5a93..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/PeripheralUtils.h
+++ /dev/null
@@ -1,735 +0,0 @@
1/*
2 * Copyright (C) 2014-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 "Peripheral.h"
12
13#include <array> // Requires c++11
14#include <cstring>
15#include <string>
16#include <utility>
17#include <vector>
18
19#define PERIPHERAL_SAFE_DELETE(x) do { delete (x); (x) = NULL; } while (0)
20#define PERIPHERAL_SAFE_DELETE_ARRAY(x) do { delete[] (x); (x) = NULL; } while (0)
21
22namespace kodi
23{
24namespace addon
25{
26 /*!
27 * Utility class to manipulate arrays of peripheral types.
28 */
29 template <class THE_CLASS, typename THE_STRUCT>
30 class PeripheralVector
31 {
32 public:
33 static void ToStructs(const std::vector<THE_CLASS>& vecObjects, THE_STRUCT** pStructs)
34 {
35 if (!pStructs)
36 return;
37
38 if (vecObjects.empty())
39 {
40 *pStructs = NULL;
41 }
42 else
43 {
44 (*pStructs) = new THE_STRUCT[vecObjects.size()];
45 for (unsigned int i = 0; i < vecObjects.size(); i++)
46 vecObjects.at(i).ToStruct((*pStructs)[i]);
47 }
48 }
49
50 static void ToStructs(const std::vector<THE_CLASS*>& vecObjects, THE_STRUCT** pStructs)
51 {
52 if (!pStructs)
53 return;
54
55 if (vecObjects.empty())
56 {
57 *pStructs = NULL;
58 }
59 else
60 {
61 *pStructs = new THE_STRUCT[vecObjects.size()];
62 for (unsigned int i = 0; i < vecObjects.size(); i++)
63 vecObjects.at(i)->ToStruct((*pStructs)[i]);
64 }
65 }
66
67 static void FreeStructs(unsigned int structCount, THE_STRUCT* structs)
68 {
69 if (structs)
70 {
71 for (unsigned int i = 0; i < structCount; i++)
72 THE_CLASS::FreeStruct(structs[i]);
73 }
74 PERIPHERAL_SAFE_DELETE_ARRAY(structs);
75 }
76 };
77
78 /*!
79 * ADDON::Peripheral
80 *
81 * Wrapper class providing peripheral information. Classes can extend
82 * Peripheral to inherit peripheral properties.
83 */
84 class Peripheral
85 {
86 public:
87 Peripheral(PERIPHERAL_TYPE type = PERIPHERAL_TYPE_UNKNOWN, const std::string& strName = "") :
88 m_type(type),
89 m_strName(strName)
90 {
91 }
92
93 explicit Peripheral(const PERIPHERAL_INFO& info) :
94 m_type(info.type),
95 m_strName(info.name ? info.name : ""),
96 m_vendorId(info.vendor_id),
97 m_productId(info.product_id),
98 m_index(info.index)
99 {
100 }
101
102 virtual ~Peripheral(void) = default;
103
104 PERIPHERAL_TYPE Type(void) const { return m_type; }
105 const std::string& Name(void) const { return m_strName; }
106 uint16_t VendorID(void) const { return m_vendorId; }
107 uint16_t ProductID(void) const { return m_productId; }
108 unsigned int Index(void) const { return m_index; }
109
110 // Derived property: VID and PID are 0x0000 if unknown
111 bool IsVidPidKnown(void) const { return m_vendorId != 0 || m_productId != 0; }
112
113 void SetType(PERIPHERAL_TYPE type) { m_type = type; }
114 void SetName(const std::string& strName) { m_strName = strName; }
115 void SetVendorID(uint16_t vendorId) { m_vendorId = vendorId; }
116 void SetProductID(uint16_t productId) { m_productId = productId; }
117 void SetIndex(unsigned int index) { m_index = index; }
118
119 void ToStruct(PERIPHERAL_INFO& info) const
120 {
121 info.type = m_type;
122 info.name = new char[m_strName.size() + 1];
123 info.vendor_id = m_vendorId;
124 info.product_id = m_productId;
125 info.index = m_index;
126
127 std::strcpy(info.name, m_strName.c_str());
128 }
129
130 static void FreeStruct(PERIPHERAL_INFO& info)
131 {
132 PERIPHERAL_SAFE_DELETE_ARRAY(info.name);
133 }
134
135 private:
136 PERIPHERAL_TYPE m_type;
137 std::string m_strName;
138 uint16_t m_vendorId = 0;
139 uint16_t m_productId = 0;
140 unsigned int m_index = 0;
141 };
142
143 typedef PeripheralVector<Peripheral, PERIPHERAL_INFO> Peripherals;
144
145 /*!
146 * ADDON::PeripheralEvent
147 *
148 * Wrapper class for peripheral events.
149 */
150 class PeripheralEvent
151 {
152 public:
153 PeripheralEvent() = default;
154
155 PeripheralEvent(unsigned int peripheralIndex, unsigned int buttonIndex, JOYSTICK_STATE_BUTTON state) :
156 m_type(PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON),
157 m_peripheralIndex(peripheralIndex),
158 m_driverIndex(buttonIndex),
159 m_buttonState(state)
160 {
161 }
162
163 PeripheralEvent(unsigned int peripheralIndex, unsigned int hatIndex, JOYSTICK_STATE_HAT state) :
164 m_type(PERIPHERAL_EVENT_TYPE_DRIVER_HAT),
165 m_peripheralIndex(peripheralIndex),
166 m_driverIndex(hatIndex),
167 m_hatState(state)
168 {
169 }
170
171 PeripheralEvent(unsigned int peripheralIndex, unsigned int axisIndex, JOYSTICK_STATE_AXIS state) :
172 m_type(PERIPHERAL_EVENT_TYPE_DRIVER_AXIS),
173 m_peripheralIndex(peripheralIndex),
174 m_driverIndex(axisIndex),
175 m_axisState(state)
176 {
177 }
178
179 explicit PeripheralEvent(const PERIPHERAL_EVENT& event) :
180 m_type(event.type),
181 m_peripheralIndex(event.peripheral_index),
182 m_driverIndex(event.driver_index),
183 m_buttonState(event.driver_button_state),
184 m_hatState(event.driver_hat_state),
185 m_axisState(event.driver_axis_state),
186 m_motorState(event.motor_state)
187 {
188 }
189
190 PERIPHERAL_EVENT_TYPE Type(void) const { return m_type; }
191 unsigned int PeripheralIndex(void) const { return m_peripheralIndex; }
192 unsigned int DriverIndex(void) const { return m_driverIndex; }
193 JOYSTICK_STATE_BUTTON ButtonState(void) const { return m_buttonState; }
194 JOYSTICK_STATE_HAT HatState(void) const { return m_hatState; }
195 JOYSTICK_STATE_AXIS AxisState(void) const { return m_axisState; }
196 JOYSTICK_STATE_MOTOR MotorState(void) const { return m_motorState; }
197
198 void SetType(PERIPHERAL_EVENT_TYPE type) { m_type = type; }
199 void SetPeripheralIndex(unsigned int index) { m_peripheralIndex = index; }
200 void SetDriverIndex(unsigned int index) { m_driverIndex = index; }
201 void SetButtonState(JOYSTICK_STATE_BUTTON state) { m_buttonState = state; }
202 void SetHatState(JOYSTICK_STATE_HAT state) { m_hatState = state; }
203 void SetAxisState(JOYSTICK_STATE_AXIS state) { m_axisState = state; }
204 void SetMotorState(JOYSTICK_STATE_MOTOR state) { m_motorState = state; }
205
206 void ToStruct(PERIPHERAL_EVENT& event) const
207 {
208 event.type = m_type;
209 event.peripheral_index = m_peripheralIndex;
210 event.driver_index = m_driverIndex;
211 event.driver_button_state = m_buttonState;
212 event.driver_hat_state = m_hatState;
213 event.driver_axis_state = m_axisState;
214 event.motor_state = m_motorState;
215 }
216
217 static void FreeStruct(PERIPHERAL_EVENT& event)
218 {
219 (void)event;
220 }
221
222 private:
223 PERIPHERAL_EVENT_TYPE m_type = PERIPHERAL_EVENT_TYPE_NONE;
224 unsigned int m_peripheralIndex = 0;
225 unsigned int m_driverIndex = 0;
226 JOYSTICK_STATE_BUTTON m_buttonState = JOYSTICK_STATE_BUTTON_UNPRESSED;
227 JOYSTICK_STATE_HAT m_hatState = JOYSTICK_STATE_HAT_UNPRESSED;
228 JOYSTICK_STATE_AXIS m_axisState = 0.0f;
229 JOYSTICK_STATE_MOTOR m_motorState = 0.0f;
230 };
231
232 typedef PeripheralVector<PeripheralEvent, PERIPHERAL_EVENT> PeripheralEvents;
233
234 /*!
235 * kodi::addon::Joystick
236 *
237 * Wrapper class providing additional joystick information not provided by
238 * ADDON::Peripheral.
239 */
240 class Joystick : public Peripheral
241 {
242 public:
243 Joystick(const std::string& provider = "", const std::string& strName = "") :
244 Peripheral(PERIPHERAL_TYPE_JOYSTICK, strName),
245 m_provider(provider),
246 m_requestedPort(NO_PORT_REQUESTED)
247 {
248 }
249
250 Joystick(const Joystick& other)
251 {
252 *this = other;
253 }
254
255 explicit Joystick(const JOYSTICK_INFO& info) :
256 Peripheral(info.peripheral),
257 m_provider(info.provider ? info.provider : ""),
258 m_requestedPort(info.requested_port),
259 m_buttonCount(info.button_count),
260 m_hatCount(info.hat_count),
261 m_axisCount(info.axis_count),
262 m_motorCount(info.motor_count),
263 m_supportsPowerOff(info.supports_poweroff)
264 {
265 }
266
267 ~Joystick(void) override = default;
268
269 Joystick& operator=(const Joystick& rhs)
270 {
271 if (this != &rhs)
272 {
273 Peripheral::operator=(rhs);
274
275 m_provider = rhs.m_provider;
276 m_requestedPort = rhs.m_requestedPort;
277 m_buttonCount = rhs.m_buttonCount;
278 m_hatCount = rhs.m_hatCount;
279 m_axisCount = rhs.m_axisCount;
280 m_motorCount = rhs.m_motorCount;
281 m_supportsPowerOff = rhs.m_supportsPowerOff;
282 }
283 return *this;
284 }
285
286 const std::string& Provider(void) const { return m_provider; }
287 int RequestedPort(void) const { return m_requestedPort; }
288 unsigned int ButtonCount(void) const { return m_buttonCount; }
289 unsigned int HatCount(void) const { return m_hatCount; }
290 unsigned int AxisCount(void) const { return m_axisCount; }
291 unsigned int MotorCount(void) const { return m_motorCount; }
292 bool SupportsPowerOff(void) const { return m_supportsPowerOff; }
293
294 void SetProvider(const std::string& provider) { m_provider = provider; }
295 void SetRequestedPort(int requestedPort) { m_requestedPort = requestedPort; }
296 void SetButtonCount(unsigned int buttonCount) { m_buttonCount = buttonCount; }
297 void SetHatCount(unsigned int hatCount) { m_hatCount = hatCount; }
298 void SetAxisCount(unsigned int axisCount) { m_axisCount = axisCount; }
299 void SetMotorCount(unsigned int motorCount) { m_motorCount = motorCount; }
300 void SetSupportsPowerOff(bool supportsPowerOff) { m_supportsPowerOff = supportsPowerOff; }
301
302 void ToStruct(JOYSTICK_INFO& info) const
303 {
304 Peripheral::ToStruct(info.peripheral);
305
306 info.provider = new char[m_provider.size() + 1];
307 info.requested_port = m_requestedPort;
308 info.button_count = m_buttonCount;
309 info.hat_count = m_hatCount;
310 info.axis_count = m_axisCount;
311 info.motor_count = m_motorCount;
312 info.supports_poweroff = m_supportsPowerOff;
313
314 std::strcpy(info.provider, m_provider.c_str());
315 }
316
317 static void FreeStruct(JOYSTICK_INFO& info)
318 {
319 Peripheral::FreeStruct(info.peripheral);
320
321 PERIPHERAL_SAFE_DELETE_ARRAY(info.provider);
322 }
323
324 private:
325 std::string m_provider;
326 int m_requestedPort;
327 unsigned int m_buttonCount = 0;
328 unsigned int m_hatCount = 0;
329 unsigned int m_axisCount = 0;
330 unsigned int m_motorCount = 0;
331 bool m_supportsPowerOff = false;
332 };
333
334 typedef PeripheralVector<Joystick, JOYSTICK_INFO> Joysticks;
335
336 /*!
337 * ADDON::DriverPrimitive
338 *
339 * Base class for joystick driver primitives. A driver primitive can be:
340 *
341 * 1) a button
342 * 2) a hat direction
343 * 3) a semiaxis (either the positive or negative half of an axis)
344 * 4) a motor
345 * 5) a keyboard key
346 * 6) a mouse button
347 * 7) a relative pointer direction
348 *
349 * The type determines the fields in use:
350 *
351 * Button:
352 * - driver index
353 *
354 * Hat direction:
355 * - driver index
356 * - hat direction
357 *
358 * Semiaxis:
359 * - driver index
360 * - center
361 * - semiaxis direction
362 * - range
363 *
364 * Motor:
365 * - driver index
366 *
367 * Key:
368 * - key code
369 *
370 * Mouse button:
371 * - driver index
372 *
373 * Relative pointer direction:
374 * - relative pointer direction
375 */
376 struct DriverPrimitive
377 {
378 protected:
379 /*!
380 * \brief Construct a driver primitive of the specified type
381 */
382 DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE type, unsigned int driverIndex) :
383 m_type(type),
384 m_driverIndex(driverIndex)
385 {
386 }
387
388 public:
389 /*!
390 * \brief Construct an invalid driver primitive
391 */
392 DriverPrimitive(void) = default;
393
394 /*!
395 * \brief Construct a driver primitive representing a joystick button
396 */
397 static DriverPrimitive CreateButton(unsigned int buttonIndex)
398 {
399 return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON, buttonIndex);
400 }
401
402 /*!
403 * \brief Construct a driver primitive representing one of the four direction
404 * arrows on a dpad
405 */
406 DriverPrimitive(unsigned int hatIndex, JOYSTICK_DRIVER_HAT_DIRECTION direction) :
407 m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION),
408 m_driverIndex(hatIndex),
409 m_hatDirection(direction)
410 {
411 }
412
413 /*!
414 * \brief Construct a driver primitive representing the positive or negative
415 * half of an axis
416 */
417 DriverPrimitive(unsigned int axisIndex, int center, JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction, unsigned int range) :
418 m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS),
419 m_driverIndex(axisIndex),
420 m_center(center),
421 m_semiAxisDirection(direction),
422 m_range(range)
423 {
424 }
425
426 /*!
427 * \brief Construct a driver primitive representing a motor
428 */
429 static DriverPrimitive CreateMotor(unsigned int motorIndex)
430 {
431 return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR, motorIndex);
432 }
433
434 /*!
435 * \brief Construct a driver primitive representing a key on a keyboard
436 */
437 DriverPrimitive(std::string keycode) :
438 m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY),
439 m_keycode(std::move(keycode))
440 {
441 }
442
443 /*!
444 * \brief Construct a driver primitive representing a mouse button
445 */
446 static DriverPrimitive CreateMouseButton(JOYSTICK_DRIVER_MOUSE_INDEX buttonIndex)
447 {
448 return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON, static_cast<unsigned int>(buttonIndex));
449 }
450
451 /*!
452 * \brief Construct a driver primitive representing one of the four
453 * direction in which a relative pointer can move
454 */
455 DriverPrimitive(JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction) :
456 m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION),
457 m_relPointerDirection(direction)
458 {
459 }
460
461 explicit DriverPrimitive(const JOYSTICK_DRIVER_PRIMITIVE& primitive) :
462 m_type(primitive.type)
463 {
464 switch (m_type)
465 {
466 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON:
467 {
468 m_driverIndex = primitive.button.index;
469 break;
470 }
471 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION:
472 {
473 m_driverIndex = primitive.hat.index;
474 m_hatDirection = primitive.hat.direction;
475 break;
476 }
477 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS:
478 {
479 m_driverIndex = primitive.semiaxis.index;
480 m_center = primitive.semiaxis.center;
481 m_semiAxisDirection = primitive.semiaxis.direction;
482 m_range = primitive.semiaxis.range;
483 break;
484 }
485 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR:
486 {
487 m_driverIndex = primitive.motor.index;
488 break;
489 }
490 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY:
491 {
492 m_keycode = primitive.key.keycode;
493 break;
494 }
495 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON:
496 {
497 m_driverIndex = primitive.mouse.button;
498 break;
499 }
500 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION:
501 {
502 m_relPointerDirection = primitive.relpointer.direction;
503 break;
504 }
505 default:
506 break;
507 }
508 }
509
510 JOYSTICK_DRIVER_PRIMITIVE_TYPE Type(void) const { return m_type; }
511 unsigned int DriverIndex(void) const { return m_driverIndex; }
512 JOYSTICK_DRIVER_HAT_DIRECTION HatDirection(void) const { return m_hatDirection; }
513 int Center(void) const { return m_center; }
514 JOYSTICK_DRIVER_SEMIAXIS_DIRECTION SemiAxisDirection(void) const { return m_semiAxisDirection; }
515 unsigned int Range(void) const { return m_range; }
516 const std::string& Keycode(void) const { return m_keycode; }
517 JOYSTICK_DRIVER_MOUSE_INDEX MouseIndex(void) const { return static_cast<JOYSTICK_DRIVER_MOUSE_INDEX>(m_driverIndex); }
518 JOYSTICK_DRIVER_RELPOINTER_DIRECTION RelPointerDirection(void) const { return m_relPointerDirection; }
519
520 bool operator==(const DriverPrimitive& other) const
521 {
522 if (m_type == other.m_type)
523 {
524 switch (m_type)
525 {
526 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON:
527 {
528 return m_driverIndex == other.m_driverIndex;
529 }
530 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION:
531 {
532 return m_driverIndex == other.m_driverIndex &&
533 m_hatDirection == other.m_hatDirection;
534 }
535 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS:
536 {
537 return m_driverIndex == other.m_driverIndex &&
538 m_center == other.m_center &&
539 m_semiAxisDirection == other.m_semiAxisDirection &&
540 m_range == other.m_range;
541 }
542 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY:
543 {
544 return m_keycode == other.m_keycode;
545 }
546 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR:
547 {
548 return m_driverIndex == other.m_driverIndex;
549 }
550 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON:
551 {
552 return m_driverIndex == other.m_driverIndex;
553 }
554 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION:
555 {
556 return m_relPointerDirection == other.m_relPointerDirection;
557 }
558 default:
559 break;
560 }
561 }
562 return false;
563 }
564
565 void ToStruct(JOYSTICK_DRIVER_PRIMITIVE& driver_primitive) const
566 {
567 driver_primitive.type = m_type;
568 switch (m_type)
569 {
570 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON:
571 {
572 driver_primitive.button.index = m_driverIndex;
573 break;
574 }
575 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION:
576 {
577 driver_primitive.hat.index = m_driverIndex;
578 driver_primitive.hat.direction = m_hatDirection;
579 break;
580 }
581 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS:
582 {
583 driver_primitive.semiaxis.index = m_driverIndex;
584 driver_primitive.semiaxis.center = m_center;
585 driver_primitive.semiaxis.direction = m_semiAxisDirection;
586 driver_primitive.semiaxis.range = m_range;
587 break;
588 }
589 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR:
590 {
591 driver_primitive.motor.index = m_driverIndex;
592 break;
593 }
594 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY:
595 {
596 const size_t size = sizeof(driver_primitive.key.keycode);
597 std::strncpy(driver_primitive.key.keycode, m_keycode.c_str(), size - 1);
598 driver_primitive.key.keycode[size - 1] = '\0';
599 break;
600 }
601 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON:
602 {
603 driver_primitive.mouse.button = static_cast<JOYSTICK_DRIVER_MOUSE_INDEX>(m_driverIndex);
604 break;
605 }
606 case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION:
607 {
608 driver_primitive.relpointer.direction = m_relPointerDirection;
609 break;
610 }
611 default:
612 break;
613 }
614 }
615
616 static void FreeStruct(JOYSTICK_DRIVER_PRIMITIVE& primitive)
617 {
618 (void)primitive;
619 }
620
621 private:
622 JOYSTICK_DRIVER_PRIMITIVE_TYPE m_type = JOYSTICK_DRIVER_PRIMITIVE_TYPE_UNKNOWN;
623 unsigned int m_driverIndex = 0;
624 JOYSTICK_DRIVER_HAT_DIRECTION m_hatDirection = JOYSTICK_DRIVER_HAT_UNKNOWN;
625 int m_center = 0;
626 JOYSTICK_DRIVER_SEMIAXIS_DIRECTION m_semiAxisDirection = JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN;
627 unsigned int m_range = 1;
628 std::string m_keycode;
629 JOYSTICK_DRIVER_RELPOINTER_DIRECTION m_relPointerDirection = JOYSTICK_DRIVER_RELPOINTER_UNKNOWN;
630 };
631
632 typedef PeripheralVector<DriverPrimitive, JOYSTICK_DRIVER_PRIMITIVE> DriverPrimitives;
633
634 /*!
635 * kodi::addon::JoystickFeature
636 *
637 * Class for joystick features. A feature can be:
638 *
639 * 1) scalar[1]
640 * 2) analog stick
641 * 3) accelerometer
642 * 4) motor
643 * 5) relative pointer[2]
644 * 6) absolute pointer
645 * 7) wheel
646 * 8) throttle
647 * 9) keyboard key
648 *
649 * [1] All three driver primitives (buttons, hats and axes) have a state that
650 * can be represented using a single scalar value. For this reason,
651 * features that map to a single primitive are called "scalar features".
652 *
653 * [2] Relative pointers are similar to analog sticks, but they use
654 * relative distances instead of positions.
655 */
656 class JoystickFeature
657 {
658 public:
659 JoystickFeature(const std::string& name = "", JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN) :
660 m_name(name),
661 m_type(type),
662 m_primitives{}
663 {
664 }
665
666 JoystickFeature(const JoystickFeature& other)
667 {
668 *this = other;
669 }
670
671 explicit JoystickFeature(const JOYSTICK_FEATURE& feature) :
672 m_name(feature.name ? feature.name : ""),
673 m_type(feature.type)
674 {
675 for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++)
676 m_primitives[i] = DriverPrimitive(feature.primitives[i]);
677 }
678
679 JoystickFeature& operator=(const JoystickFeature& rhs)
680 {
681 if (this != &rhs)
682 {
683 m_name = rhs.m_name;
684 m_type = rhs.m_type;
685 m_primitives = rhs.m_primitives;
686 }
687 return *this;
688 }
689
690 bool operator==(const JoystickFeature& other) const
691 {
692 return m_name == other.m_name &&
693 m_type == other.m_type &&
694 m_primitives == other.m_primitives;
695 }
696
697 const std::string& Name(void) const { return m_name; }
698 JOYSTICK_FEATURE_TYPE Type(void) const { return m_type; }
699 bool IsValid() const { return m_type != JOYSTICK_FEATURE_TYPE_UNKNOWN; }
700
701 void SetName(const std::string& name) { m_name = name; }
702 void SetType(JOYSTICK_FEATURE_TYPE type) { m_type = type; }
703 void SetInvalid(void) { m_type = JOYSTICK_FEATURE_TYPE_UNKNOWN; }
704
705 const DriverPrimitive& Primitive(JOYSTICK_FEATURE_PRIMITIVE which) const { return m_primitives[which]; }
706 void SetPrimitive(JOYSTICK_FEATURE_PRIMITIVE which, const DriverPrimitive& primitive) { m_primitives[which] = primitive; }
707
708 std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX>& Primitives() { return m_primitives; }
709 const std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX>& Primitives() const { return m_primitives; }
710
711 void ToStruct(JOYSTICK_FEATURE& feature) const
712 {
713 feature.name = new char[m_name.length() + 1];
714 feature.type = m_type;
715 for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++)
716 m_primitives[i].ToStruct(feature.primitives[i]);
717
718 std::strcpy(feature.name, m_name.c_str());
719 }
720
721 static void FreeStruct(JOYSTICK_FEATURE& feature)
722 {
723 PERIPHERAL_SAFE_DELETE_ARRAY(feature.name);
724 }
725
726 private:
727 std::string m_name;
728 JOYSTICK_FEATURE_TYPE m_type;
729 std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX> m_primitives;
730 };
731
732 typedef PeripheralVector<JoystickFeature, JOYSTICK_FEATURE> JoystickFeatures;
733
734} /* namespace addon */
735} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Screensaver.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Screensaver.h
deleted file mode 100644
index f8a7380..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Screensaver.h
+++ /dev/null
@@ -1,460 +0,0 @@
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 "../AddonBase.h"
12#include "../gui/renderHelper.h"
13
14namespace kodi { namespace addon { class CInstanceScreensaver; }}
15
16extern "C"
17{
18
19struct AddonInstance_Screensaver;
20
21/*!
22 * @brief Screensaver properties
23 *
24 * Not to be used outside this header.
25 */
26typedef struct AddonProps_Screensaver
27{
28 void *device;
29 int x;
30 int y;
31 int width;
32 int height;
33 float pixelRatio;
34 const char *name;
35 const char *presets;
36 const char *profile;
37} AddonProps_Screensaver;
38
39/*!
40 * @brief Screensaver callbacks
41 *
42 * Not to be used outside this header.
43 */
44typedef struct AddonToKodiFuncTable_Screensaver
45{
46 KODI_HANDLE kodiInstance;
47} AddonToKodiFuncTable_Screensaver;
48
49/*!
50 * @brief Screensaver function hooks
51 *
52 * Not to be used outside this header.
53 */
54typedef struct KodiToAddonFuncTable_Screensaver
55{
56 kodi::addon::CInstanceScreensaver* addonInstance;
57 bool (__cdecl* Start) (AddonInstance_Screensaver* instance);
58 void (__cdecl* Stop) (AddonInstance_Screensaver* instance);
59 void (__cdecl* Render) (AddonInstance_Screensaver* instance);
60} KodiToAddonFuncTable_Screensaver;
61
62/*!
63 * @brief Screensaver instance
64 *
65 * Not to be used outside this header.
66 */
67typedef struct AddonInstance_Screensaver
68{
69 AddonProps_Screensaver props;
70 AddonToKodiFuncTable_Screensaver toKodi;
71 KodiToAddonFuncTable_Screensaver toAddon;
72} AddonInstance_Screensaver;
73
74} /* extern "C" */
75
76namespace kodi
77{
78namespace addon
79{
80
81 //============================================================================
82 ///
83 /// \addtogroup cpp_kodi_addon_screensaver
84 /// @brief \cpp_class{ kodi::addon::CInstanceScreensaver }
85 /// **Screensaver add-on instance**
86 ///
87 /// A screensaver is a Kodi addon that fills the screen with moving images or
88 /// patterns when the computer is not in use. Initially designed to prevent
89 /// phosphor burn-in on CRT and plasma computer monitors (hence the name),
90 /// screensavers are now used primarily for entertainment, security or to
91 /// display system status information.
92 ///
93 /// Include the header \ref ScreenSaver.h "#include <kodi/addon-instance/ScreenSaver.h>"
94 /// to use this class.
95 ///
96 /// This interface allows the creating of screensavers for Kodi, based upon
97 /// **DirectX** or/and **OpenGL** rendering with `C++` code.
98 ///
99 /// The interface is small and easy usable. It has three functions:
100 ///
101 /// * <b><c>Start()</c></b> - Called on creation
102 /// * <b><c>Render()</c></b> - Called at render time
103 /// * <b><c>Stop()</c></b> - Called when the screensaver has no work
104 ///
105 /// Additionally, there are several \ref cpp_kodi_addon_screensaver_CB "other functions"
106 /// available in which the child class can ask about the current hardware,
107 /// including the device, display and several other parts.
108 ///
109 ///
110 /// --------------------------------------------------------------------------
111 ///
112 ///
113 /// **Here is an example of the minimum required code to start a screensaver:**
114 /// ~~~~~~~~~~~~~{.cpp}
115 /// #include <kodi/addon-instance/Screensaver.h>
116 ///
117 /// class CMyScreenSaver : public kodi::addon::CAddonBase,
118 /// public kodi::addon::CInstanceScreensaver
119 /// {
120 /// public:
121 /// CMyScreenSaver();
122 ///
123 /// bool Start() override;
124 /// void Render() override;
125 /// };
126 ///
127 /// CMyScreenSaver::CMyScreenSaver()
128 /// {
129 /// ...
130 /// }
131 ///
132 /// bool CMyScreenSaver::Start()
133 /// {
134 /// ...
135 /// return true;
136 /// }
137 ///
138 /// void CMyScreenSaver::Render()
139 /// {
140 /// ...
141 /// }
142 ///
143 /// ADDONCREATOR(CMyScreenSaver)
144 /// ~~~~~~~~~~~~~
145 ///
146 ///
147 /// --------------------------------------------------------------------------
148 ///
149 ///
150 /// **Here is another example where the screensaver is used together with
151 /// other instance types:**
152 ///
153 /// ~~~~~~~~~~~~~{.cpp}
154 /// #include <kodi/addon-instance/Screensaver.h>
155 ///
156 /// class CMyScreenSaver : public ::kodi::addon::CInstanceScreensaver
157 /// {
158 /// public:
159 /// CMyScreenSaver(KODI_HANDLE instance);
160 ///
161 /// bool Start() override;
162 /// void Render() override;
163 /// };
164 ///
165 /// CMyScreenSaver::CMyScreenSaver(KODI_HANDLE instance)
166 /// : CInstanceScreensaver(instance)
167 /// {
168 /// ...
169 /// }
170 ///
171 /// bool CMyScreenSaver::Start()
172 /// {
173 /// ...
174 /// return true;
175 /// }
176 ///
177 /// void CMyScreenSaver::Render()
178 /// {
179 /// ...
180 /// }
181 ///
182 ///
183 /// /*----------------------------------------------------------------------*/
184 ///
185 /// class CMyAddon : public ::kodi::addon::CAddonBase
186 /// {
187 /// public:
188 /// CMyAddon() { }
189 /// ADDON_STATUS CreateInstance(int instanceType,
190 /// std::string instanceID,
191 /// KODI_HANDLE instance,
192 /// KODI_HANDLE& addonInstance) override;
193 /// };
194 ///
195 /// /* If you use only one instance in your add-on, can be instanceType and
196 /// * instanceID ignored */
197 /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
198 /// std::string instanceID,
199 /// KODI_HANDLE instance,
200 /// KODI_HANDLE& addonInstance)
201 /// {
202 /// if (instanceType == ADDON_INSTANCE_SCREENSAVER)
203 /// {
204 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my Screensaver");
205 /// addonInstance = new CMyScreenSaver(instance);
206 /// return ADDON_STATUS_OK;
207 /// }
208 /// else if (...)
209 /// {
210 /// ...
211 /// }
212 /// return ADDON_STATUS_UNKNOWN;
213 /// }
214 ///
215 /// ADDONCREATOR(CMyAddon)
216 /// ~~~~~~~~~~~~~
217 ///
218 /// The destruction of the example class `CMyScreenSaver` is called from
219 /// Kodi's header. Manually deleting the add-on instance is not required.
220 ///
221 //----------------------------------------------------------------------------
222 class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance
223 {
224 public:
225 //==========================================================================
226 ///
227 /// @ingroup cpp_kodi_addon_screensaver
228 /// @brief Screensaver class constructor
229 ///
230 /// Used by an add-on that only supports screensavers.
231 ///
232 CInstanceScreensaver()
233 : IAddonInstance(ADDON_INSTANCE_SCREENSAVER, GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER))
234 {
235 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
236 throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of more as one in single instance way is not allowed!");
237
238 SetAddonStruct(CAddonBase::m_interface->firstKodiInstance);
239 CAddonBase::m_interface->globalSingleInstance = this;
240 }
241 //--------------------------------------------------------------------------
242
243 //==========================================================================
244 ///
245 /// @ingroup cpp_kodi_addon_screensaver
246 /// @brief Screensaver class constructor used to support multiple instance
247 /// types
248 ///
249 /// @param[in] instance The instance value given to
250 /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>.
251 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
252 /// allow compatibility to older Kodi versions.
253 /// @note Recommended to set.
254 ///
255 /// @warning Only use `instance` from the CreateInstance call
256 ///
257 explicit CInstanceScreensaver(KODI_HANDLE instance, const std::string& kodiVersion = "")
258 : IAddonInstance(ADDON_INSTANCE_SCREENSAVER,
259 !kodiVersion.empty() ? kodiVersion
260 : GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER))
261 {
262 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
263 throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of multiple together with single instance way is not allowed!");
264
265 SetAddonStruct(instance);
266 }
267 //--------------------------------------------------------------------------
268
269 //==========================================================================
270 ///
271 /// @ingroup cpp_kodi_addon_screensaver
272 /// @brief Destructor
273 ///
274 ~CInstanceScreensaver() override = default;
275 //--------------------------------------------------------------------------
276
277 //==========================================================================
278 ///
279 /// @ingroup cpp_kodi_addon_screensaver
280 /// @brief Used to notify the screensaver that it has been started
281 ///
282 /// @return true if the screensaver was started
283 /// successfully, false otherwise
284 ///
285 virtual bool Start() { return true; }
286 //--------------------------------------------------------------------------
287
288 //==========================================================================
289 ///
290 /// @ingroup cpp_kodi_addon_screensaver
291 /// @brief Used to inform the screensaver that the rendering control was
292 /// stopped
293 ///
294 virtual void Stop() {}
295 //--------------------------------------------------------------------------
296
297 //==========================================================================
298 ///
299 /// @ingroup cpp_kodi_addon_screensaver
300 /// @brief Used to indicate when the add-on should render
301 ///
302 virtual void Render() {}
303 //--------------------------------------------------------------------------
304
305 //==========================================================================
306 ///
307 /// \defgroup cpp_kodi_addon_screensaver_CB Information functions
308 /// \ingroup cpp_kodi_addon_screensaver
309 /// @brief **To get info about the device, display and several other parts**
310 ///
311 //@{
312
313 //==========================================================================
314 ///
315 /// @ingroup cpp_kodi_addon_screensaver_CB
316 /// @brief Device that represents the display adapter
317 ///
318 /// @return A pointer to the device
319 ///
320 /// @note This is only available on **DirectX**, It us unused (`nullptr`) on
321 /// **OpenGL**
322 ///
323 inline void* Device() { return m_instanceData->props.device; }
324 //--------------------------------------------------------------------------
325
326 //==========================================================================
327 ///
328 /// @ingroup cpp_kodi_addon_screensaver_CB
329 /// @brief Returns the X position of the rendering window
330 ///
331 /// @return The X position, in pixels
332 ///
333 inline int X() { return m_instanceData->props.x; }
334 //--------------------------------------------------------------------------
335
336 //==========================================================================
337 ///
338 /// @ingroup cpp_kodi_addon_screensaver_CB
339 /// @brief Returns the Y position of the rendering window
340 ///
341 /// @return The Y position, in pixels
342 ///
343 inline int Y() { return m_instanceData->props.y; }
344 //--------------------------------------------------------------------------
345
346 //==========================================================================
347 ///
348 /// @ingroup cpp_kodi_addon_screensaver_CB
349 /// @brief Returns the width of the rendering window
350 ///
351 /// @return The width, in pixels
352 ///
353 inline int Width() { return m_instanceData->props.width; }
354 //--------------------------------------------------------------------------
355
356 //==========================================================================
357 ///
358 /// @ingroup cpp_kodi_addon_screensaver_CB
359 /// @brief Returns the height of the rendering window
360 ///
361 /// @return The height, in pixels
362 ///
363 inline int Height() { return m_instanceData->props.height; }
364 //--------------------------------------------------------------------------
365
366 //==========================================================================
367 ///
368 /// @ingroup cpp_kodi_addon_screensaver_CB
369 /// @brief Pixel aspect ratio (often abbreviated PAR) is a ratio that
370 /// describes how the width of a pixel compares to the height of that pixel.
371 ///
372 /// @return The pixel aspect ratio used by the display
373 ///
374 inline float PixelRatio() { return m_instanceData->props.pixelRatio; }
375 //--------------------------------------------------------------------------
376
377 //==========================================================================
378 ///
379 /// @ingroup cpp_kodi_addon_screensaver_CB
380 /// @brief Used to get the name of the add-on defined in `addon.xml`
381 ///
382 /// @return The add-on name
383 ///
384 inline std::string Name() { return m_instanceData->props.name; }
385 //--------------------------------------------------------------------------
386
387 //==========================================================================
388 ///
389 /// @ingroup cpp_kodi_addon_screensaver_CB
390 /// @brief Used to get the full path where the add-on is installed
391 ///
392 /// @return The add-on installation path
393 ///
394 inline std::string Presets() { return m_instanceData->props.presets; }
395 //--------------------------------------------------------------------------
396
397 //==========================================================================
398 ///
399 /// @ingroup cpp_kodi_addon_screensaver_CB
400 /// @brief Used to get the full path to the add-on's user profile
401 ///
402 /// @note The trailing folder (consisting of the add-on's ID) is not created
403 /// by default. If it is needed, you must call kodi::vfs::CreateDirectory()
404 /// to create the folder.
405 ///
406 /// @return Path to the user profile
407 ///
408 inline std::string Profile() { return m_instanceData->props.profile; }
409 //--------------------------------------------------------------------------
410 //@}
411
412 private:
413 void SetAddonStruct(KODI_HANDLE instance)
414 {
415 if (instance == nullptr)
416 throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation with empty addon structure not allowed, table must be given from Kodi!");
417
418 m_instanceData = static_cast<AddonInstance_Screensaver*>(instance);
419 m_instanceData->toAddon.addonInstance = this;
420 m_instanceData->toAddon.Start = ADDON_Start;
421 m_instanceData->toAddon.Stop = ADDON_Stop;
422 m_instanceData->toAddon.Render = ADDON_Render;
423 }
424
425 inline static bool ADDON_Start(AddonInstance_Screensaver* instance)
426 {
427 instance->toAddon.addonInstance->m_renderHelper = kodi::gui::GetRenderHelper();
428 return instance->toAddon.addonInstance->Start();
429 }
430
431 inline static void ADDON_Stop(AddonInstance_Screensaver* instance)
432 {
433 instance->toAddon.addonInstance->Stop();
434 instance->toAddon.addonInstance->m_renderHelper = nullptr;
435 }
436
437 inline static void ADDON_Render(AddonInstance_Screensaver* instance)
438 {
439 if (!instance->toAddon.addonInstance->m_renderHelper)
440 return;
441 instance->toAddon.addonInstance->m_renderHelper->Begin();
442 instance->toAddon.addonInstance->Render();
443 instance->toAddon.addonInstance->m_renderHelper->End();
444 }
445
446 /*
447 * Background render helper holds here and in addon base.
448 * In addon base also to have for the others, and stored here for the worst
449 * case where this class is independent from base and base becomes closed
450 * before.
451 *
452 * This is on Kodi with GL unused and the calls to there are empty (no work)
453 * On Kodi with Direct X where angle is present becomes this used.
454 */
455 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
456 AddonInstance_Screensaver* m_instanceData;
457 };
458
459} /* namespace addon */
460} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VFS.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VFS.h
deleted file mode 100644
index efd5de2..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VFS.h
+++ /dev/null
@@ -1,1265 +0,0 @@
1/*
2 * Copyright (C) 2015-2018 Team Kodi
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 * See LICENSES/README.md for more information.
6 */
7
8#pragma once
9
10#include "../AddonBase.h"
11#include "../Filesystem.h"
12
13#if !defined(_WIN32)
14#include <sys/stat.h>
15#if !defined(__stat64)
16#if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD)
17#define __stat64 stat
18#else
19#define __stat64 stat64
20#endif
21#endif
22#endif
23
24#ifdef __cplusplus
25extern "C"
26{
27#endif /* __cplusplus */
28
29 //============================================================================
30 /// @ingroup cpp_kodi_addon_vfs_Defs
31 /// @brief **VFS add-on URL data**\n
32 /// This class is used to inform the addon of the desired wanted connection.
33 ///
34 /// Used on mostly all addon functions to identify related target.
35 ///
36 struct VFSURL
37 {
38 /// @brief Desired URL of the file system to be edited
39 ///
40 /// This includes all available parts of the access and is structured as
41 /// follows:
42 /// - <b>`<PROTOCOL>`://`<USERNAME>`:`<PASSWORD>``@``<HOSTNAME>`:`<PORT>`/`<FILENAME>`?`<OPTIONS>`</b>
43 const char* url;
44
45 /// @brief The associated domain name, which is optional and not available
46 /// in all cases.
47 const char* domain;
48
49 /// @brief This includes the network address (e.g. `192.168.0.123`) or if
50 /// the addon refers to file packages the path to it
51 /// (e.g. `/home/by_me/MyPacket.rar`).
52 const char* hostname;
53
54 /// @brief With this variable the desired path to a folder or file within
55 /// the hostname is given (e.g. `storage/videos/00001.ts`).
56 const char* filename;
57
58 /// @brief [Networking port](https://en.wikipedia.org/wiki/Port_(computer_networking))
59 /// to use for protocol.
60 unsigned int port;
61
62 /// @brief Special options on opened URL, this can e.g. on RAR packages
63 /// <b>`?flags=8&nextvalue=123`</b> to inform about to not cache a read.
64 ///
65 /// Available options from Kodi:
66 /// | Value: | Description:
67 /// |-----------|-------------------
68 /// | flags=8 | Used on RAR packages so that no data is cached from the requested source.
69 /// | cache=no | Used on ZIP packages so that no data from the requested source is stored in the cache. However, this is currently not available from addons!
70 ///
71 /// In addition, other addons can use the URLs given by them to give options
72 /// that fit the respective VFS addon and allow special operations.
73 ///
74 /// @note This procedure is not yet standardized and is currently not
75 /// exactly available which are handed over.
76 const char* options;
77
78 /// @brief Desired username.
79 const char* username;
80
81 /// @brief Desired password.
82 const char* password;
83
84 /// @brief The complete URL is passed on here, but the user name and
85 /// password are not shown and only appear to there as `USERNAME:PASSWORD`.
86 ///
87 /// As example <b>`sftp://USERNAME:PASSWORD@192.168.178.123/storage/videos/00001.ts`</b>.
88 const char* redacted;
89
90 /// @brief The name which is taken as the basis by source and would be first
91 /// in folder view.
92 ///
93 /// As example on <b>`sftp://dudu:isprivate@192.168.178.123/storage/videos/00001.ts`</b>
94 /// becomes then <b>`storage`</b> used here.
95 const char* sharename;
96
97 /// @brief Protocol name used on this stream, e.g. <b>`sftp`</b>.
98 const char* protocol;
99 };
100 //----------------------------------------------------------------------------
101
102 //============================================================================
103 /// @ingroup cpp_kodi_addon_vfs_Defs
104 /// @brief <b>In/out value which is queried at @ref kodi::addon::CInstanceVFS::IoControl.</b>\n
105 /// This declares the requested value on the addon, this gets or has to
106 /// transfer data depending on the value.
107 enum VFS_IOCTRL
108 {
109 /// @brief For cases where not supported control becomes asked.
110 ///
111 /// @note Should normally not given to addon.
112 VFS_IOCTRL_INVALID = 0,
113
114 /// @brief @ref VFS_IOCTRL_NATIVE_DATA structure, containing what should be
115 /// passed to native ioctrl.
116 VFS_IOCTRL_NATIVE = 1,
117
118 /// @brief To check seek is possible.
119 ///
120 //// Return 0 if known not to work, 1 if it should work on related calls.
121 VFS_IOCTRL_SEEK_POSSIBLE = 2,
122
123 /// @brief @ref VFS_IOCTRL_CACHE_STATUS_DATA structure structure on related call
124 VFS_IOCTRL_CACHE_STATUS = 3,
125
126 /// @brief Unsigned int with speed limit for caching in bytes per second
127 VFS_IOCTRL_CACHE_SETRATE = 4,
128
129 /// @brief Enable/disable retry within the protocol handler (if supported)
130 VFS_IOCTRL_SET_RETRY = 16,
131 };
132 //----------------------------------------------------------------------------
133
134 //============================================================================
135 /// @ingroup cpp_kodi_addon_vfs_Defs
136 /// @brief <b>Structure used in @ref kodi::addon::CInstanceVFS::IoControl
137 /// if question value for @ref VFS_IOCTRL_NATIVE is set</b>\n
138 /// With this structure, data is transmitted to the Kodi addon.
139 ///
140 /// This corresponds to POSIX systems with regard to [ioctl](https://en.wikipedia.org/wiki/Ioctl)
141 /// data (emulated with Windows).
142 struct VFS_IOCTRL_NATIVE_DATA
143 {
144 unsigned long int request;
145 void* param;
146 };
147 //----------------------------------------------------------------------------
148
149 //============================================================================
150 /// @ingroup cpp_kodi_addon_vfs_Defs
151 /// @brief <b>Structure used in @ref kodi::addon::CInstanceVFS::IoControl
152 /// if question value for @ref VFS_IOCTRL_CACHE_STATUS is set</b>\n
153 /// This data is filled by the addon and returned to Kodi
154 struct VFS_IOCTRL_CACHE_STATUS_DATA
155 {
156 /// @brief Number of bytes cached forward of current position.
157 uint64_t forward;
158
159 /// @brief Maximum number of bytes per second cache is allowed to fill.
160 unsigned int maxrate;
161
162 /// @brief Average read rate from source file since last position change.
163 unsigned int currate;
164
165 /// @brief Cache low speed condition detected?
166 bool lowspeed;
167 };
168 //----------------------------------------------------------------------------
169
170 typedef struct VFSGetDirectoryCallbacks /* internal */
171 {
172 bool (__cdecl* get_keyboard_input)(void* ctx, const char* heading, char** input, bool hidden_input);
173 void (__cdecl* set_error_dialog)(void* ctx, const char* heading, const char* line1, const char* line2, const char* line3);
174 void (__cdecl* require_authentication)(void* ctx, const char* url);
175 void* ctx;
176 } VFSGetDirectoryCallbacks;
177
178 typedef struct AddonProps_VFSEntry /* internal */
179 {
180 int dummy;
181 } AddonProps_VFSEntry;
182
183 typedef struct AddonToKodiFuncTable_VFSEntry /* internal */
184 {
185 KODI_HANDLE kodiInstance;
186 } AddonToKodiFuncTable_VFSEntry;
187
188 struct AddonInstance_VFSEntry;
189 typedef struct KodiToAddonFuncTable_VFSEntry /* internal */
190 {
191 KODI_HANDLE addonInstance;
192
193 void*(__cdecl* open)(const struct AddonInstance_VFSEntry* instance, const struct VFSURL* url);
194 void*(__cdecl* open_for_write)(const struct AddonInstance_VFSEntry* instance,
195 const struct VFSURL* url,
196 bool overwrite);
197 ssize_t(__cdecl* read)(const struct AddonInstance_VFSEntry* instance,
198 void* context,
199 void* buffer,
200 size_t buf_size);
201 ssize_t(__cdecl* write)(const struct AddonInstance_VFSEntry* instance,
202 void* context,
203 const void* buffer,
204 size_t buf_size);
205 int64_t(__cdecl* seek)(const struct AddonInstance_VFSEntry* instance,
206 void* context,
207 int64_t position,
208 int whence);
209 int(__cdecl* truncate)(const struct AddonInstance_VFSEntry* instance,
210 void* context,
211 int64_t size);
212 int64_t(__cdecl* get_length)(const struct AddonInstance_VFSEntry* instance, void* context);
213 int64_t(__cdecl* get_position)(const struct AddonInstance_VFSEntry* instance, void* context);
214 int(__cdecl* get_chunk_size)(const struct AddonInstance_VFSEntry* instance, void* context);
215 int(__cdecl* io_control)(const struct AddonInstance_VFSEntry* instance,
216 void* context,
217 enum VFS_IOCTRL request,
218 void* param);
219 int(__cdecl* stat)(const struct AddonInstance_VFSEntry* instance,
220 const struct VFSURL* url,
221 struct __stat64* buffer);
222 bool(__cdecl* close)(const struct AddonInstance_VFSEntry* instance, void* context);
223 bool(__cdecl* exists)(const struct AddonInstance_VFSEntry* instance, const struct VFSURL* url);
224 void(__cdecl* clear_out_idle)(const struct AddonInstance_VFSEntry* instance);
225 void(__cdecl* disconnect_all)(const struct AddonInstance_VFSEntry* instance);
226 bool(__cdecl* delete_it)(const struct AddonInstance_VFSEntry* instance,
227 const struct VFSURL* url);
228 bool(__cdecl* rename)(const struct AddonInstance_VFSEntry* instance,
229 const struct VFSURL* url,
230 const struct VFSURL* url2);
231 bool(__cdecl* directory_exists)(const struct AddonInstance_VFSEntry* instance,
232 const struct VFSURL* url);
233 bool(__cdecl* remove_directory)(const struct AddonInstance_VFSEntry* instance,
234 const struct VFSURL* url);
235 bool(__cdecl* create_directory)(const struct AddonInstance_VFSEntry* instance,
236 const struct VFSURL* url);
237 bool(__cdecl* get_directory)(const struct AddonInstance_VFSEntry* instance,
238 const struct VFSURL* url,
239 struct VFSDirEntry** entries,
240 int* num_entries,
241 VFSGetDirectoryCallbacks* callbacks);
242 bool(__cdecl* contains_files)(const struct AddonInstance_VFSEntry* instance,
243 const struct VFSURL* url,
244 struct VFSDirEntry** entries,
245 int* num_entries,
246 char* rootpath);
247 void(__cdecl* free_directory)(const struct AddonInstance_VFSEntry* instance,
248 struct VFSDirEntry* entries,
249 int num_entries);
250 } KodiToAddonFuncTable_VFSEntry;
251
252 typedef struct AddonInstance_VFSEntry /* internal */
253 {
254 AddonProps_VFSEntry* props;
255 AddonToKodiFuncTable_VFSEntry* toKodi;
256 KodiToAddonFuncTable_VFSEntry* toAddon;
257 } AddonInstance_VFSEntry;
258
259#ifdef __cplusplus
260} /* extern "C" */
261
262namespace kodi
263{
264namespace addon
265{
266
267//##############################################################################
268/// @defgroup cpp_kodi_addon_vfs_Defs Definitions, structures and enumerators
269/// \ingroup cpp_kodi_addon_vfs
270/// @brief **VFS add-on general variables**
271///
272/// Used to exchange the available options between Kodi and addon.
273///
274///
275
276//==============================================================================
277///
278/// \addtogroup cpp_kodi_addon_vfs
279/// @brief \cpp_class{ kodi::addon::CInstanceVFS }
280/// **Virtual Filesystem (VFS) add-on instance**
281///
282/// This instance type is used to allow Kodi various additional file system
283/// types. Be it a special file system, a compressed package or a system
284/// available over the network, everything is possible with it.
285///
286/// This usage can be requested under various conditions, for example explicitly
287/// by another addon, by a Mimetype protocol defined in <b>`addon.xml`</b> or supported
288/// file extensions.
289///
290/// Include the header @ref VFS.h "#include <kodi/addon-instance/VFS.h>"
291/// to use this class.
292///
293/// ----------------------------------------------------------------------------
294///
295/// Here is an example of what the <b>`addon.xml.in`</b> would look like for an VFS addon:
296///
297/// ~~~~~~~~~~~~~{.xml}
298/// <?xml version="1.0" encoding="UTF-8"?>
299/// <addon
300/// id="vfs.myspecialnamefor"
301/// version="1.0.0"
302/// name="My VFS addon"
303/// provider-name="Your Name">
304/// <requires>@ADDON_DEPENDS@</requires>
305/// <extension
306/// point="kodi.vfs"
307/// protocols="myprot"
308/// extensions=".abc|.def"
309/// files="true"
310/// filedirectories="true"
311/// directories="true"
312/// encodedhostname="true"
313/// supportDialog="true"
314/// supportPath="true"
315/// supportUsername="true"
316/// supportPassword="true"
317/// supportPort="true"
318/// supportBrowsing="true"
319/// supportWrite="true"
320/// defaultPort="1234"
321/// label="30000"
322/// zeroconf="your_special_zeroconf_allowed_identifier"
323/// library_@PLATFORM@="@LIBRARY_FILENAME@"/>
324/// <extension point="xbmc.addon.metadata">
325/// <summary lang="en_GB">My VFS addon summary</summary>
326/// <description lang="en_GB">My VFS description</description>
327/// <platform>@PLATFORM@</platform>
328/// </extension>
329/// </addon>
330/// ~~~~~~~~~~~~~
331///
332/// @note Regarding boolean values with "false", these can also be omitted,
333/// since this would be the default.
334///
335///
336/// ### Standard values that can be declared for processing in `addon.xml`.
337///
338/// These values are used by Kodi to identify associated streams and file
339/// extensions and then to select the associated addon.
340///
341/// \table_start
342/// \table_h3{ Labels, Type, Description }
343/// \table_row3{ <b>`point`</b>,
344/// \anchor cpp_kodi_addon_vfs_point
345/// string,
346/// The identification of the addon instance to VFS is mandatory <b>`kodi.vfs`</b>.
347/// In addition\, the instance declared in the first <b>`<extension ... />`</b> is also the main type of addon.
348/// }
349/// \table_row3{ <b>`defaultPort`</b>,
350/// \anchor cpp_kodi_addon_vfs_defaultPort
351/// integer,
352/// Default [networking port](https://en.wikipedia.org/wiki/Port_(computer_networking))
353/// to use for protocol.
354/// }
355/// \table_row3{ <b>`directories`</b>,
356/// \anchor cpp_kodi_addon_vfs_directories
357/// boolean,
358/// VFS entry can list directories.
359/// }
360/// \table_row3{ <b>`extensions`</b>,
361/// \anchor cpp_kodi_addon_vfs_extensions
362/// string,
363/// Extensions for VFS entry.\n
364/// It is possible to declare several using <b>`|`</b>\, e.g. <b>`.abc|.def|.ghi`</b>.
365/// }
366/// \table_row3{ <b>`encodedhostname`</b>,
367/// \anchor cpp_kodi_addon_vfs_encodedhostname
368/// boolean,
369/// URL protocol from add-ons use encoded hostnames.
370/// }
371/// \table_row3{ <b>`filedirectories`</b>,
372/// \anchor cpp_kodi_addon_vfs_filedirectories
373/// boolean,
374/// VFS entry contains file directories.
375/// }
376/// \table_row3{ <b>`files`</b>,
377/// \anchor cpp_kodi_addon_vfs_directories
378/// boolean,
379/// Set to declare that VFS provides files.
380/// }
381/// \table_row3{ <b>`protocols`</b>,
382/// \anchor cpp_kodi_addon_vfs_protocols
383/// boolean,
384/// Protocols for VFS entry.\n
385/// It is possible to declare several using <b>`|`</b>\, e.g. <b>`myprot1|myprot2`</b>.\n
386/// @note This field also used to show on GUI\, see <b>`supportBrowsing`</b> below about <b>*2:</b>.
387/// When used there\, however\, only a **single** protocol is possible!
388/// }
389/// \table_row3{ <b>`supportWrite`</b>,
390/// \anchor cpp_kodi_addon_vfs_supportWrite
391/// boolean,
392/// Protocol supports write operations.
393/// }
394/// \table_row3{ <b>`zeroconf`</b>,
395/// \anchor cpp_kodi_addon_vfs_zeroconf
396/// string,
397/// [Zero conf](https://en.wikipedia.org/wiki/Zero-configuration_networking) announce string for VFS protocol.
398/// }
399/// \table_row3{ <b>`library_@PLATFORM@`</b>,
400/// \anchor cpp_kodi_addon_vfs_library
401/// string,
402/// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated <b>`addon.xml`</b>.
403/// }
404/// \table_end
405///
406///
407/// ### User selectable parts of the addon.
408///
409/// The following table describes the values that can be defined by <b>`addon.xml`</b>
410/// and which part they relate to for user input.
411///
412/// \table_start
413/// \table_h3{ Labels, Type, Description }
414/// \table_row3{ <b>`supportBrowsing`</b>,
415/// \anchor cpp_kodi_addon_vfs_protocol_supportBrowsing
416/// boolean,
417/// Protocol supports server browsing. Used to open related sources by users in the window.\n\n
418/// | Associated places in Kodi: |
419/// | :---- |
420/// | \image html cpp_kodi_addon_vfs_protocol_1.png |
421/// <br>
422/// <b>*1:</b> The entry in the menu represented by this option corresponds to the text given with <b>`label`</b>.
423/// When the button is pressed\, @ref CInstanceVFS::GetDirectory is called on the add-on to get its content.\n
424/// <b>*2:</b> Protocol name of the stream defined with <b>`protocols`</b> in xml.\n
425/// @remark See also <b>`supportDialog`</b> about <b>*3:</b>.
426/// }
427/// \table_row3{ <b>`supportDialog`</b>,
428/// \anchor cpp_kodi_addon_vfs_protocol_supportDialog
429/// boolean,
430/// To point out that Kodi assigns a dialog to this VFS in order to compare it with other values e.g. query supportPassword in it.\n
431/// This will be available when adding sources in Kodi under <b>"Add network location..."</b>.\n\n
432/// | Associated places in Kodi: |
433/// | :---- |
434/// | \image html cpp_kodi_addon_vfs_protocol_2.png |
435/// <br>
436/// <b>*1:</b> Field for selecting the VFS handler\, the addon will be available if <b>`supportDialog`</b> is set to <b>`true`</b>.\n
437/// <b>*2:</b> To set the associated server address. **Note:** *This field is always activated and cannot be changed by the addon.*\n
438/// <b>*3:</b> If <b>`supportBrowsing`</b> is set to <b>`true`</b>\, the button for opening a file selection dialog is given here too\, as in the file window.\n
439/// <b>*4:</b> This field is available if <b>`supportPath`</b> is set to <b>`true`</b>.\n
440/// <b>*5:</b> To edit the connection port. This field is available if <b>`supportPort`</b> is set to <b>`true`</b>.\n
441/// <b>*6:</b> This sets the required username and is available when <b>`supportUsername`</b> is set to <b>`true`</b>.\n
442/// <b>*7:</b> This sets the required password and is available when <b>`supportPassword`</b> is set to <b>`true`</b>.
443/// }
444/// \table_row3{ <b>`supportPath`</b>,
445/// \anchor cpp_kodi_addon_vfs_protocol_supportPath
446/// boolean,
447/// Protocol has path in addition to server name (see <b>`supportDialog`</b> about <b>*4:</b>).
448/// }
449/// \table_row3{ <b>`supportPort`</b>,
450/// \anchor cpp_kodi_addon_vfs_protocol_supportPort
451/// boolean,
452/// Protocol supports port customization (see <b>`supportDialog`</b> about <b>*5:</b>).
453/// }
454/// \table_row3{ <b>`supportUsername`</b>,
455/// \anchor cpp_kodi_addon_vfs_protocol_supportUsername
456/// boolean,
457/// Protocol uses logins (see <b>`supportDialog`</b> about <b>*6:</b>).
458/// }
459/// \table_row3{ <b>`supportPassword`</b>,
460/// \anchor cpp_kodi_addon_vfs_protocol_supportPassword
461/// boolean,
462/// Protocol supports passwords (see <b>`supportDialog`</b> about <b>*7:</b>).
463/// }
464/// \table_row3{ <b>`protocols`</b>,
465/// \anchor cpp_kodi_addon_vfs_protocol_protocols
466/// string,
467/// Protocols for VFS entry.
468/// @note This field is not editable and only used on GUI to show his name\, see <b>`supportBrowsing`</b> about <b>*2:</b>
469/// }
470/// \table_row3{ <b>`label`</b>,
471/// \anchor cpp_kodi_addon_vfs_protocol_label
472/// integer,
473/// The text identification number used in Kodi for display in the menu at <b>`supportDialog`</b>
474/// as a selection option and at <b>`supportBrowsing`</b> (see his image reference <b>*1</b>) as a menu entry.\n
475/// This can be a text identifier in Kodi or from addon.\n
476/// @remark For addon within <b>30000</b>-<b>30999</b> or <b>32000</b>-<b>32999</b>.
477/// }
478/// \table_end
479///
480/// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml.
481///
482///
483/// --------------------------------------------------------------------------
484///
485///
486/// **Example:**
487///
488/// ~~~~~~~~~~~~~{.cpp}
489/// #include <kodi/addon-instance/VFS.h>
490///
491/// class CMyVFS : public kodi::addon::CInstanceVFS
492/// {
493/// public:
494/// CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion);
495///
496/// // Add all your required functions, the most CInstanceVFS functions of
497/// // must be included to have addon working correctly.
498/// ...
499/// };
500///
501/// CMyVFS::CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion)
502/// : CInstanceVFS(instance, kodiVersion)
503/// {
504/// ...
505/// }
506///
507/// ...
508///
509/// /*----------------------------------------------------------------------*/
510///
511/// class CMyAddon : public kodi::addon::CAddonBase
512/// {
513/// public:
514/// CMyAddon() { }
515/// ADDON_STATUS CreateInstance(int instanceType,
516/// const std::string& instanceID,
517/// KODI_HANDLE instance,
518/// const std::string& version,
519/// KODI_HANDLE& addonInstance) override;
520/// };
521///
522/// // If you use only one instance in your add-on, can be instanceType and
523/// // instanceID ignored
524/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
525/// const std::string& instanceID,
526/// KODI_HANDLE instance,
527/// const std::string& version,
528/// KODI_HANDLE& addonInstance)
529/// {
530/// if (instanceType == ADDON_INSTANCE_VFS)
531/// {
532/// kodi::Log(ADDON_LOG_NOTICE, "Creating my VFS instance");
533/// addonInstance = new CMyVFS(instance, version);
534/// return ADDON_STATUS_OK;
535/// }
536/// else if (...)
537/// {
538/// ...
539/// }
540/// return ADDON_STATUS_UNKNOWN;
541/// }
542///
543/// ADDONCREATOR(CMyAddon)
544/// ~~~~~~~~~~~~~
545///
546/// The destruction of the example class `CMyVFS` is called from
547/// Kodi's header. Manually deleting the add-on instance is not required.
548///
549//----------------------------------------------------------------------------
550class ATTRIBUTE_HIDDEN CInstanceVFS : public IAddonInstance
551{
552public:
553 //==========================================================================
554 ///
555 /// @ingroup cpp_kodi_addon_vfs
556 /// @brief VFS class constructor used to support multiple instance
557 /// types
558 ///
559 /// @param[in] instance The instance value given to
560 /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>.
561 /// @param[in] kodiVersion [opt] given from Kodi by @ref CAddonBase::CreateInstance
562 /// to identify his instance API version
563 ///
564 /// @note Instance path as a single is not supported by this type. It must
565 /// ensure that it can be called up several times.
566 ///
567 /// @warning Only use `instance` from the @ref CAddonBase::CreateInstance or
568 /// @ref CAddonBase::CreateInstance call.
569 ///
570 explicit CInstanceVFS(KODI_HANDLE instance, const std::string& kodiVersion = "")
571 : IAddonInstance(ADDON_INSTANCE_VFS,
572 !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_VFS))
573 {
574 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
575 throw std::logic_error("kodi::addon::CInstanceVFS: Creation of multiple together with single "
576 "instance way is not allowed!");
577
578 SetAddonStruct(instance);
579 }
580 //--------------------------------------------------------------------------
581
582 //==========================================================================
583 ///
584 /// @ingroup cpp_kodi_addon_vfs
585 /// @brief Destructor
586 ///
587 ~CInstanceVFS() override = default;
588 //--------------------------------------------------------------------------
589
590 //==========================================================================
591 ///
592 /// @defgroup cpp_kodi_addon_vfs_general 1. General access functions
593 /// @ingroup cpp_kodi_addon_vfs
594 /// @brief **General access functions**
595 ///
596 /// This functions which are intended for getting folders, editing storage
597 /// locations and file system queries.
598 ///
599
600 //==========================================================================
601 ///
602 /// @defgroup cpp_kodi_addon_vfs_filecontrol 2. File editing functions
603 /// @ingroup cpp_kodi_addon_vfs
604 /// @brief **File editing functions.**
605 ///
606 /// This value represents the addon-side handlers and to be able to identify
607 /// his own parts in the event of further access.
608 ///
609
610 //@{
611 //==========================================================================
612 ///
613 /// @ingroup cpp_kodi_addon_vfs_filecontrol
614 /// @brief Open a file for input
615 ///
616 /// @param[in] url The URL of the file
617 /// @return Context for the opened file
618 virtual void* Open(const VFSURL& url) { return nullptr; }
619
620 //==========================================================================
621 ///
622 /// @ingroup cpp_kodi_addon_vfs_filecontrol
623 /// @brief Open a file for output
624 ///
625 /// @param[in] url The URL of the file
626 /// @param[in] overWrite Whether or not to overwrite an existing file
627 /// @return Context for the opened file
628 ///
629 virtual void* OpenForWrite(const VFSURL& url, bool overWrite) { return nullptr; }
630 //--------------------------------------------------------------------------
631
632 //==========================================================================
633 ///
634 /// @ingroup cpp_kodi_addon_vfs_filecontrol
635 /// @brief Close a file
636 ///
637 /// @param[in] context The context of the file
638 /// @return True on success, false on failure
639 ///
640 virtual bool Close(void* context) { return false; }
641 //--------------------------------------------------------------------------
642
643 //==========================================================================
644 ///
645 /// @ingroup cpp_kodi_addon_vfs_filecontrol
646 /// @brief Read from a file
647 ///
648 /// @param[in] context The context of the file
649 /// @param[out] buffer The buffer to read data into
650 /// @param[in] uiBufSize Number of bytes to read
651 /// @return Number of bytes read
652 ///
653 virtual ssize_t Read(void* context, void* buffer, size_t uiBufSize) { return -1; }
654 //--------------------------------------------------------------------------
655
656 //==========================================================================
657 ///
658 /// @ingroup cpp_kodi_addon_vfs_filecontrol
659 /// @brief Write to a file
660 ///
661 /// @param[in] context The context of the file
662 /// @param[in] buffer The buffer to read data from
663 /// @param[in] uiBufSize Number of bytes to write
664 /// @return Number of bytes written
665 ///
666 virtual ssize_t Write(void* context, const void* buffer, size_t uiBufSize) { return -1; }
667 //--------------------------------------------------------------------------
668
669 //==========================================================================
670 ///
671 /// @ingroup cpp_kodi_addon_vfs_filecontrol
672 /// @brief Seek in a file
673 ///
674 /// @param[in] context The context of the file
675 /// @param[in] position The position to seek to
676 /// @param[in] whence Position in file 'position' is relative to (SEEK_CUR, SEEK_SET, SEEK_END)
677 /// @return Offset in file after seek
678 ///
679 virtual int64_t Seek(void* context, int64_t position, int whence) { return -1; }
680 //--------------------------------------------------------------------------
681
682 //==========================================================================
683 ///
684 /// @ingroup cpp_kodi_addon_vfs_filecontrol
685 /// @brief Truncate a file
686 ///
687 /// @param[in] context The context of the file
688 /// @param[in] size The size to truncate the file to
689 /// @return 0 on success, -1 on error
690 ///
691 virtual int Truncate(void* context, int64_t size) { return -1; }
692 //--------------------------------------------------------------------------
693
694 //==========================================================================
695 ///
696 /// @ingroup cpp_kodi_addon_vfs_filecontrol
697 /// @brief Get total size of a file
698 ///
699 /// @param[in] context The context of the file
700 /// @return Total file size
701 ///
702 virtual int64_t GetLength(void* context) { return 0; }
703 //--------------------------------------------------------------------------
704
705 //==========================================================================
706 ///
707 /// @ingroup cpp_kodi_addon_vfs_filecontrol
708 /// @brief Get current position in a file
709 ///
710 /// @param[in] context The context of the file
711 /// @return Current position
712 ///
713 virtual int64_t GetPosition(void* context) { return 0; }
714 //--------------------------------------------------------------------------
715
716 //==========================================================================
717 ///
718 /// @ingroup cpp_kodi_addon_vfs_filecontrol
719 /// @brief Get chunk size of a file
720 ///
721 /// @param[in] context The context of the file
722 /// @return Chunk size
723 ///
724 virtual int GetChunkSize(void* context) { return 1; }
725 //--------------------------------------------------------------------------
726
727 //==========================================================================
728 ///
729 /// @ingroup cpp_kodi_addon_vfs_filecontrol
730 /// @brief Perform an IO-control on the file
731 ///
732 /// @param[in] context The context of the file
733 /// @param[in] request The requested IO-control
734 /// @param[in] param Parameter attached to the IO-control
735 /// @return -1 on error, >= 0 on success
736 ///
737 virtual int IoControl(void* context, VFS_IOCTRL request, void* param) { return -1; }
738 //--------------------------------------------------------------------------
739 //@}
740
741 //@{
742 //==========================================================================
743 ///
744 /// @ingroup cpp_kodi_addon_vfs_general
745 /// @brief Stat a file
746 ///
747 /// @param[in] url The URL of the file
748 /// @param[in] buffer The buffer to store results in
749 /// @return -1 on error, 0 otherwise
750 ///
751 virtual int Stat(const VFSURL& url, struct __stat64* buffer) { return 0; }
752 //--------------------------------------------------------------------------
753
754 //==========================================================================
755 ///
756 /// @ingroup cpp_kodi_addon_vfs_general
757 /// @brief Check for file existence
758 ///
759 /// @param[in] url The URL of the file
760 /// @return True if file exists, false otherwise
761 ///
762 virtual bool Exists(const VFSURL& url) { return false; }
763 //--------------------------------------------------------------------------
764
765 //==========================================================================
766 ///
767 /// @ingroup cpp_kodi_addon_vfs_general
768 /// @brief Clear out any idle connections
769 ///
770 virtual void ClearOutIdle() {}
771 //--------------------------------------------------------------------------
772
773 //==========================================================================
774 ///
775 /// @ingroup cpp_kodi_addon_vfs_general
776 /// @brief Disconnect all connections
777 ///
778 virtual void DisconnectAll() {}
779 //--------------------------------------------------------------------------
780
781 //==========================================================================
782 ///
783 /// @ingroup cpp_kodi_addon_vfs_general
784 /// @brief Delete a file
785 ///
786 /// @param[in] url The URL of the file
787 /// @return True if deletion was successful, false otherwise
788 ///
789 virtual bool Delete(const VFSURL& url) { return false; }
790 //--------------------------------------------------------------------------
791
792 //==========================================================================
793 ///
794 /// @ingroup cpp_kodi_addon_vfs_general
795 /// @brief Rename a file
796 ///
797 /// @param[in] url The URL of the source file
798 /// @param[in] url2 The URL of the destination file
799 /// @return True if deletion was successful, false otherwise
800 ///
801 virtual bool Rename(const VFSURL& url, const VFSURL& url2) { return false; }
802 //--------------------------------------------------------------------------
803
804 //==========================================================================
805 ///
806 /// @ingroup cpp_kodi_addon_vfs_general
807 /// @brief Check for directory existence
808 ///
809 /// @param[in] url The URL of the file
810 /// @return True if directory exists, false otherwise
811 ///
812 virtual bool DirectoryExists(const VFSURL& url) { return false; }
813 //--------------------------------------------------------------------------
814
815 //==========================================================================
816 ///
817 /// @ingroup cpp_kodi_addon_vfs_general
818 /// @brief Remove a directory
819 ///
820 /// @param[in] url The URL of the directory
821 /// @return True if removal was successful, false otherwise
822 ///
823 virtual bool RemoveDirectory(const VFSURL& url) { return false; }
824 //--------------------------------------------------------------------------
825
826 //==========================================================================
827 ///
828 /// @ingroup cpp_kodi_addon_vfs_general
829 /// @brief Create a directory
830 ///
831 /// @param[in] url The URL of the file
832 /// @return True if creation was successful, false otherwise
833 ///
834 virtual bool CreateDirectory(const VFSURL& url) { return false; }
835 //--------------------------------------------------------------------------
836
837 //==========================================================================
838 ///
839 /// @defgroup cpp_kodi_addon_vfs_general_cb_GetDirectory **Callbacks GetDirectory()**
840 /// @ingroup cpp_kodi_addon_vfs_general
841 /// @brief Callback functions on GetDirectory()
842 ///
843 /// This functions becomes available during call of GetDirectory() from
844 /// Kodi.
845 ///
846 /// If GetDirectory() returns false becomes the parts from here used on
847 /// next call of the function.
848 ///
849 /// **Example:**
850 /// ~~~~~~~~~~~~~{.cpp}
851 ///
852 /// #include <kodi/addon-instance/VFS.h>
853 ///
854 /// ...
855 ///
856 /// bool CMyVFS::GetDirectory(const VFSURL& url, std::vector<kodi::vfs::CDirEntry>& items, CVFSCallbacks callbacks)
857 /// {
858 /// std::string neededString;
859 /// callbacks.GetKeyboardInput("Test", neededString, true);
860 /// if (neededString.empty())
861 /// return false;
862 ///
863 /// // Do the work
864 /// ...
865 /// return true;
866 /// }
867 /// ~~~~~~~~~~~~~
868 ///
869 class CVFSCallbacks
870 {
871 public:
872 /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory
873 /// @brief Require keyboard input
874 ///
875 /// Becomes called if GetDirectory() returns false and GetDirectory()
876 /// becomes after entry called again.
877 ///
878 /// @param[in] heading The heading of the keyboard dialog
879 /// @param[out] input The resulting string. Returns string after
880 /// second call!
881 /// @param[in] hiddenInput To show input only as "*" on dialog
882 /// @return True if input was received, false otherwise
883 ///
884 bool GetKeyboardInput(const std::string& heading, std::string& input, bool hiddenInput = false)
885 {
886 char* cInput = nullptr;
887 bool ret = m_cb->get_keyboard_input(m_cb->ctx, heading.c_str(), &cInput, hiddenInput);
888 if (cInput)
889 {
890 input = cInput;
891 ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(
892 ::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, cInput);
893 }
894 return ret;
895 }
896
897 /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory
898 /// @brief Display an error dialog
899 ///
900 /// @param[in] heading The heading of the error dialog
901 /// @param[in] line1 The first line of the error dialog
902 /// @param[in] line2 [opt] The second line of the error dialog
903 /// @param[in] line3 [opt] The third line of the error dialog
904 ///
905 void SetErrorDialog(const std::string& heading,
906 const std::string& line1,
907 const std::string& line2 = "",
908 const std::string& line3 = "")
909 {
910 m_cb->set_error_dialog(m_cb->ctx, heading.c_str(), line1.c_str(), line2.c_str(),
911 line3.c_str());
912 }
913
914 /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory
915 /// @brief Prompt the user for authentication of a URL
916 ///
917 /// @param[in] url The URL
918 void RequireAuthentication(const std::string& url)
919 {
920 m_cb->require_authentication(m_cb->ctx, url.c_str());
921 }
922
923 explicit CVFSCallbacks(const VFSGetDirectoryCallbacks* cb) : m_cb(cb) {}
924
925 private:
926 const VFSGetDirectoryCallbacks* m_cb;
927 };
928 //--------------------------------------------------------------------------
929
930 //==========================================================================
931 ///
932 /// @ingroup cpp_kodi_addon_vfs_general
933 /// @brief List a directory
934 ///
935 /// @param[in] url The URL of the directory
936 /// @param[out] entries The entries in the directory, see
937 /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry"
938 /// about his content
939 /// @param[in] callbacks A callback structure
940 /// @return Context for the directory listing
941 ///
942 ///
943 /// --------------------------------------------------------------------------
944 ///
945 /// ### Callbacks:
946 /// @copydetails cpp_kodi_addon_vfs_general_cb_GetDirectory
947 ///
948 /// **Available callback functions**
949 /// | Function: | Description
950 /// |--|--
951 /// | CVFSCallbacks::GetKeyboardInput | @copybrief CVFSCallbacks::GetKeyboardInput @copydetails CVFSCallbacks::GetKeyboardInput
952 /// | CVFSCallbacks::SetErrorDialog | @copybrief CVFSCallbacks::SetErrorDialog @copydetails CVFSCallbacks::SetErrorDialog
953 /// | CVFSCallbacks::RequireAuthentication | @copybrief CVFSCallbacks::RequireAuthentication @copydetails CVFSCallbacks::RequireAuthentication
954 ///
955 virtual bool GetDirectory(const VFSURL& url,
956 std::vector<kodi::vfs::CDirEntry>& entries,
957 CVFSCallbacks callbacks)
958 {
959 return false;
960 }
961 //--------------------------------------------------------------------------
962
963 //==========================================================================
964 ///
965 /// @ingroup cpp_kodi_addon_vfs_general
966 /// @brief Check if file should be presented as a directory (multiple streams)
967 ///
968 /// @param[in] url The URL of the file
969 /// @param[out] entries The entries in the directory, see
970 /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry"
971 /// about his content
972 /// @param[out] rootPath Path to root directory if multiple entries
973 /// @return Context for the directory listing
974 ///
975 virtual bool ContainsFiles(const VFSURL& url,
976 std::vector<kodi::vfs::CDirEntry>& entries,
977 std::string& rootPath)
978 {
979 return false;
980 }
981 //--------------------------------------------------------------------------
982 //@}
983
984private:
985 void SetAddonStruct(KODI_HANDLE instance)
986 {
987 if (instance == nullptr)
988 throw std::logic_error("kodi::addon::CInstanceVFS: Creation with empty addon structure not "
989 "allowed, table must be given from Kodi!");
990
991 m_instanceData = static_cast<AddonInstance_VFSEntry*>(instance);
992 m_instanceData->toAddon->addonInstance = this;
993 m_instanceData->toAddon->open = ADDON_Open;
994 m_instanceData->toAddon->open_for_write = ADDON_OpenForWrite;
995 m_instanceData->toAddon->read = ADDON_Read;
996 m_instanceData->toAddon->write = ADDON_Write;
997 m_instanceData->toAddon->seek = ADDON_Seek;
998 m_instanceData->toAddon->truncate = ADDON_Truncate;
999 m_instanceData->toAddon->get_length = ADDON_GetLength;
1000 m_instanceData->toAddon->get_position = ADDON_GetPosition;
1001 m_instanceData->toAddon->get_chunk_size = ADDON_GetChunkSize;
1002 m_instanceData->toAddon->io_control = ADDON_IoControl;
1003 m_instanceData->toAddon->stat = ADDON_Stat;
1004 m_instanceData->toAddon->close = ADDON_Close;
1005 m_instanceData->toAddon->exists = ADDON_Exists;
1006 m_instanceData->toAddon->clear_out_idle = ADDON_ClearOutIdle;
1007 m_instanceData->toAddon->disconnect_all = ADDON_DisconnectAll;
1008 m_instanceData->toAddon->delete_it = ADDON_Delete;
1009 m_instanceData->toAddon->rename = ADDON_Rename;
1010 m_instanceData->toAddon->directory_exists = ADDON_DirectoryExists;
1011 m_instanceData->toAddon->remove_directory = ADDON_RemoveDirectory;
1012 m_instanceData->toAddon->create_directory = ADDON_CreateDirectory;
1013 m_instanceData->toAddon->get_directory = ADDON_GetDirectory;
1014 m_instanceData->toAddon->free_directory = ADDON_FreeDirectory;
1015 m_instanceData->toAddon->contains_files = ADDON_ContainsFiles;
1016 }
1017
1018 inline static void* ADDON_Open(const AddonInstance_VFSEntry* instance, const VFSURL* url)
1019 {
1020 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Open(*url);
1021 }
1022
1023 inline static void* ADDON_OpenForWrite(const AddonInstance_VFSEntry* instance,
1024 const VFSURL* url,
1025 bool overWrite)
1026 {
1027 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1028 ->OpenForWrite(*url, overWrite);
1029 }
1030
1031 inline static ssize_t ADDON_Read(const AddonInstance_VFSEntry* instance,
1032 void* context,
1033 void* buffer,
1034 size_t uiBufSize)
1035 {
1036 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1037 ->Read(context, buffer, uiBufSize);
1038 }
1039
1040 inline static ssize_t ADDON_Write(const AddonInstance_VFSEntry* instance,
1041 void* context,
1042 const void* buffer,
1043 size_t uiBufSize)
1044 {
1045 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1046 ->Write(context, buffer, uiBufSize);
1047 }
1048
1049 inline static int64_t ADDON_Seek(const AddonInstance_VFSEntry* instance,
1050 void* context,
1051 int64_t position,
1052 int whence)
1053 {
1054 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1055 ->Seek(context, position, whence);
1056 }
1057
1058 inline static int ADDON_Truncate(const AddonInstance_VFSEntry* instance,
1059 void* context,
1060 int64_t size)
1061 {
1062 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Truncate(context, size);
1063 }
1064
1065 inline static int64_t ADDON_GetLength(const AddonInstance_VFSEntry* instance, void* context)
1066 {
1067 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetLength(context);
1068 }
1069
1070 inline static int64_t ADDON_GetPosition(const AddonInstance_VFSEntry* instance, void* context)
1071 {
1072 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetPosition(context);
1073 }
1074
1075 inline static int ADDON_GetChunkSize(const AddonInstance_VFSEntry* instance, void* context)
1076 {
1077 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetChunkSize(context);
1078 }
1079
1080 inline static int ADDON_IoControl(const AddonInstance_VFSEntry* instance,
1081 void* context,
1082 enum VFS_IOCTRL request,
1083 void* param)
1084 {
1085 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1086 ->IoControl(context, request, param);
1087 }
1088
1089 inline static int ADDON_Stat(const AddonInstance_VFSEntry* instance,
1090 const VFSURL* url,
1091 struct __stat64* buffer)
1092 {
1093 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Stat(*url, buffer);
1094 }
1095
1096 inline static bool ADDON_Close(const AddonInstance_VFSEntry* instance, void* context)
1097 {
1098 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Close(context);
1099 }
1100
1101 inline static bool ADDON_Exists(const AddonInstance_VFSEntry* instance, const VFSURL* url)
1102 {
1103 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Exists(*url);
1104 }
1105
1106 inline static void ADDON_ClearOutIdle(const AddonInstance_VFSEntry* instance)
1107 {
1108 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->ClearOutIdle();
1109 }
1110
1111 inline static void ADDON_DisconnectAll(const AddonInstance_VFSEntry* instance)
1112 {
1113 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->DisconnectAll();
1114 }
1115
1116 inline static bool ADDON_Delete(const AddonInstance_VFSEntry* instance, const VFSURL* url)
1117 {
1118 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Delete(*url);
1119 }
1120
1121 inline static bool ADDON_Rename(const AddonInstance_VFSEntry* instance,
1122 const VFSURL* url,
1123 const VFSURL* url2)
1124 {
1125 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Rename(*url, *url2);
1126 }
1127
1128 inline static bool ADDON_DirectoryExists(const AddonInstance_VFSEntry* instance,
1129 const VFSURL* url)
1130 {
1131 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->DirectoryExists(*url);
1132 }
1133
1134 inline static bool ADDON_RemoveDirectory(const AddonInstance_VFSEntry* instance,
1135 const VFSURL* url)
1136 {
1137 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->RemoveDirectory(*url);
1138 }
1139
1140 inline static bool ADDON_CreateDirectory(const AddonInstance_VFSEntry* instance,
1141 const VFSURL* url)
1142 {
1143 return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->CreateDirectory(*url);
1144 }
1145
1146 inline static bool ADDON_GetDirectory(const AddonInstance_VFSEntry* instance,
1147 const VFSURL* url,
1148 VFSDirEntry** retEntries,
1149 int* num_entries,
1150 VFSGetDirectoryCallbacks* callbacks)
1151 {
1152 std::vector<kodi::vfs::CDirEntry> addonEntries;
1153 bool ret = static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1154 ->GetDirectory(*url, addonEntries, CVFSCallbacks(callbacks));
1155 if (ret)
1156 {
1157 VFSDirEntry* entries =
1158 static_cast<VFSDirEntry*>(malloc(sizeof(VFSDirEntry) * addonEntries.size()));
1159 for (unsigned int i = 0; i < addonEntries.size(); ++i)
1160 {
1161 entries[i].label = strdup(addonEntries[i].Label().c_str());
1162 entries[i].title = strdup(addonEntries[i].Title().c_str());
1163 entries[i].path = strdup(addonEntries[i].Path().c_str());
1164 entries[i].folder = addonEntries[i].IsFolder();
1165 entries[i].size = addonEntries[i].Size();
1166 entries[i].date_time = addonEntries[i].DateTime();
1167
1168 entries[i].num_props = 0;
1169 const std::map<std::string, std::string>& props = addonEntries[i].GetProperties();
1170 if (!props.empty())
1171 {
1172 entries[i].properties =
1173 static_cast<VFSProperty*>(malloc(sizeof(VFSProperty) * props.size()));
1174 for (const auto& prop : props)
1175 {
1176 entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str());
1177 entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str());
1178 ++entries[i].num_props;
1179 }
1180 }
1181 else
1182 entries[i].properties = nullptr;
1183 }
1184 *retEntries = entries;
1185 *num_entries = static_cast<int>(addonEntries.size());
1186 }
1187 return ret;
1188 }
1189
1190 inline static void ADDON_FreeDirectory(const AddonInstance_VFSEntry* instance,
1191 VFSDirEntry* entries,
1192 int num_entries)
1193 {
1194 for (int i = 0; i < num_entries; ++i)
1195 {
1196 if (entries[i].properties)
1197 {
1198 for (unsigned int j = 0; j < entries[i].num_props; ++j)
1199 {
1200 free(entries[i].properties[j].name);
1201 free(entries[i].properties[j].val);
1202 }
1203 free(entries[i].properties);
1204 }
1205 free(entries[i].label);
1206 free(entries[i].title);
1207 free(entries[i].path);
1208 }
1209 free(entries);
1210 }
1211
1212 inline static bool ADDON_ContainsFiles(const AddonInstance_VFSEntry* instance,
1213 const VFSURL* url,
1214 VFSDirEntry** retEntries,
1215 int* num_entries,
1216 char* rootpath)
1217 {
1218 std::string cppRootPath;
1219 std::vector<kodi::vfs::CDirEntry> addonEntries;
1220 bool ret = static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)
1221 ->ContainsFiles(*url, addonEntries, cppRootPath);
1222 if (ret)
1223 {
1224 strncpy(rootpath, cppRootPath.c_str(), ADDON_STANDARD_STRING_LENGTH);
1225
1226 VFSDirEntry* entries =
1227 static_cast<VFSDirEntry*>(malloc(sizeof(VFSDirEntry) * addonEntries.size()));
1228 for (size_t i = 0; i < addonEntries.size(); ++i)
1229 {
1230 entries[i].label = strdup(addonEntries[i].Label().c_str());
1231 entries[i].title = strdup(addonEntries[i].Title().c_str());
1232 entries[i].path = strdup(addonEntries[i].Path().c_str());
1233 entries[i].folder = addonEntries[i].IsFolder();
1234 entries[i].size = addonEntries[i].Size();
1235 entries[i].date_time = addonEntries[i].DateTime();
1236
1237 entries[i].num_props = 0;
1238 const std::map<std::string, std::string>& props = addonEntries[i].GetProperties();
1239 if (!props.empty())
1240 {
1241 entries[i].properties =
1242 static_cast<VFSProperty*>(malloc(sizeof(VFSProperty) * props.size()));
1243 for (const auto& prop : props)
1244 {
1245 entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str());
1246 entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str());
1247 ++entries[i].num_props;
1248 }
1249 }
1250 else
1251 entries[i].properties = nullptr;
1252 }
1253 *retEntries = entries;
1254 *num_entries = static_cast<int>(addonEntries.size());
1255 }
1256 return ret;
1257 }
1258
1259 AddonInstance_VFSEntry* m_instanceData;
1260};
1261
1262} /* namespace addon */
1263} /* namespace kodi */
1264
1265#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h
deleted file mode 100644
index 54246f0..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h
+++ /dev/null
@@ -1,246 +0,0 @@
1/*
2 * Copyright (C) 2017-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 "../AddonBase.h"
12#include "../StreamCrypto.h"
13#include "../StreamCodec.h"
14
15#ifdef BUILD_KODI_ADDON
16#include "../DemuxPacket.h"
17#else
18#include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h"
19#endif
20
21namespace kodi { namespace addon { class CInstanceVideoCodec; } }
22
23extern "C"
24{
25 enum VIDEOCODEC_FORMAT
26 {
27 UnknownVideoFormat = 0,
28 VideoFormatYV12,
29 VideoFormatI420,
30 MaxVideoFormats
31 };
32
33
34 struct VIDEOCODEC_INITDATA
35 {
36 enum Codec {
37 CodecUnknown = 0,
38 CodecVp8,
39 CodecH264,
40 CodecVp9
41 } codec;
42
43 STREAMCODEC_PROFILE codecProfile;
44
45 //UnknownVideoFormat is terminator
46 VIDEOCODEC_FORMAT *videoFormats;
47
48 uint32_t width, height;
49
50 const uint8_t *extraData;
51 unsigned int extraDataSize;
52
53 CRYPTO_INFO cryptoInfo;
54 };
55
56 struct VIDEOCODEC_PICTURE
57 {
58 enum VideoPlane {
59 YPlane = 0,
60 UPlane,
61 VPlane,
62 MaxPlanes = 3,
63 };
64
65 enum Flags : uint32_t {
66 FLAG_DROP,
67 FLAG_DRAIN
68 };
69
70 VIDEOCODEC_FORMAT videoFormat;
71 uint32_t flags;
72
73 uint32_t width, height;
74
75 uint8_t *decodedData;
76 size_t decodedDataSize;
77
78 uint32_t planeOffsets[VideoPlane::MaxPlanes];
79 uint32_t stride[VideoPlane::MaxPlanes];
80
81 int64_t pts;
82
83 KODI_HANDLE buffer; //< will be passed in release_frame_buffer
84 };
85
86 enum VIDEOCODEC_RETVAL
87 {
88 VC_NONE = 0, //< noop
89 VC_ERROR, //< an error occurred, no other messages will be returned
90 VC_BUFFER, //< the decoder needs more data
91 VC_PICTURE, //< the decoder got a picture
92 VC_EOF, //< the decoder signals EOF
93 };
94
95 // this are properties given to the addon on create
96 // at this time we have no parameters for the addon
97 typedef struct AddonProps_VideoCodec
98 {
99 int dummy;
100 } AddonProps_VideoCodec;
101
102 struct AddonInstance_VideoCodec;
103 typedef struct KodiToAddonFuncTable_VideoCodec
104 {
105 kodi::addon::CInstanceVideoCodec* addonInstance;
106
107 //! \brief Opens a codec
108 bool (__cdecl* open) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData);
109
110 //! \brief Reconfigures a codec
111 bool (__cdecl* reconfigure) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData);
112
113 //! \brief Feed codec if requested from GetPicture() (return VC_BUFFER)
114 bool (__cdecl* add_data) (const AddonInstance_VideoCodec* instance, const DemuxPacket *packet);
115
116 //! \brief Get a decoded picture / request new data
117 VIDEOCODEC_RETVAL (__cdecl* get_picture) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture);
118
119 //! \brief Get the name of this video decoder
120 const char *(__cdecl* get_name) (const AddonInstance_VideoCodec* instance);
121
122 //! \brief Reset the codec
123 void (__cdecl* reset)(const AddonInstance_VideoCodec* instance);
124 } KodiToAddonFuncTable_VideoCodec;
125
126 typedef struct AddonToKodiFuncTable_VideoCodec
127 {
128 KODI_HANDLE kodiInstance;
129 bool(*get_frame_buffer)(void* kodiInstance, VIDEOCODEC_PICTURE *picture);
130 void(*release_frame_buffer)(void* kodiInstance, void *buffer);
131 } AddonToKodiFuncTable_VideoCodec;
132
133 typedef struct AddonInstance_VideoCodec
134 {
135 AddonProps_VideoCodec props;
136 AddonToKodiFuncTable_VideoCodec toKodi;
137 KodiToAddonFuncTable_VideoCodec toAddon;
138 } AddonInstance_VideoCodec;
139}
140
141namespace kodi
142{
143 namespace addon
144 {
145
146 class ATTRIBUTE_HIDDEN CInstanceVideoCodec : public IAddonInstance
147 {
148 public:
149 explicit CInstanceVideoCodec(KODI_HANDLE instance, const std::string& kodiVersion = "")
150 : IAddonInstance(ADDON_INSTANCE_VIDEOCODEC,
151 !kodiVersion.empty() ? kodiVersion
152 : GetKodiTypeVersion(ADDON_INSTANCE_VIDEOCODEC))
153 {
154 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
155 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with single instance way is not allowed!");
156
157 SetAddonStruct(instance);
158 }
159
160 ~CInstanceVideoCodec() override = default;
161
162 //! \copydoc CInstanceVideoCodec::Open
163 virtual bool Open(VIDEOCODEC_INITDATA &initData) { return false; };
164
165 //! \copydoc CInstanceVideoCodec::Reconfigure
166 virtual bool Reconfigure(VIDEOCODEC_INITDATA &initData) { return false; };
167
168 //! \copydoc CInstanceVideoCodec::AddData
169 virtual bool AddData(const DemuxPacket &packet) { return false; };
170
171 //! \copydoc CInstanceVideoCodec::GetPicture
172 virtual VIDEOCODEC_RETVAL GetPicture(VIDEOCODEC_PICTURE &picture) { return VC_ERROR; };
173
174 //! \copydoc CInstanceVideoCodec::GetName
175 virtual const char *GetName() { return nullptr; };
176
177 //! \copydoc CInstanceVideoCodec::Reset
178 virtual void Reset() {};
179
180 /*!
181 * @brief AddonToKodi interface
182 */
183
184 //! \copydoc CInstanceVideoCodec::GetFrameBuffer
185 bool GetFrameBuffer(VIDEOCODEC_PICTURE &picture)
186 {
187 return m_instanceData->toKodi.get_frame_buffer(m_instanceData->toKodi.kodiInstance, &picture);
188 }
189
190 //! \copydoc CInstanceVideoCodec::ReleaseFrameBuffer
191 void ReleaseFrameBuffer(void *buffer)
192 {
193 return m_instanceData->toKodi.release_frame_buffer(m_instanceData->toKodi.kodiInstance, buffer);
194 }
195
196 private:
197 void SetAddonStruct(KODI_HANDLE instance)
198 {
199 if (instance == nullptr)
200 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation with empty addon structure not allowed, table must be given from Kodi!");
201
202 m_instanceData = static_cast<AddonInstance_VideoCodec*>(instance);
203
204 m_instanceData->toAddon.addonInstance = this;
205 m_instanceData->toAddon.open = ADDON_Open;
206 m_instanceData->toAddon.reconfigure = ADDON_Reconfigure;
207 m_instanceData->toAddon.add_data = ADDON_AddData;
208 m_instanceData->toAddon.get_picture = ADDON_GetPicture;
209 m_instanceData->toAddon.get_name = ADDON_GetName;
210 m_instanceData->toAddon.reset = ADDON_Reset;
211 }
212
213 inline static bool ADDON_Open(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData)
214 {
215 return instance->toAddon.addonInstance->Open(*initData);
216 }
217
218 inline static bool ADDON_Reconfigure(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData)
219 {
220 return instance->toAddon.addonInstance->Reconfigure(*initData);
221 }
222
223 inline static bool ADDON_AddData(const AddonInstance_VideoCodec* instance, const DemuxPacket *packet)
224 {
225 return instance->toAddon.addonInstance->AddData(*packet);
226 }
227
228 inline static VIDEOCODEC_RETVAL ADDON_GetPicture(const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture)
229 {
230 return instance->toAddon.addonInstance->GetPicture(*picture);
231 }
232
233 inline static const char *ADDON_GetName(const AddonInstance_VideoCodec* instance)
234 {
235 return instance->toAddon.addonInstance->GetName();
236 }
237
238 inline static void ADDON_Reset(const AddonInstance_VideoCodec* instance)
239 {
240 return instance->toAddon.addonInstance->Reset();
241 }
242
243 AddonInstance_VideoCodec* m_instanceData;
244 };
245 } // namespace addon
246} // namespace kodi
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h
deleted file mode 100644
index 4be785d..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h
+++ /dev/null
@@ -1,789 +0,0 @@
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/*
12 * Parts with a comment named "internal" are only used inside header and not
13 * used or accessed direct during add-on development!
14 */
15
16#include "../AddonBase.h"
17#include "../gui/renderHelper.h"
18
19namespace kodi { namespace addon { class CInstanceVisualization; }}
20
21extern "C"
22{
23
24struct AddonInstance_Visualization;
25
26typedef enum VIS_ACTION : unsigned int /* internal */
27{
28 VIS_ACTION_NONE = 0,
29 VIS_ACTION_NEXT_PRESET,
30 VIS_ACTION_PREV_PRESET,
31 VIS_ACTION_LOAD_PRESET,
32 VIS_ACTION_RANDOM_PRESET,
33 VIS_ACTION_LOCK_PRESET,
34 VIS_ACTION_RATE_PRESET_PLUS,
35 VIS_ACTION_RATE_PRESET_MINUS,
36 VIS_ACTION_UPDATE_ALBUMART,
37 VIS_ACTION_UPDATE_TRACK
38} VIS_ACTION;
39
40struct VIS_INFO /* internal */
41{
42 bool bWantsFreq;
43 int iSyncDelay;
44};
45
46typedef struct AddonProps_Visualization /* internal */
47{
48 void *device;
49 int x;
50 int y;
51 int width;
52 int height;
53 float pixelRatio;
54 const char *name;
55 const char *presets;
56 const char *profile;
57} AddonProps_Visualization;
58
59typedef struct AddonToKodiFuncTable_Visualization /* internal */
60{
61 KODI_HANDLE kodiInstance;
62 void (__cdecl* transfer_preset) (void* kodiInstance, const char* preset);
63 void (__cdecl* clear_presets) (void* kodiInstance);
64} AddonToKodiFuncTable_Visualization;
65
66typedef struct KodiToAddonFuncTable_Visualization /* internal */
67{
68 kodi::addon::CInstanceVisualization* addonInstance;
69 bool (__cdecl* start)(const AddonInstance_Visualization* instance, int channels, int samples_per_sec, int bits_per_sample, const char* song_name);
70 void (__cdecl* stop)(const AddonInstance_Visualization* instance);
71 void (__cdecl* audio_data)(const AddonInstance_Visualization* instance, const float* audio_data, int audio_data_length, float *freq_data, int freq_data_length);
72 bool (__cdecl* is_dirty)(const AddonInstance_Visualization* instance);
73 void (__cdecl* render)(const AddonInstance_Visualization* instance);
74 void (__cdecl* get_info)(const AddonInstance_Visualization* instance, VIS_INFO *info);
75 bool (__cdecl* on_action)(const AddonInstance_Visualization* instance, VIS_ACTION action, const void *param);
76 unsigned int (__cdecl *get_presets)(const AddonInstance_Visualization* instance);
77 int (__cdecl *get_active_preset)(const AddonInstance_Visualization* instance);
78 bool (__cdecl* is_locked)(const AddonInstance_Visualization* instance);
79} KodiToAddonFuncTable_Visualization;
80
81typedef struct AddonInstance_Visualization /* internal */
82{
83 AddonProps_Visualization* props;
84 AddonToKodiFuncTable_Visualization* toKodi;
85 KodiToAddonFuncTable_Visualization* toAddon;
86} AddonInstance_Visualization;
87
88//============================================================================
89/// \defgroup cpp_kodi_addon_visualization_VisTrack class VisTrack
90/// \ingroup cpp_kodi_addon_visualization
91/// @brief **Visualization track information structure**
92///
93/// Called from kodi::addon::CInstanceVisualization::UpdateTrack() with the
94/// information of the currently-playing song.
95///
96//@{
97struct VisTrack
98{
99 /// @brief Title of the current song.
100 const char *title;
101
102 /// @brief Artist names, as a single string
103 const char *artist;
104
105 /// @brief Album that the current song is from.
106 const char *album;
107
108 /// @brief Album artist names, as a single string
109 const char *albumArtist;
110
111 /// @brief The genre name from the music tag, if present.
112 const char *genre;
113
114 /// @brief Comment of the current song stored in the ID tag info.
115 const char *comment;
116
117 /// @brief Lyrics of the current song, if available.
118 const char *lyrics;
119
120 const char *reserved1;
121 const char *reserved2;
122
123 /// @brief Track number of the current song.
124 int trackNumber;
125
126 /// @brief Disc number of the current song stored in the ID tag info.
127 int discNumber;
128
129 /// @brief Duration of the current song, in seconds.
130 int duration;
131
132 /// @brief Year that the current song was released.
133 int year;
134
135 /// @brief The user-defined rating of the current song.
136 int rating;
137
138 int reserved3;
139 int reserved4;
140};
141//@}
142//----------------------------------------------------------------------------
143
144} /* extern "C" */
145
146namespace kodi
147{
148namespace addon
149{
150
151 //============================================================================
152 ///
153 /// \addtogroup cpp_kodi_addon_visualization
154 /// @brief \cpp_class{ kodi::addon::CInstanceVisualization }
155 /// **Visualization add-on instance**
156 ///
157 /// [Music visualization](https://en.wikipedia.org/wiki/Music_visualization),
158 /// or music visualisation, is a feature in Kodi that generates animated
159 /// imagery based on a piece of music. The imagery is usually generated and
160 /// rendered in real time synchronized to the music.
161 ///
162 /// Visualization techniques range from simple ones (e.g., a simulation of an
163 /// oscilloscope display) to elaborate ones, which often include a plurality
164 /// of composited effects. The changes in the music's loudness and frequency
165 /// spectrum are among the properties used as input to the visualization.
166 ///
167 /// Include the header \ref Visualization.h "#include <kodi/addon-instance/Visualization.h>"
168 /// to use this class.
169 ///
170 /// This interface allows the creation of visualizations for Kodi, based upon
171 /// **DirectX** or/and **OpenGL** rendering with `C++` code.
172 ///
173 /// Additionally, there are several \ref cpp_kodi_addon_visualization_CB "other functions"
174 /// available in which the child class can ask about the current hardware,
175 /// including the device, display and several other parts.
176 ///
177 /// --------------------------------------------------------------------------
178 ///
179 ///
180 /// **Here is an example of the minimum required code to start a visualization:**
181 /// ~~~~~~~~~~~~~{.cpp}
182 /// #include <kodi/addon-instance/Visualization.h>
183 ///
184 /// class CMyVisualization : public kodi::addon::CAddonBase,
185 /// public kodi::addon::CInstanceVisualization
186 /// {
187 /// public:
188 /// CMyVisualization();
189 ///
190 /// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override;
191 /// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override;
192 /// void Render() override;
193 /// };
194 ///
195 /// CMyVisualization::CMyVisualization()
196 /// {
197 /// ...
198 /// }
199 ///
200 /// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName)
201 /// {
202 /// ...
203 /// return true;
204 /// }
205 ///
206 /// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength)
207 /// {
208 /// ...
209 /// }
210 ///
211 /// void CMyVisualization::Render()
212 /// {
213 /// ...
214 /// }
215 ///
216 /// ADDONCREATOR(CMyVisualization)
217 /// ~~~~~~~~~~~~~
218 ///
219 ///
220 /// --------------------------------------------------------------------------
221 ///
222 ///
223 /// **Here is another example where the visualization is used together with
224 /// other instance types:**
225 ///
226 /// ~~~~~~~~~~~~~{.cpp}
227 /// #include <kodi/addon-instance/Visualization.h>
228 ///
229 /// class CMyVisualization : public ::kodi::addon::CInstanceVisualization
230 /// {
231 /// public:
232 /// CMyVisualization(KODI_HANDLE instance);
233 ///
234 /// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override;
235 /// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override;
236 /// void Render() override;
237 /// };
238 ///
239 /// CMyVisualization::CMyVisualization(KODI_HANDLE instance)
240 /// : CInstanceVisualization(instance)
241 /// {
242 /// ...
243 /// }
244 ///
245 /// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName)
246 /// {
247 /// ...
248 /// return true;
249 /// }
250 ///
251 /// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength)
252 /// {
253 /// ...
254 /// }
255 ///
256 /// void CMyVisualization::Render()
257 /// {
258 /// ...
259 /// }
260 ///
261 ///
262 /// /*----------------------------------------------------------------------*/
263 ///
264 /// class CMyAddon : public ::kodi::addon::CAddonBase
265 /// {
266 /// public:
267 /// CMyAddon() { }
268 /// ADDON_STATUS CreateInstance(int instanceType,
269 /// std::string instanceID,
270 /// KODI_HANDLE instance,
271 /// KODI_HANDLE& addonInstance) override;
272 /// };
273 ///
274 /// /* If you use only one instance in your add-on, can be instanceType and
275 /// * instanceID ignored */
276 /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType,
277 /// std::string instanceID,
278 /// KODI_HANDLE instance,
279 /// KODI_HANDLE& addonInstance)
280 /// {
281 /// if (instanceType == ADDON_INSTANCE_VISUALIZATION)
282 /// {
283 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my Visualization");
284 /// addonInstance = new CMyVisualization(instance);
285 /// return ADDON_STATUS_OK;
286 /// }
287 /// else if (...)
288 /// {
289 /// ...
290 /// }
291 /// return ADDON_STATUS_UNKNOWN;
292 /// }
293 ///
294 /// ADDONCREATOR(CMyAddon)
295 /// ~~~~~~~~~~~~~
296 ///
297 /// The destruction of the example class `CMyVisualization` is called from
298 /// Kodi's header. Manually deleting the add-on instance is not required.
299 ///
300 //----------------------------------------------------------------------------
301 class ATTRIBUTE_HIDDEN CInstanceVisualization : public IAddonInstance
302 {
303 public:
304 //==========================================================================
305 ///
306 /// @ingroup cpp_kodi_addon_visualization
307 /// @brief Visualization class constructor
308 ///
309 /// Used by an add-on that only supports visualizations.
310 ///
311 CInstanceVisualization()
312 : IAddonInstance(ADDON_INSTANCE_VISUALIZATION,
313 GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION))
314 {
315 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
316 throw std::logic_error("kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on.");
317
318 SetAddonStruct(CAddonBase::m_interface->firstKodiInstance);
319 CAddonBase::m_interface->globalSingleInstance = this;
320 }
321 //--------------------------------------------------------------------------
322
323 //==========================================================================
324 ///
325 /// @ingroup cpp_kodi_addon_visualization
326 /// @brief Visualization class constructor used to support multiple instance
327 /// types
328 ///
329 /// @param[in] instance The instance value given to
330 /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>.
331 /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to
332 /// allow compatibility to older Kodi versions.
333 /// @note Recommended to set.
334 ///
335 /// @warning Only use `instance` from the CreateInstance call
336 ///
337 explicit CInstanceVisualization(KODI_HANDLE instance, const std::string& kodiVersion = "")
338 : IAddonInstance(ADDON_INSTANCE_VISUALIZATION,
339 !kodiVersion.empty() ? kodiVersion
340 : GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION))
341 {
342 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
343 throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together with single instance way is not allowed!");
344
345 SetAddonStruct(instance);
346 }
347 //--------------------------------------------------------------------------
348
349 //==========================================================================
350 ///
351 /// @ingroup cpp_kodi_addon_visualization
352 /// @brief Destructor
353 ///
354 ~CInstanceVisualization() override = default;
355 //--------------------------------------------------------------------------
356
357 //==========================================================================
358 ///
359 /// @ingroup cpp_kodi_addon_visualization
360 /// @brief Used to notify the visualization that a new song has been started
361 ///
362 /// @param[in] channels Number of channels in the stream
363 /// @param[in] samplesPerSec Samples per second of stream
364 /// @param[in] bitsPerSample Number of bits in one sample
365 /// @param[in] songName The name of the currently-playing song
366 /// @return true if start successful done
367 ///
368 virtual bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) { return true; }
369 //--------------------------------------------------------------------------
370
371 //==========================================================================
372 ///
373 /// @ingroup cpp_kodi_addon_visualization
374 /// @brief Used to inform the visualization that the rendering control was
375 /// stopped
376 ///
377 virtual void Stop() {}
378 //--------------------------------------------------------------------------
379
380 //==========================================================================
381 ///
382 /// @ingroup cpp_kodi_addon_visualization
383 /// @brief Pass audio data to the visualization
384 ///
385 /// @param[in] audioData The raw audio data
386 /// @param[in] audioDataLength Length of the audioData array
387 /// @param[in] freqData The [FFT](https://en.wikipedia.org/wiki/Fast_Fourier_transform)
388 /// of the audio data
389 /// @param[in] freqDataLength Length of frequency data array
390 ///
391 /// Values **freqData** and **freqDataLength** are used if GetInfo() returns
392 /// true for the `wantsFreq` parameter. Otherwise, **freqData** is set to
393 /// `nullptr` and **freqDataLength** is `0`.
394 ///
395 virtual void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) {}
396 //--------------------------------------------------------------------------
397
398 //==========================================================================
399 ///
400 /// @ingroup cpp_kodi_addon_visualization
401 /// @brief Used to inform Kodi that the rendered region is dirty and need an
402 /// update
403 ///
404 /// @return True if dirty
405 ///
406 virtual bool IsDirty() { return true; }
407 //--------------------------------------------------------------------------
408
409 //==========================================================================
410 ///
411 /// @ingroup cpp_kodi_addon_visualization
412 /// @brief Used to indicate when the add-on should render
413 ///
414 virtual void Render() {}
415 //--------------------------------------------------------------------------
416
417 //==========================================================================
418 ///
419 /// @ingroup cpp_kodi_addon_visualization
420 /// @brief Used to get the number of buffers from the current visualization
421 ///
422 /// @param[out] wantsFreq Indicates whether the add-on wants FFT
423 /// data. If set to true, the **freqData**
424 /// and **freqDataLength** parameters of
425 /// AudioData() are used
426 /// @param[out] syncDelay The number of buffers to delay before
427 /// calling AudioData()
428 ///
429 /// @note If this function is not implemented, it will default to
430 /// `wantsFreq` = false and `syncDelay` = 0.
431 ///
432 virtual void GetInfo(bool& wantsFreq, int& syncDelay) { wantsFreq = false; syncDelay = 0; }
433 //--------------------------------------------------------------------------
434
435 //==========================================================================
436 ///
437 /// @ingroup cpp_kodi_addon_visualization
438 /// @brief Used to get a list of visualization presets the user can select
439 /// from
440 ///
441 /// @param[out] presets The vector list containing the names of
442 /// presets that the user can select
443 /// @return Return true if successful, or false if
444 /// there are no presets to choose from
445 ///
446 virtual bool GetPresets(std::vector<std::string>& presets) { return false; }
447 //--------------------------------------------------------------------------
448
449 //==========================================================================
450 ///
451 /// @ingroup cpp_kodi_addon_visualization
452 /// @brief Get the index of the current preset
453 ///
454 /// @return Index number of the current preset
455 ///
456 virtual int GetActivePreset() { return -1; }
457 //--------------------------------------------------------------------------
458
459 //==========================================================================
460 ///
461 /// @ingroup cpp_kodi_addon_visualization
462 /// @brief Check if the add-on is locked to the current preset
463 ///
464 /// @return True if locked to the current preset
465 ///
466 virtual bool IsLocked() { return false; }
467 //--------------------------------------------------------------------------
468
469 //==========================================================================
470 ///
471 /// @ingroup cpp_kodi_addon_visualization
472 /// @brief Load the previous visualization preset
473 ///
474 /// @return Return true if the previous preset was loaded
475 virtual bool PrevPreset() { return false; }
476 //--------------------------------------------------------------------------
477
478 //==========================================================================
479 ///
480 /// @ingroup cpp_kodi_addon_visualization
481 /// @brief Load the next visualization preset
482 ///
483 /// @return Return true if the next preset was loaded
484 virtual bool NextPreset() { return false; }
485 //--------------------------------------------------------------------------
486
487 //==========================================================================
488 ///
489 /// @ingroup cpp_kodi_addon_visualization
490 /// @brief Load a visualization preset
491 ///
492 /// This function is called after a new preset is selected.
493 ///
494 /// @param[in] select Preset index to use
495 /// @return Return true if the preset is loaded
496 virtual bool LoadPreset(int select) { return false; }
497 //--------------------------------------------------------------------------
498
499 //==========================================================================
500 ///
501 /// @ingroup cpp_kodi_addon_visualization
502 /// @brief Switch to a new random preset
503 ///
504 /// @return Return true if a random preset was loaded
505 virtual bool RandomPreset() { return false; }
506 //--------------------------------------------------------------------------
507
508 //==========================================================================
509 ///
510 /// @ingroup cpp_kodi_addon_visualization
511 /// @brief Lock the current visualization preset, preventing it from changing
512 ///
513 /// @param[in] lockUnlock If set to true, the preset should be locked
514 /// @return Return true if the current preset is locked
515 virtual bool LockPreset(bool lockUnlock) { return false; }
516 //--------------------------------------------------------------------------
517
518 //==========================================================================
519 ///
520 /// @ingroup cpp_kodi_addon_visualization
521 /// @brief Used to increase/decrease the visualization preset rating
522 ///
523 /// @param[in] plusMinus If set to true the rating is increased, otherwise
524 /// decreased
525 /// @return Return true if the rating is modified
526 virtual bool RatePreset(bool plusMinus) { return false; }
527 //--------------------------------------------------------------------------
528
529 //==========================================================================
530 ///
531 /// @ingroup cpp_kodi_addon_visualization
532 /// @brief Inform the visualization of the current album art image
533 ///
534 /// @param[in] albumart Path to the current album art image
535 /// @return Return true if the image is used
536 virtual bool UpdateAlbumart(std::string albumart) { return false; }
537 //--------------------------------------------------------------------------
538
539 //==========================================================================
540 ///
541 /// @ingroup cpp_kodi_addon_visualization
542 /// @brief Inform the visualization of the current track's tag information
543 ///
544 /// @param[in] track Visualization track information structure
545 /// @return Return true if the track information is used
546 virtual bool UpdateTrack(const VisTrack &track) { return false; }
547
548 //==========================================================================
549 ///
550 /// \defgroup cpp_kodi_addon_visualization_CB Information functions
551 /// \ingroup cpp_kodi_addon_visualization
552 /// @brief **To get info about the device, display and several other parts**
553 ///
554 //@{
555
556 //==========================================================================
557 ///
558 /// @ingroup cpp_kodi_addon_visualization_CB
559 /// @brief To transfer available presets on addon
560 ///
561 /// Used if @ref GetPresets not possible to use, e.g. where available presets
562 /// are only known during @ref Start call.
563 ///
564 /// @param[in] presets List to store available presets.
565 ///
566 /// @note The function should only be called once, if possible
567 ///
568 inline void TransferPresets(const std::vector<std::string>& presets)
569 {
570 m_instanceData->toKodi->clear_presets(m_instanceData->toKodi->kodiInstance);
571 for (auto it : presets)
572 m_instanceData->toKodi->transfer_preset(m_instanceData->toKodi->kodiInstance, it.c_str());
573 }
574 //--------------------------------------------------------------------------
575
576 //==========================================================================
577 ///
578 /// @ingroup cpp_kodi_addon_visualization_CB
579 /// @brief Device that represents the display adapter
580 ///
581 /// @return A pointer to the used device
582 ///
583 /// @note This is only available on **DirectX**, It us unused (`nullptr`) on
584 /// **OpenGL**
585 ///
586 inline void* Device() { return m_instanceData->props->device; }
587 //--------------------------------------------------------------------------
588
589 //==========================================================================
590 ///
591 /// @ingroup cpp_kodi_addon_visualization_CB
592 /// @brief Returns the X position of the rendering window
593 ///
594 /// @return The X position, in pixels
595 ///
596 inline int X() { return m_instanceData->props->x; }
597 //--------------------------------------------------------------------------
598
599 //==========================================================================
600 ///
601 /// @ingroup cpp_kodi_addon_visualization_CB
602 /// @brief Returns the Y position of the rendering window
603 ///
604 /// @return The Y position, in pixels
605 ///
606 inline int Y() { return m_instanceData->props->y; }
607 //--------------------------------------------------------------------------
608
609 //==========================================================================
610 ///
611 /// @ingroup cpp_kodi_addon_visualization_CB
612 /// @brief Returns the width of the rendering window
613 ///
614 /// @return The width, in pixels
615 ///
616 inline int Width() { return m_instanceData->props->width; }
617 //--------------------------------------------------------------------------
618
619 //==========================================================================
620 ///
621 /// @ingroup cpp_kodi_addon_visualization_CB
622 /// @brief Returns the height of the rendering window
623 ///
624 /// @return The height, in pixels
625 ///
626 inline int Height() { return m_instanceData->props->height; }
627 //--------------------------------------------------------------------------
628
629 //==========================================================================
630 ///
631 /// @ingroup cpp_kodi_addon_visualization_CB
632 /// @brief Pixel aspect ratio (often abbreviated PAR) is a ratio that
633 /// describes how the width of a pixel compares to the height of that pixel.
634 ///
635 /// @return The pixel aspect ratio used by the display
636 ///
637 inline float PixelRatio() { return m_instanceData->props->pixelRatio; }
638 //--------------------------------------------------------------------------
639
640 //==========================================================================
641 ///
642 /// @ingroup cpp_kodi_addon_visualization_CB
643 /// @brief Used to get the name of the add-on defined in `addon.xml`
644 ///
645 /// @return The add-on name
646 ///
647 inline std::string Name() { return m_instanceData->props->name; }
648 //--------------------------------------------------------------------------
649
650 //==========================================================================
651 ///
652 /// @ingroup cpp_kodi_addon_visualization_CB
653 /// @brief Used to get the full path where the add-on is installed
654 ///
655 /// @return The add-on installation path
656 ///
657 inline std::string Presets() { return m_instanceData->props->presets; }
658 //--------------------------------------------------------------------------
659
660 //==========================================================================
661 ///
662 /// @ingroup cpp_kodi_addon_visualization_CB
663 /// @brief Used to get the full path to the add-on's user profile
664 ///
665 /// @note The trailing folder (consisting of the add-on's ID) is not created
666 /// by default. If it is needed, you must call kodi::vfs::CreateDirectory()
667 /// to create the folder.
668 ///
669 /// @return Path to the user profile
670 ///
671 inline std::string Profile() { return m_instanceData->props->profile; }
672 //--------------------------------------------------------------------------
673 //@}
674
675 private:
676 void SetAddonStruct(KODI_HANDLE instance)
677 {
678 if (instance == nullptr)
679 throw std::logic_error("kodi::addon::CInstanceVisualization: Null pointer instance passed.");
680
681 m_instanceData = static_cast<AddonInstance_Visualization*>(instance);
682 m_instanceData->toAddon->addonInstance = this;
683 m_instanceData->toAddon->start = ADDON_Start;
684 m_instanceData->toAddon->stop = ADDON_Stop;
685 m_instanceData->toAddon->audio_data = ADDON_AudioData;
686 m_instanceData->toAddon->is_dirty = ADDON_IsDirty;
687 m_instanceData->toAddon->render = ADDON_Render;
688 m_instanceData->toAddon->get_info = ADDON_GetInfo;
689 m_instanceData->toAddon->on_action = ADDON_OnAction;
690 m_instanceData->toAddon->get_presets = ADDON_GetPresets;
691 m_instanceData->toAddon->get_active_preset = ADDON_GetActivePreset;
692 m_instanceData->toAddon->is_locked = ADDON_IsLocked;
693 }
694
695 inline static bool ADDON_Start(const AddonInstance_Visualization* addon, int channels, int samplesPerSec, int bitsPerSample, const char* songName)
696 {
697 addon->toAddon->addonInstance->m_renderHelper = kodi::gui::GetRenderHelper();
698 return addon->toAddon->addonInstance->Start(channels, samplesPerSec, bitsPerSample, songName);
699 }
700
701 inline static void ADDON_Stop(const AddonInstance_Visualization* addon)
702 {
703 addon->toAddon->addonInstance->Stop();
704 addon->toAddon->addonInstance->m_renderHelper = nullptr;
705 }
706
707 inline static void ADDON_AudioData(const AddonInstance_Visualization* addon, const float* audioData, int audioDataLength, float *freqData, int freqDataLength)
708 {
709 addon->toAddon->addonInstance->AudioData(audioData, audioDataLength, freqData, freqDataLength);
710 }
711
712 inline static bool ADDON_IsDirty(const AddonInstance_Visualization* addon)
713 {
714 return addon->toAddon->addonInstance->IsDirty();
715 }
716
717 inline static void ADDON_Render(const AddonInstance_Visualization* addon)
718 {
719 if (!addon->toAddon->addonInstance->m_renderHelper)
720 return;
721 addon->toAddon->addonInstance->m_renderHelper->Begin();
722 addon->toAddon->addonInstance->Render();
723 addon->toAddon->addonInstance->m_renderHelper->End();
724 }
725
726 inline static void ADDON_GetInfo(const AddonInstance_Visualization* addon, VIS_INFO *info)
727 {
728 addon->toAddon->addonInstance->GetInfo(info->bWantsFreq, info->iSyncDelay);
729 }
730
731 inline static bool ADDON_OnAction(const AddonInstance_Visualization* addon, VIS_ACTION action, const void *param)
732 {
733 switch (action)
734 {
735 case VIS_ACTION_NEXT_PRESET:
736 return addon->toAddon->addonInstance->NextPreset();
737 case VIS_ACTION_PREV_PRESET:
738 return addon->toAddon->addonInstance->PrevPreset();
739 case VIS_ACTION_LOAD_PRESET:
740 return addon->toAddon->addonInstance->LoadPreset(*static_cast<const int*>(param));
741 case VIS_ACTION_RANDOM_PRESET:
742 return addon->toAddon->addonInstance->RandomPreset();
743 case VIS_ACTION_LOCK_PRESET:
744 addon->toAddon->addonInstance->m_presetLockedByUser = !addon->toAddon->addonInstance->m_presetLockedByUser;
745 return addon->toAddon->addonInstance->LockPreset(addon->toAddon->addonInstance->m_presetLockedByUser);
746 case VIS_ACTION_RATE_PRESET_PLUS:
747 return addon->toAddon->addonInstance->RatePreset(true);
748 case VIS_ACTION_RATE_PRESET_MINUS:
749 return addon->toAddon->addonInstance->RatePreset(false);
750 case VIS_ACTION_UPDATE_ALBUMART:
751 return addon->toAddon->addonInstance->UpdateAlbumart(static_cast<const char*>(param));
752 case VIS_ACTION_UPDATE_TRACK:
753 return addon->toAddon->addonInstance->UpdateTrack(*static_cast<const VisTrack*>(param));
754 case VIS_ACTION_NONE:
755 default:
756 break;
757 }
758 return false;
759 }
760
761 inline static unsigned int ADDON_GetPresets(const AddonInstance_Visualization* addon)
762 {
763 std::vector<std::string> presets;
764 if (addon->toAddon->addonInstance->GetPresets(presets))
765 {
766 for (auto it : presets)
767 addon->toAddon->addonInstance->m_instanceData->toKodi->transfer_preset(addon->toKodi->kodiInstance, it.c_str());
768 }
769
770 return static_cast<unsigned int>(presets.size());
771 }
772
773 inline static int ADDON_GetActivePreset(const AddonInstance_Visualization* addon)
774 {
775 return addon->toAddon->addonInstance->GetActivePreset();
776 }
777
778 inline static bool ADDON_IsLocked(const AddonInstance_Visualization* addon)
779 {
780 return addon->toAddon->addonInstance->IsLocked();
781 }
782
783 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
784 bool m_presetLockedByUser = false;
785 AddonInstance_Visualization* m_instanceData;
786 };
787
788} /* namespace addon */
789} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt
deleted file mode 100644
index 946849e..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
1set(HEADERS ChannelGroups.h
2 Channels.h
3 EDL.h
4 EPG.h
5 General.h
6 MenuHook.h
7 Recordings.h
8 Stream.h
9 Timers.h)
10
11if(NOT ENABLE_STATIC_LIBS)
12 core_add_library(addons_kodi-addon-dev-kit_include_kodi_addon-instance_pvr)
13endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h
deleted file mode 100644
index 17995bb..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h
+++ /dev/null
@@ -1,271 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 3 - PVR channel group
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup class PVRChannelGroup
25/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup
26/// @brief **PVR add-on channel group**\n
27/// To define a group for channels, this becomes be asked from
28/// @ref kodi::addon::CInstancePVRClient::GetChannelGroups() and used on
29/// @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers() to get his
30/// content with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember "PVRChannelGroupMember".
31///
32/// ----------------------------------------------------------------------------
33///
34/// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help
35///
36///@{
37class PVRChannelGroup : public CStructHdl<PVRChannelGroup, PVR_CHANNEL_GROUP>
38{
39 friend class CInstancePVRClient;
40
41public:
42 /*! \cond PRIVATE */
43 PVRChannelGroup() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP)); }
44 PVRChannelGroup(const PVRChannelGroup& channel) : CStructHdl(channel) {}
45 /*! \endcond */
46
47 /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help Value Help
48 /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup
49 ///
50 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup :</b>
51 /// | Name | Type | Set call | Get call | Usage
52 /// |------|------|----------|----------|-----------
53 /// | **Group name** | `std::string` | @ref PVRChannelGroup::SetGroupName "SetGroupName" | @ref PVRChannelGroup::GetGroupName "GetGroupName" | *required to set*
54 /// | **Is radio** | `bool` | @ref PVRChannelGroup::SetIsRadio "SetIsRadio" | @ref PVRChannelGroup::GetIsRadio "GetIsRadio" | *required to set*
55 /// | **Position** | `unsigned int` | @ref PVRChannelGroup::SetPosition "SetPosition" | @ref PVRChannelGroup::GetPosition "GetPosition" | *optional*
56 ///
57
58 /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup
59 ///@{
60
61 /// @brief **required**\n
62 /// Name of this channel group.
63 void SetGroupName(const std::string& groupName)
64 {
65 strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1);
66 }
67
68 /// @brief To get with @ref SetGroupName changed values.
69 std::string GetGroupName() const { return m_cStructure->strGroupName; }
70
71 /// @brief **required**\n
72 /// **true** If this is a radio channel group, **false** otherwise.
73 void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; }
74
75 /// @brief To get with @ref SetIsRadio changed values.
76 bool GetIsRadio() const { return m_cStructure->bIsRadio; }
77
78 /// @brief **optional**\n
79 /// Sort position of the group (<b>`0`</b> indicates that the backend doesn't
80 /// support sorting of groups).
81 void SetPosition(unsigned int position) { m_cStructure->iPosition = position; }
82
83 /// @brief To get with @ref SetPosition changed values.
84 unsigned int GetPosition() const { return m_cStructure->iPosition; }
85
86 ///@}
87
88private:
89 PVRChannelGroup(const PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {}
90 PVRChannelGroup(PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {}
91};
92///@}
93//------------------------------------------------------------------------------
94
95//==============================================================================
96/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet class PVRChannelGroupsResultSet
97/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup
98/// @brief **PVR add-on channel group member transfer class**\n
99/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups().
100///
101///@{
102class PVRChannelGroupsResultSet
103{
104public:
105 /*! \cond PRIVATE */
106 PVRChannelGroupsResultSet() = delete;
107 PVRChannelGroupsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
108 : m_instance(instance), m_handle(handle)
109 {
110 }
111 /*! \endcond */
112
113
114 /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet
115 ///@{
116
117 /// @brief To add and give content from addon to Kodi on related call.
118 ///
119 /// @param[in] tag The to transferred data.
120 void Add(const kodi::addon::PVRChannelGroup& tag)
121 {
122 m_instance->toKodi->TransferChannelGroup(m_instance->toKodi->kodiInstance, m_handle, tag);
123 }
124
125 ///@}
126
127private:
128 const AddonInstance_PVR* m_instance = nullptr;
129 const ADDON_HANDLE m_handle;
130};
131///@}
132//------------------------------------------------------------------------------
133
134//==============================================================================
135/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember class PVRChannelGroupMember
136/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup
137/// @brief **PVR add-on channel group member**\n
138/// To define the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups()
139/// given groups.
140///
141/// This content becomes then requested with @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers().
142///
143/// ----------------------------------------------------------------------------
144///
145/// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help
146///
147///@{
148class PVRChannelGroupMember : public CStructHdl<PVRChannelGroupMember, PVR_CHANNEL_GROUP_MEMBER>
149{
150 friend class CInstancePVRClient;
151
152public:
153 /*! \cond PRIVATE */
154 PVRChannelGroupMember() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); }
155 PVRChannelGroupMember(const PVRChannelGroupMember& channel) : CStructHdl(channel) {}
156 /*! \endcond */
157
158 /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help Value Help
159 /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember
160 ///
161 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember :</b>
162 /// | Name | Type | Set call | Get call | Usage
163 /// |-------|-------|-----------|----------|-----------
164 /// | **Group name** | `std::string` | @ref PVRChannelGroupMember::SetGroupName "SetGroupName" | @ref PVRChannelGroupMember::GetGroupName "GetGroupName" | *required to set*
165 /// | **Channel unique id** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelUniqueId "SetChannelUniqueId" | @ref PVRChannelGroupMember::GetChannelUniqueId "GetChannelUniqueId" | *required to set*
166 /// | **Channel Number** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelNumber "SetChannelNumber" | @ref PVRChannelGroupMember::GetChannelNumber "GetChannelNumber" | *optional*
167 /// | **Sub channel number** | `unsigned int` | @ref PVRChannelGroupMember::SetSubChannelNumber "SetSubChannelNumber"| @ref PVRChannelGroupMember::GetSubChannelNumber "GetSubChannelNumber" | *optional*
168 /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional*
169 ///
170
171 /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember
172 ///@{
173
174 /// @brief **required**\n
175 /// Name of the channel group to add the channel to.
176 void SetGroupName(const std::string& groupName)
177 {
178 strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1);
179 }
180
181 /// @brief To get with @ref SetGroupName changed values.
182 std::string GetGroupName() const { return m_cStructure->strGroupName; }
183
184 /// @brief **required**\n
185 /// Unique id of the member.
186 void SetChannelUniqueId(unsigned int channelUniqueId)
187 {
188 m_cStructure->iChannelUniqueId = channelUniqueId;
189 }
190
191 /// @brief To get with @ref SetChannelUniqueId changed values.
192 unsigned int GetChannelUniqueId() const { return m_cStructure->iChannelUniqueId; }
193
194 /// @brief **optional**\n
195 /// Channel number within the group.
196 void SetChannelNumber(unsigned int channelNumber)
197 {
198 m_cStructure->iChannelNumber = channelNumber;
199 }
200
201 /// @brief To get with @ref SetChannelNumber changed values.
202 unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; }
203
204 /// @brief **optional**\n
205 /// Sub channel number within the group (ATSC).
206 void SetSubChannelNumber(unsigned int subChannelNumber)
207 {
208 m_cStructure->iSubChannelNumber = subChannelNumber;
209 }
210
211 /// @brief To get with @ref SetSubChannelNumber changed values.
212 unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; }
213
214 /// @brief **optional**\n
215 /// The value denoting the order of this channel in the <b>'All channels'</b> group.
216 void SetOrder(bool order) { m_cStructure->iOrder = order; }
217
218 /// @brief To get with @ref SetOrder changed values.
219 bool GetOrder() const { return m_cStructure->iOrder; }
220
221 ///@}
222
223private:
224 PVRChannelGroupMember(const PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {}
225 PVRChannelGroupMember(PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {}
226};
227///@}
228//------------------------------------------------------------------------------
229
230//==============================================================================
231/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet class PVRChannelGroupMembersResultSet
232/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember
233/// @brief **PVR add-on channel group member transfer class**\n
234/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers().
235///
236///@{
237class PVRChannelGroupMembersResultSet
238{
239public:
240 /*! \cond PRIVATE */
241 PVRChannelGroupMembersResultSet() = delete;
242 PVRChannelGroupMembersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
243 : m_instance(instance), m_handle(handle)
244 {
245 }
246 /*! \endcond */
247
248 /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet
249 ///@{
250
251 /// @brief To add and give content from addon to Kodi on related call.
252 ///
253 /// @param[in] tag The to transferred data.
254 void Add(const kodi::addon::PVRChannelGroupMember& tag)
255 {
256 m_instance->toKodi->TransferChannelGroupMember(m_instance->toKodi->kodiInstance, m_handle, tag);
257 }
258
259 ///@}
260
261private:
262 const AddonInstance_PVR* m_instance = nullptr;
263 const ADDON_HANDLE m_handle;
264};
265///@}
266//------------------------------------------------------------------------------
267
268} /* namespace addon */
269} /* namespace kodi */
270
271#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Channels.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Channels.h
deleted file mode 100644
index 9c2f5d2..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Channels.h
+++ /dev/null
@@ -1,518 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 2 - PVR channel
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel class PVRChannel
25/// @ingroup cpp_kodi_addon_pvr_Defs_Channel
26/// @brief **Channel data structure**\n
27/// Representation of a TV or radio channel.
28///
29/// This is used to store all the necessary TV or radio channel data and can
30/// either provide the necessary data from / to Kodi for the associated
31/// functions or can also be used in the addon to store its data.
32///
33/// ----------------------------------------------------------------------------
34///
35/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help
36///
37///@{
38class PVRChannel : public CStructHdl<PVRChannel, PVR_CHANNEL>
39{
40 friend class CInstancePVRClient;
41
42public:
43 /*! \cond PRIVATE */
44 PVRChannel() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL)); }
45 PVRChannel(const PVRChannel& channel) : CStructHdl(channel) {}
46 /*! \endcond */
47
48 /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help Value Help
49 /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel
50 ///
51 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel :</b>
52 /// | Name | Type | Set call | Get call | Usage
53 /// |------|------|----------|----------|-----------
54 /// | **Unique id** | `unsigned int` | @ref PVRChannel::SetUniqueId "SetUniqueId" | @ref PVRChannel::GetUniqueId "GetUniqueId" | *required to set*
55 /// | **Is radio** | `bool` | @ref PVRChannel::SetIsRadio "SetIsRadio" | @ref PVRChannel::GetIsRadio "GetIsRadio" | *required to set*
56 /// | **Channel number** | `unsigned int` | @ref PVRChannel::SetChannelNumber "SetChannelNumber" | @ref PVRChannel::GetChannelNumber "GetChannelNumber" | *optional*
57 /// | **Sub channel number** | `unsigned int` | @ref PVRChannel::SetSubChannelNumber "SetSubChannelNumber" | @ref PVRChannel::GetSubChannelNumber "GetSubChannelNumber" | *optional*
58 /// | **Channel name** | `std::string` | @ref PVRChannel::SetChannelName "SetChannelName" | @ref PVRChannel::GetChannelName "GetChannelName" | *optional*
59 /// | **Mime type** | `std::string` | @ref PVRChannel::SetMimeType "SetMimeType" | @ref PVRChannel::GetMimeType "GetMimeType" | *optional*
60 /// | **Encryption system** | `unsigned int` | @ref PVRChannel::SetEncryptionSystem "SetEncryptionSystem" | @ref PVRChannel::GetEncryptionSystem "GetEncryptionSystem" | *optional*
61 /// | **Icon path** | `std::string` | @ref PVRChannel::SetIconPath "SetIconPath" | @ref PVRChannel::GetIconPath "GetIconPath" | *optional*
62 /// | **Is hidden** | `bool` | @ref PVRChannel::SetIsHidden "SetIsHidden" | @ref PVRChannel::GetIsHidden "GetIsHidden" | *optional*
63 /// | **Has archive** | `bool` | @ref PVRChannel::SetHasArchive "SetHasArchive" | @ref PVRChannel::GetHasArchive "GetHasArchive" | *optional*
64 /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional*
65 ///
66
67 /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel
68 ///@{
69
70 /// @brief **required**\n
71 /// Unique identifier for this channel.
72 void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; }
73
74 /// @brief To get with @ref SetUniqueId changed values.
75 unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; }
76
77 /// @brief **required**\n
78 /// **true** if this is a radio channel, **false** if it's a TV channel.
79 void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; }
80
81 /// @brief To get with @ref SetIsRadio changed values.
82 bool GetIsRadio() const { return m_cStructure->bIsRadio; }
83
84 /// @brief **optional**\n
85 /// Channel number of this channel on the backend.
86 void SetChannelNumber(unsigned int channelNumber)
87 {
88 m_cStructure->iChannelNumber = channelNumber;
89 }
90
91 /// @brief To get with @ref SetChannelNumber changed values.
92 unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; }
93
94 /// @brief **optional**\n
95 /// Sub channel number of this channel on the backend (ATSC).
96 void SetSubChannelNumber(unsigned int subChannelNumber)
97 {
98 m_cStructure->iSubChannelNumber = subChannelNumber;
99 }
100
101 /// @brief To get with @ref SetSubChannelNumber changed values.
102 unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; }
103
104 /// @brief **optional**\n
105 /// Channel name given to this channel.
106 void SetChannelName(const std::string& channelName)
107 {
108 strncpy(m_cStructure->strChannelName, channelName.c_str(),
109 sizeof(m_cStructure->strChannelName) - 1);
110 }
111
112 /// @brief To get with @ref SetChannelName changed values.
113 std::string GetChannelName() const { return m_cStructure->strChannelName; }
114
115 /// @brief **optional**\n
116 /// Input format mime type.
117 ///
118 /// Available types can be found in https://www.iana.org/assignments/media-types/media-types.xhtml
119 /// on "application" and "video" or leave empty if unknown.
120 ///
121 void SetMimeType(const std::string& inputFormat)
122 {
123 strncpy(m_cStructure->strMimeType, inputFormat.c_str(), sizeof(m_cStructure->strMimeType) - 1);
124 }
125
126 /// @brief To get with @ref SetMimeType changed values.
127 std::string GetMimeType() const { return m_cStructure->strMimeType; }
128
129 /// @brief **optional**\n
130 /// The encryption ID or CaID of this channel (Conditional access systems).
131 ///
132 /// Lists about available ID's:
133 /// - http://www.dvb.org/index.php?id=174
134 /// - http://en.wikipedia.org/wiki/Conditional_access_system
135 ///
136 void SetEncryptionSystem(unsigned int encryptionSystem)
137 {
138 m_cStructure->iEncryptionSystem = encryptionSystem;
139 }
140
141 /// @brief To get with @ref SetEncryptionSystem changed values.
142 unsigned int GetEncryptionSystem() const { return m_cStructure->iEncryptionSystem; }
143
144 /// @brief **optional**\n
145 /// Path to the channel icon (if present).
146 void SetIconPath(const std::string& iconPath)
147 {
148 strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1);
149 }
150
151 /// @brief To get with @ref SetIconPath changed values.
152 std::string GetIconPath() const { return m_cStructure->strIconPath; }
153
154 /// @brief **optional**\n
155 /// **true** if this channel is marked as hidden.
156 void SetIsHidden(bool isHidden) { m_cStructure->bIsHidden = isHidden; }
157
158 /// @brief To get with @ref GetIsRadio changed values.
159 bool GetIsHidden() const { return m_cStructure->bIsHidden; }
160
161 /// @brief **optional**\n
162 /// **true** if this channel has a server-side back buffer.
163 void SetHasArchive(bool hasArchive) { m_cStructure->bHasArchive = hasArchive; }
164
165 /// @brief To get with @ref GetIsRadio changed values.
166 bool GetHasArchive() const { return m_cStructure->bHasArchive; }
167
168 /// @brief **optional**\n
169 /// The value denoting the order of this channel in the 'All channels' group.
170 void SetOrder(bool order) { m_cStructure->iOrder = order; }
171
172 /// @brief To get with @ref SetOrder changed values.
173 bool GetOrder() const { return m_cStructure->iOrder; }
174 ///@}
175
176private:
177 PVRChannel(const PVR_CHANNEL* channel) : CStructHdl(channel) {}
178 PVRChannel(PVR_CHANNEL* channel) : CStructHdl(channel) {}
179};
180///@}
181//------------------------------------------------------------------------------
182
183//==============================================================================
184/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet class PVRChannelsResultSet
185/// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel
186/// @brief **PVR add-on channel transfer class**\n
187/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannels().
188///
189///@{
190class PVRChannelsResultSet
191{
192public:
193 /*! \cond PRIVATE */
194 PVRChannelsResultSet() = delete;
195 PVRChannelsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
196 : m_instance(instance), m_handle(handle)
197 {
198 }
199 /*! \endcond */
200
201 /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet
202 ///@{
203
204 /// @brief To add and give content from addon to Kodi on related call.
205 ///
206 /// @param[in] tag The to transferred data.
207 void Add(const kodi::addon::PVRChannel& tag)
208 {
209 m_instance->toKodi->TransferChannelEntry(m_instance->toKodi->kodiInstance, m_handle, tag);
210 }
211
212 ///@}
213
214private:
215 const AddonInstance_PVR* m_instance = nullptr;
216 const ADDON_HANDLE m_handle;
217};
218///@}
219//------------------------------------------------------------------------------
220
221//==============================================================================
222/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus class PVRSignalStatus
223/// @ingroup cpp_kodi_addon_pvr_Defs_Channel
224/// @brief **PVR Signal status information**\n
225/// This class gives current status information from stream to Kodi.
226///
227/// Used to get information for user by call of @ref kodi::addon::CInstancePVRClient::GetSignalStatus()
228/// to see current quality and source.
229///
230/// ----------------------------------------------------------------------------
231///
232/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help
233///
234///@{
235class PVRSignalStatus : public CStructHdl<PVRSignalStatus, PVR_SIGNAL_STATUS>
236{
237 friend class CInstancePVRClient;
238
239public:
240 /*! \cond PRIVATE */
241 PVRSignalStatus() = default;
242 PVRSignalStatus(const PVRSignalStatus& type) : CStructHdl(type) {}
243 /*! \endcond */
244
245
246 /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help Value Help
247 /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus
248 ///
249 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus :</b>
250 /// | Name | Type | Set call | Get call | Usage
251 /// |------|------|----------|----------|-----------
252 /// | **Adapter name** | `std::string` | @ref PVRSignalStatus::SetAdapterName "SetAdapterName" | @ref PVRSignalStatus::GetAdapterName "GetAdapterName" | *optional*
253 /// | **Adapter status** | `std::string` | @ref PVRSignalStatus::SetAdapterStatus "SetAdapterStatus" | @ref PVRSignalStatus::GetAdapterStatus "GetAdapterStatus" | *optional*
254 /// | **Service name** | `std::string` | @ref PVRSignalStatus::SetServiceName "SetServiceName" | @ref PVRSignalStatus::GetServiceName "GetServiceName" | *optional*
255 /// | **Provider name** | `std::string` | @ref PVRSignalStatus::SetProviderName "SetProviderName" | @ref PVRSignalStatus::GetProviderName "GetProviderName" | *optional*
256 /// | **Mux name** | `std::string` | @ref PVRSignalStatus::SetMuxName "SetMuxName" | @ref PVRSignalStatus::GetMuxName "GetMuxName" | *optional*
257 /// | **Signal/noise ratio** | `int` | @ref PVRSignalStatus::SetSNR "SetSNR" | @ref PVRSignalStatus::GetSNR "GetSNR" | *optional*
258 /// | **Signal strength** | `int` | @ref PVRSignalStatus::SetSignal "SetSignal" | @ref PVRSignalStatus::GetSignal "GetSignal" | *optional*
259 /// | **Bit error rate** | `long` | @ref PVRSignalStatus::SetBER "SetBER" | @ref PVRSignalStatus::GetBER "GetBER" | *optional*
260 /// | **Uncorrected blocks** | `long` | @ref PVRSignalStatus::SetUNC "SetUNC" | @ref PVRSignalStatus::GetUNC "GetUNC" | *optional*
261 ///
262
263 /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus
264 ///@{
265
266 /// @brief **optional**\n
267 /// Name of the adapter that's being used.
268 void SetAdapterName(const std::string& adapterName)
269 {
270 strncpy(m_cStructure->strAdapterName, adapterName.c_str(),
271 sizeof(m_cStructure->strAdapterName) - 1);
272 }
273
274 /// @brief To get with @ref SetAdapterName changed values.
275 std::string GetAdapterName() const { return m_cStructure->strAdapterName; }
276
277 /// @brief **optional**\n
278 /// Status of the adapter that's being used.
279 void SetAdapterStatus(const std::string& adapterStatus)
280 {
281 strncpy(m_cStructure->strAdapterStatus, adapterStatus.c_str(),
282 sizeof(m_cStructure->strAdapterStatus) - 1);
283 }
284
285 /// @brief To get with @ref SetAdapterStatus changed values.
286 std::string GetAdapterStatus() const { return m_cStructure->strAdapterStatus; }
287
288 /// @brief **optional**\n
289 /// Name of the current service.
290 void SetServiceName(const std::string& serviceName)
291 {
292 strncpy(m_cStructure->strServiceName, serviceName.c_str(),
293 sizeof(m_cStructure->strServiceName) - 1);
294 }
295
296 /// @brief To get with @ref SetServiceName changed values.
297 std::string GetServiceName() const { return m_cStructure->strServiceName; }
298
299 /// @brief **optional**\n
300 /// Name of the current service's provider.
301 void SetProviderName(const std::string& providerName)
302 {
303 strncpy(m_cStructure->strProviderName, providerName.c_str(),
304 sizeof(m_cStructure->strProviderName) - 1);
305 }
306
307 /// @brief To get with @ref SetProviderName changed values.
308 std::string GetProviderName() const { return m_cStructure->strProviderName; }
309
310 /// @brief **optional**\n
311 /// Name of the current mux.
312 void SetMuxName(const std::string& muxName)
313 {
314 strncpy(m_cStructure->strMuxName, muxName.c_str(), sizeof(m_cStructure->strMuxName) - 1);
315 }
316
317 /// @brief To get with @ref SetMuxName changed values.
318 std::string GetMuxName() const { return m_cStructure->strMuxName; }
319
320 /// @brief **optional**\n
321 /// Signal/noise ratio.
322 ///
323 /// @note 100% is 0xFFFF 65535
324 void SetSNR(int snr) { m_cStructure->iSNR = snr; }
325
326 /// @brief To get with @ref SetSNR changed values.
327 int GetSNR() const { return m_cStructure->iSNR; }
328
329 /// @brief **optional**\n
330 /// Signal strength.
331 ///
332 /// @note 100% is 0xFFFF 65535
333 void SetSignal(int signal) { m_cStructure->iSignal = signal; }
334
335 /// @brief To get with @ref SetSignal changed values.
336 int GetSignal() const { return m_cStructure->iSignal; }
337
338 /// @brief **optional**\n
339 /// Bit error rate.
340 void SetBER(long ber) { m_cStructure->iBER = ber; }
341
342 /// @brief To get with @ref SetBER changed values.
343 long GetBER() const { return m_cStructure->iBER; }
344
345 /// @brief **optional**\n
346 /// Uncorrected blocks:
347 void SetUNC(long unc) { m_cStructure->iUNC = unc; }
348
349 /// @brief To get with @ref SetBER changed values.
350 long GetUNC() const { return m_cStructure->iUNC; }
351 ///@}
352
353private:
354 PVRSignalStatus(const PVR_SIGNAL_STATUS* type) : CStructHdl(type) {}
355 PVRSignalStatus(PVR_SIGNAL_STATUS* type) : CStructHdl(type) {}
356};
357///@}
358//------------------------------------------------------------------------------
359
360//==============================================================================
361/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo class PVRDescrambleInfo
362/// @ingroup cpp_kodi_addon_pvr_Defs_Channel
363/// @brief **Data structure for descrample info**\n
364/// Information data to give via this to Kodi.
365///
366/// As description see also here https://en.wikipedia.org/wiki/Conditional_access.
367///
368/// Used on @ref kodi::addon::CInstancePVRClient::GetDescrambleInfo().
369///
370/// ----------------------------------------------------------------------------
371///
372/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help
373///
374///@{
375class PVRDescrambleInfo : public CStructHdl<PVRDescrambleInfo, PVR_DESCRAMBLE_INFO>
376{
377 friend class CInstancePVRClient;
378
379public:
380 /*! \cond PRIVATE */
381 PVRDescrambleInfo()
382 {
383 m_cStructure->iPid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE;
384 m_cStructure->iCaid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE;
385 m_cStructure->iProvid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE;
386 m_cStructure->iEcmTime = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE;
387 m_cStructure->iHops = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE;
388 }
389 PVRDescrambleInfo(const PVRDescrambleInfo& type) : CStructHdl(type) {}
390 /*! \endcond */
391
392 /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help Value Help
393 /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo
394 ///
395 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo :</b>
396 /// | Name | Type | Set call | Get call | Usage
397 /// |------|------|----------|----------|-----------
398 /// | **Packet identifier** | `int` | @ref PVRDescrambleInfo::SetPID "SetPID" | @ref PVRDescrambleInfo::GetPID "GetPID" | *optional*
399 /// | **Conditional access identifier** | `int` | @ref PVRDescrambleInfo::SetCAID "SetCAID" | @ref PVRDescrambleInfo::GetCAID "GetCAID" | *optional*
400 /// | **Provider-ID** | `int` | @ref PVRDescrambleInfo::SetProviderID "SetProviderID" | @ref PVRDescrambleInfo::GetProviderID "GetProviderID" | *optional*
401 /// | **ECM time** | `int` | @ref PVRDescrambleInfo::SetECMTime "SetECMTime" | @ref PVRDescrambleInfo::GetECMTime "GetECMTime" | *optional*
402 /// | **Hops** | `int` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional*
403 /// | **Descramble card system** | `std::string` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional*
404 /// | **Reader** | `std::string` | @ref PVRDescrambleInfo::SetReader "SetReader" | @ref PVRDescrambleInfo::GetReader "GetReader" | *optional*
405 /// | **From** | `std::string` | @ref PVRDescrambleInfo::SetFrom "SetFrom" | @ref PVRDescrambleInfo::GetFrom "GetFrom" | *optional*
406 /// | **Protocol** | `std::string` | @ref PVRDescrambleInfo::SetProtocol "SetProtocol" | @ref PVRDescrambleInfo::GetProtocol "GetProtocol" | *optional*
407 ///
408
409 /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo
410 ///@{
411
412 /// @brief **optional**\n
413 /// Packet identifier.
414 ///
415 /// Each table or elementary stream in a transport stream is identified by
416 /// a 13-bit packet identifier (PID).
417 ///
418 /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available
419 void SetPID(int pid) { m_cStructure->iPid = pid; }
420
421 /// @brief To get with @ref SetPID changed values
422 int GetPID() const { return m_cStructure->iPid; }
423
424 /// @brief **optional**\n
425 /// Conditional access identifier.
426 ///
427 /// Conditional access (abbreviated CA) or conditional access system (abbreviated CAS)
428 /// is the protection of content by requiring certain criteria to be met before granting
429 /// access to the content.
430 ///
431 /// Available CA system ID's listed here https://www.dvbservices.com/identifiers/ca_system_id.
432 ///
433 /// @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE if not available.
434 void SetCAID(int iCaid) { m_cStructure->iCaid = iCaid; }
435
436 /// @brief To get with @ref SetCAID changed values.
437 int GetCAID() const { return m_cStructure->iCaid; }
438
439 /// @brief **optional**\n
440 /// Provider-ID.
441 ///
442 /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available.
443 void SetProviderID(int provid) { m_cStructure->iProvid = provid; }
444
445 /// @brief To get with @ref SetProviderID changed values
446 int GetProviderID() const { return m_cStructure->iProvid; }
447
448 /// @brief **optional**\n
449 /// ECM time.
450 ///
451 /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available.
452 void SetECMTime(int ecmTime) { m_cStructure->iEcmTime = ecmTime; }
453
454 /// @brief To get with @ref SetECMTime changed values.
455 int GetECMTime() const { return m_cStructure->iEcmTime; }
456
457 /// @brief **optional**\n
458 /// Hops.
459 ///
460 /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available.
461 void SetHops(int hops) { m_cStructure->iHops = hops; }
462
463 /// @brief To get with @ref SetHops changed values.
464 int GetHops() const { return m_cStructure->iHops; }
465
466 /// @brief **optional**\n
467 /// Empty string if not available.
468 void SetCardSystem(const std::string& cardSystem)
469 {
470 strncpy(m_cStructure->strCardSystem, cardSystem.c_str(),
471 sizeof(m_cStructure->strCardSystem) - 1);
472 }
473
474 /// @brief To get with @ref SetCardSystem changed values.
475 std::string GetCardSystem() const { return m_cStructure->strCardSystem; }
476
477 /// @brief **optional**\n
478 /// Empty string if not available.
479 void SetReader(const std::string& reader)
480 {
481 strncpy(m_cStructure->strReader, reader.c_str(), sizeof(m_cStructure->strReader) - 1);
482 }
483
484 /// @brief To get with @ref SetReader changed values.
485 std::string GetReader() const { return m_cStructure->strReader; }
486
487 /// @brief **optional**\n
488 /// Empty string if not available.
489 void SetFrom(const std::string& from)
490 {
491 strncpy(m_cStructure->strFrom, from.c_str(), sizeof(m_cStructure->strFrom) - 1);
492 }
493
494 /// @brief To get with @ref SetFrom changed values.
495 std::string GetFrom() const { return m_cStructure->strFrom; }
496
497 /// @brief **optional**\n
498 /// Empty string if not available.
499 void SetProtocol(const std::string& protocol)
500 {
501 strncpy(m_cStructure->strProtocol, protocol.c_str(), sizeof(m_cStructure->strProtocol) - 1);
502 }
503
504 /// @brief To get with @ref SetProtocol changed values.
505 std::string GetProtocol() const { return m_cStructure->strProtocol; }
506 ///@}
507
508private:
509 PVRDescrambleInfo(const PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {}
510 PVRDescrambleInfo(PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {}
511};
512///@}
513//------------------------------------------------------------------------------
514
515} /* namespace addon */
516} /* namespace kodi */
517
518#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EDL.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EDL.h
deleted file mode 100644
index 34c7c41..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EDL.h
+++ /dev/null
@@ -1,90 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr/pvr_edl.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 8 - PVR Edit definition list (EDL)
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry class PVREDLEntry
25/// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry
26/// @brief **Edit definition list (EDL) entry**\n
27/// Time places and type of related fields.
28///
29/// This used within @ref cpp_kodi_addon_pvr_EPGTag "EPG" and
30/// @ref cpp_kodi_addon_pvr_Recordings "recordings".
31///
32/// ----------------------------------------------------------------------------
33///
34/// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help
35///
36///@{
37class PVREDLEntry : public CStructHdl<PVREDLEntry, PVR_EDL_ENTRY>
38{
39 friend class CInstancePVRClient;
40
41public:
42 /*! \cond PRIVATE */
43 PVREDLEntry() { memset(m_cStructure, 0, sizeof(PVR_EDL_ENTRY)); }
44 PVREDLEntry(const PVREDLEntry& type) : CStructHdl(type) {}
45 /*! \endcond */
46
47 /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help Value Help
48 /// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry
49 ///
50 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry :</b>
51 /// | Name | Type | Set call | Get call | Usage
52 /// |------|------|----------|----------|-----------
53 /// | **Start time** | `int64_t` | @ref PVREDLEntry::SetStart "SetStart" | @ref PVREDLEntry::GetStart "GetStart" | *required to set*
54 /// | **End time** | `int64_t` | @ref PVREDLEntry::SetEnd "SetEnd" | @ref PVREDLEntry::GetEnd "GetEnd" | *required to set*
55 /// | **Type** | @ref PVR_EDL_TYPE | @ref PVREDLEntry::SetType "SetType" | @ref PVREDLEntry::GetType "GetType" | *required to set*
56 ///
57
58 /// @addtogroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry
59 ///@{
60
61 /// @brief Start time in milliseconds.
62 void SetStart(int64_t start) { m_cStructure->start = start; }
63
64 /// @brief To get with @ref SetStart() changed values.
65 int64_t GetStart() const { return m_cStructure->start; }
66
67 /// @brief End time in milliseconds.
68 void SetEnd(int64_t end) { m_cStructure->end = end; }
69
70 /// @brief To get with @ref SetEnd() changed values.
71 int64_t GetEnd() const { return m_cStructure->end; }
72
73 /// @brief The with @ref PVR_EDL_TYPE used definition list type.
74 void SetType(PVR_EDL_TYPE type) { m_cStructure->type = type; }
75
76 /// @brief To get with @ref SetType() changed values.
77 PVR_EDL_TYPE GetType() const { return m_cStructure->type; }
78 ///@}
79
80private:
81 PVREDLEntry(const PVR_EDL_ENTRY* type) : CStructHdl(type) {}
82 PVREDLEntry(PVR_EDL_ENTRY* type) : CStructHdl(type) {}
83};
84///@}
85//------------------------------------------------------------------------------
86
87} /* namespace addon */
88} /* namespace kodi */
89
90#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EPG.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EPG.h
deleted file mode 100644
index e1fc04f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/EPG.h
+++ /dev/null
@@ -1,500 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 4 - PVR EPG
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag class PVREPGTag
25/// @ingroup cpp_kodi_addon_pvr_Defs_epg
26/// @brief **PVR add-on EPG data tag**\n
27/// Representation of an EPG event.
28///
29/// Herewith all EPG related data are saved in one class whereby the data can
30/// be exchanged with Kodi, or can also be used on the addon to save there.
31///
32/// See @ref cpp_kodi_addon_pvr_EPGTag "EPG methods" about usage.
33///
34/// ----------------------------------------------------------------------------
35///
36/// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help
37///
38///@{
39class PVREPGTag : public CStructHdl<PVREPGTag, EPG_TAG>
40{
41 friend class CInstancePVRClient;
42
43public:
44 /*! \cond PRIVATE */
45 PVREPGTag()
46 {
47 memset(m_cStructure, 0, sizeof(EPG_TAG));
48 m_cStructure->iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE;
49 m_cStructure->iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE;
50 m_cStructure->iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE;
51 }
52 PVREPGTag(const PVREPGTag& epg) : CStructHdl(epg)
53 {
54 m_title = epg.m_title;
55 m_plotOutline = epg.m_plotOutline;
56 m_plot = epg.m_plot;
57 m_originalTitle = epg.m_originalTitle;
58 m_cast = epg.m_cast;
59 m_director = epg.m_director;
60 m_writer = epg.m_writer;
61 m_IMDBNumber = epg.m_IMDBNumber;
62 m_iconPath = epg.m_iconPath;
63 m_genreDescription = epg.m_genreDescription;
64 m_episodeName = epg.m_episodeName;
65 m_seriesLink = epg.m_seriesLink;
66 m_firstAired = epg.m_firstAired;
67 }
68 /*! \endcond */
69
70
71 /// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help Value Help
72 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag
73 ///
74 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag :</b>
75 /// | Name | Type | Set call | Get call | Usage
76 /// |------|------|----------|----------|---------
77 /// | **Unique broadcast id** | `unsigned int` | @ref PVREPGTag::SetUniqueBroadcastId "SetUniqueBroadcastId" | @ref PVREPGTag::GetUniqueBroadcastId "GetUniqueBroadcastId" | *required to set*
78 /// | **Unique channel id** | `unsigned int` | @ref PVREPGTag::SetUniqueChannelId "SetUniqueChannelId" | @ref PVREPGTag::GetUniqueChannelId "GetUniqueChannelId" | *required to set*
79 /// | **Title** | `std::string` | @ref PVREPGTag::SetTitle "SetTitle" | @ref PVREPGTag::GetTitle "GetTitle" | *required to set*
80 /// | **Start time** | `time_t` | @ref PVREPGTag::SetStartTime "SetStartTime" | @ref PVREPGTag::GetStartTime "GetStartTime" | *required to set*
81 /// | **End time** | `time_t` | @ref PVREPGTag::SetEndTime "SetEndTime" | @ref PVREPGTag::GetEndTime "GetEndTime" | *required to set*
82 /// | **Plot outline** | `std::string` | @ref PVREPGTag::SetPlotOutline "SetPlotOutline" | @ref PVREPGTag::GetPlotOutline "GetPlotOutline" | *optional*
83 /// | **Plot** | `std::string` | @ref PVREPGTag::SetPlot "SetPlot" | @ref PVREPGTag::GetPlot "GetPlot" | *optional*
84 /// | **Original title** | `std::string` | @ref PVREPGTag::SetOriginalTitle "SetOriginalTitle" | @ref PVREPGTag::GetOriginalTitle "GetOriginalTitle" | *optional*
85 /// | **Cast** | `std::string` | @ref PVREPGTag::SetCast "SetCast" | @ref PVREPGTag::GetCast "GetCast" | *optional*
86 /// | **Director** | `std::string` | @ref PVREPGTag::SetDirector "SetDirector" | @ref PVREPGTag::GetDirector "GetDirector" | *optional*
87 /// | **Writer** | `std::string` | @ref PVREPGTag::SetWriter "SetWriter" | @ref PVREPGTag::GetWriter "GetWriter" | *optional*
88 /// | **Year** | `int` | @ref PVREPGTag::SetYear "SetYear" | @ref PVREPGTag::GetYear "GetYear" | *optional*
89 /// | **IMDB number** | `std::string` | @ref PVREPGTag::SetIMDBNumber "SetIMDBNumber" | @ref PVREPGTag::GetIMDBNumber "GetIMDBNumber" | *optional*
90 /// | **Icon path** | `std::string` | @ref PVREPGTag::SetIconPath "SetIconPath" | @ref PVREPGTag::GetIconPath "GetIconPath" | *optional*
91 /// | **Genre type** | `int` | @ref PVREPGTag::SetGenreType "SetGenreType" | @ref PVREPGTag::GetGenreType "GetGenreType" | *optional*
92 /// | **Genre sub type** | `int` | @ref PVREPGTag::SetGenreSubType "SetGenreSubType" | @ref PVREPGTag::GetGenreSubType "GetGenreSubType" | *optional*
93 /// | **Genre description** | `std::string` | @ref PVREPGTag::SetGenreDescription "SetGenreDescription" | @ref PVREPGTag::GetGenreDescription "GetGenreDescription" | *optional*
94 /// | **First aired** | `time_t` | @ref PVREPGTag::SetFirstAired "SetFirstAired" | @ref PVREPGTag::GetFirstAired "GetFirstAired" | *optional*
95 /// | **Parental rating** | `int` | @ref PVREPGTag::SetParentalRating "SetParentalRating" | @ref PVREPGTag::GetParentalRating "GetParentalRating" | *optional*
96 /// | **Star rating** | `int` | @ref PVREPGTag::SetStarRating "SetStarRating" | @ref PVREPGTag::GetStarRating "GetStarRating" | *optional*
97 /// | **Series number** | `int` | @ref PVREPGTag::SetSeriesNumber "SetSeriesNumber" | @ref PVREPGTag::GetSeriesNumber "GetSeriesNumber" | *optional*
98 /// | **Episode number** | `int` | @ref PVREPGTag::SetEpisodeNumber "SetEpisodeNumber" | @ref PVREPGTag::GetEpisodeNumber "GetEpisodeNumber" | *optional*
99 /// | **Episode part number** | `int` | @ref PVREPGTag::SetEpisodePartNumber "SetEpisodePartNumber" | @ref PVREPGTag::GetEpisodePartNumber "GetEpisodePartNumber" | *optional*
100 /// | **Episode name** | `std::string` | @ref PVREPGTag::SetEpisodeName "SetEpisodeName" | @ref PVREPGTag::GetEpisodeName "GetEpisodeName" | *optional*
101 /// | **Flags** | `unsigned int` | @ref PVREPGTag::SetFlags "SetFlags" | @ref PVREPGTag::GetFlags "GetFlags" | *optional*
102 /// | **Series link** | `std::string` | @ref PVREPGTag::SetSeriesLink "SetSeriesLink" | @ref PVREPGTag::GetSeriesLink "GetSeriesLink" | *optional*
103 ///
104
105 /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag
106 ///@{
107
108 /// @brief **required**\n
109 /// Identifier for this event. Event uids must be unique for a channel. Valid uids must be greater than @ref EPG_TAG_INVALID_UID.
110 void SetUniqueBroadcastId(unsigned int uniqueBroadcastId)
111 {
112 m_cStructure->iUniqueBroadcastId = uniqueBroadcastId;
113 }
114
115 /// @brief To get with @ref SetUniqueBroadcastId changed values.
116 unsigned int GetUniqueBroadcastId() const { return m_cStructure->iUniqueBroadcastId; }
117
118 /// @brief **required**\n
119 /// Unique identifier of the channel this event belongs to.
120 void SetUniqueChannelId(unsigned int uniqueChannelId)
121 {
122 m_cStructure->iUniqueChannelId = uniqueChannelId;
123 }
124
125 /// @brief To get with @ref SetUniqueChannelId changed values
126 unsigned int GetUniqueChannelId() const { return m_cStructure->iUniqueChannelId; }
127
128 /// @brief **required**\n
129 /// This event's title.
130 void SetTitle(const std::string& title) { m_title = title; }
131
132 /// @brief To get with @ref SetTitle changed values.
133 std::string GetTitle() const { return m_title; }
134
135 /// @brief **required**\n
136 /// Start time in UTC.
137 ///
138 /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC.
139 void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; }
140
141 /// @brief To get with @ref SetStartTime changed values.
142 time_t GetStartTime() const { return m_cStructure->startTime; }
143
144 /// @brief **required**\n
145 /// End time in UTC.
146 ///
147 /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC.
148 void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; }
149
150 /// @brief To get with @ref SetEndTime changed values.
151 time_t GetEndTime() const { return m_cStructure->endTime; }
152
153 /// @brief **optional**\n
154 /// Plot outline name.
155 void SetPlotOutline(const std::string& plotOutline) { m_plotOutline = plotOutline; }
156
157 /// @brief To get with @ref SetPlotOutline changed values.
158 std::string GetPlotOutline() const { return m_plotOutline; }
159
160 /// @brief **optional**\n
161 /// Plot name.
162 void SetPlot(const std::string& plot) { m_plot = plot; }
163
164 /// @brief To get with @ref GetPlot changed values.
165 std::string GetPlot() const { return m_plot; }
166
167 /// @brief **optional**\n
168 /// Original title.
169 void SetOriginalTitle(const std::string& originalTitle) { m_originalTitle = originalTitle; }
170
171 /// @brief To get with @ref SetOriginalTitle changed values
172 std::string GetOriginalTitle() const { return m_originalTitle; }
173
174 /// @brief **optional**\n
175 /// Cast name(s).
176 ///
177 /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons.
178 void SetCast(const std::string& cast) { m_cast = cast; }
179
180 /// @brief To get with @ref SetCast changed values
181 std::string GetCast() const { return m_cast; }
182
183 /// @brief **optional**\n
184 /// Director name(s).
185 ///
186 /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons.
187 void SetDirector(const std::string& director) { m_director = director; }
188
189 /// @brief To get with @ref SetDirector changed values.
190 std::string GetDirector() const { return m_director; }
191
192 /// @brief **optional**\n
193 /// Writer name(s).
194 ///
195 /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons.
196 void SetWriter(const std::string& writer) { m_writer = writer; }
197
198 /// @brief To get with @ref SetDirector changed values
199 std::string GetWriter() const { return m_writer; }
200
201 /// @brief **optional**\n
202 /// Year.
203 void SetYear(int year) { m_cStructure->iYear = year; }
204
205 /// @brief To get with @ref SetYear changed values.
206 int GetYear() const { return m_cStructure->iYear; }
207
208 /// @brief **optional**\n
209 /// [IMDB](https://en.wikipedia.org/wiki/IMDb) identification number.
210 void SetIMDBNumber(const std::string& IMDBNumber) { m_IMDBNumber = IMDBNumber; }
211
212 /// @brief To get with @ref SetIMDBNumber changed values.
213 std::string GetIMDBNumber() const { return m_IMDBNumber; }
214
215 /// @brief **optional**\n
216 /// Icon path.
217 void SetIconPath(const std::string& iconPath) { m_iconPath = iconPath; }
218
219 /// @brief To get with @ref SetIconPath changed values.
220 std::string GetIconPath() const { return m_iconPath; }
221
222 /// @brief **optional**\n
223 /// Genre type.
224 ///
225 /// --------------------------------------------------------------------------
226 ///
227 /// @copydetails EPG_EVENT_CONTENTMASK
228 ///
229 /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription.
230 ///
231 /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
232 /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here
233 /// with backend value.
234 ///
235 ///
236 /// --------------------------------------------------------------------------
237 ///
238 /// **Example 1:**
239 /// ~~~~~~~~~~~~~{.cpp}
240 /// kodi::addon::PVREPGTag tag;
241 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA);
242 /// ~~~~~~~~~~~~~
243 ///
244 /// --------------------------------------------------------------------------
245 ///
246 /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types):
247 /// ~~~~~~~~~~~~~{.cpp}
248 /// kodi::addon::PVREPGTag tag;
249 /// tag.SetGenreType(EPG_GENRE_USE_STRING);
250 /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language.
251 /// ~~~~~~~~~~~~~
252 ///
253 void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; }
254
255 /// @brief To get with @ref SetGenreType changed values
256 int GetGenreType() const { return m_cStructure->iGenreType; }
257
258 /// @brief **optional**\n
259 /// Genre sub type.
260 ///
261 /// @copydetails EPG_EVENT_CONTENTMASK
262 ///
263 /// Subtypes groups related to set by @ref SetGenreType:
264 /// | Main genre type | List with available sub genre types
265 /// |-----------------|-----------------------------------------
266 /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0
267 /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA
268 /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS
269 /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW
270 /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS
271 /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH
272 /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE
273 /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE
274 /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS
275 /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE
276 /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES
277 /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL
278 /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you
279 /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given.
280 ///
281 /// --------------------------------------------------------------------------
282 ///
283 /// **Example:**
284 /// ~~~~~~~~~~~~~{.cpp}
285 /// kodi::addon::PVREPGTag tag;
286 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE);
287 /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ);
288 /// ~~~~~~~~~~~~~
289 ///
290 void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; }
291
292 /// @brief To get with @ref SetGenreSubType changed values.
293 int GetGenreSubType() const { return m_cStructure->iGenreSubType; }
294
295 /// @brief **optional**\n genre. Will be used only when genreType == @ref EPG_GENRE_USE_STRING
296 /// or genreSubType == @ref EPG_GENRE_USE_STRING.
297 ///
298 /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres.
299 ///
300 /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
301 /// conform genre types or something special.
302 ///
303 /// --------------------------------------------------------------------------
304 ///
305 /// **Example:**
306 /// ~~~~~~~~~~~~~{.cpp}
307 /// kodi::addon::PVREPGTag tag;
308 /// tag.SetGenreType(EPG_GENRE_USE_STRING);
309 /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller");
310 /// ~~~~~~~~~~~~~
311 ///
312 void SetGenreDescription(const std::string& genreDescription)
313 {
314 m_genreDescription = genreDescription;
315 }
316
317 /// @brief To get with @ref SetGenreDescription changed values.
318 std::string GetGenreDescription() const { return m_genreDescription; }
319
320 /// @brief **optional**\n
321 /// First aired in UTC.
322 void SetFirstAired(const std::string& firstAired) { m_firstAired = firstAired; }
323
324 /// @brief To get with @ref SetFirstAired changed values.
325 std::string GetFirstAired() const { return m_firstAired; }
326
327 /// @brief **optional**\n
328 /// Parental rating.
329 void SetParentalRating(int parentalRating) { m_cStructure->iParentalRating = parentalRating; }
330
331 /// @brief To get with @ref SetParentalRatinge changed values.
332 int GetParentalRating() const { return m_cStructure->iParentalRating; }
333
334 /// @brief **optional**\n
335 /// Star rating.
336 void SetStarRating(int starRating) { m_cStructure->iStarRating = starRating; }
337
338 /// @brief To get with @ref SetStarRating changed values.
339 int GetStarRating() const { return m_cStructure->iStarRating; }
340
341 /// @brief **optional**\n
342 /// Series number.
343 void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; }
344
345 /// @brief To get with @ref SetSeriesNumber changed values.
346 int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; }
347
348 /// @brief **optional**\n
349 /// Episode number.
350 void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; }
351
352 /// @brief To get with @ref SetEpisodeNumber changed values.
353 int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; }
354
355 /// @brief **optional**\n
356 /// Episode part number.
357 void SetEpisodePartNumber(int episodePartNumber)
358 {
359 m_cStructure->iEpisodePartNumber = episodePartNumber;
360 }
361
362 /// @brief To get with @ref SetEpisodePartNumber changed values.
363 int GetEpisodePartNumber() const { return m_cStructure->iEpisodePartNumber; }
364
365 /// @brief **optional**\n
366 /// Episode name.
367 void SetEpisodeName(const std::string& episodeName) { m_episodeName = episodeName; }
368
369 /// @brief To get with @ref SetEpisodeName changed values.
370 std::string GetEpisodeName() const { return m_episodeName; }
371
372 /// @brief **optional**\n
373 /// Bit field of independent flags associated with the EPG entry.
374 ///
375 /// See @ref cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG for available bit flags.
376 ///
377 /// --------------------------------------------------------------------------
378 ///
379 /// @copydetails cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG
380 ///
381 void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; }
382
383 /// @brief To get with @ref SetFlags changed values.
384 unsigned int GetFlags() const { return m_cStructure->iFlags; }
385
386 /// @brief **optional**\n
387 /// Series link for this event.
388 void SetSeriesLink(const std::string& seriesLink) { m_seriesLink = seriesLink; }
389
390 /// @brief To get with @ref SetSeriesLink changed values.
391 std::string GetSeriesLink() const { return m_seriesLink; }
392
393 ///@}
394
395 // Internal used, as this have own memory for strings and to translate them to "C"
396 EPG_TAG* GetTag() const
397 {
398 m_cStructure->strTitle = m_title.c_str();
399 m_cStructure->strPlotOutline = m_plotOutline.c_str();
400 m_cStructure->strPlot = m_plot.c_str();
401 m_cStructure->strOriginalTitle = m_originalTitle.c_str();
402 m_cStructure->strCast = m_cast.c_str();
403 m_cStructure->strDirector = m_director.c_str();
404 m_cStructure->strWriter = m_writer.c_str();
405 m_cStructure->strIMDBNumber = m_IMDBNumber.c_str();
406 m_cStructure->strIconPath = m_iconPath.c_str();
407 m_cStructure->strGenreDescription = m_genreDescription.c_str();
408 m_cStructure->strEpisodeName = m_episodeName.c_str();
409 m_cStructure->strSeriesLink = m_seriesLink.c_str();
410 m_cStructure->strFirstAired = m_firstAired.c_str();
411
412 return m_cStructure;
413 }
414
415private:
416 PVREPGTag(const EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); }
417 PVREPGTag(EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); }
418
419 const PVREPGTag& operator=(const PVREPGTag& right);
420 const PVREPGTag& operator=(const EPG_TAG& right);
421 operator EPG_TAG*();
422
423 std::string m_title;
424 std::string m_plotOutline;
425 std::string m_plot;
426 std::string m_originalTitle;
427 std::string m_cast;
428 std::string m_director;
429 std::string m_writer;
430 std::string m_IMDBNumber;
431 std::string m_episodeName;
432 std::string m_iconPath;
433 std::string m_seriesLink;
434 std::string m_genreDescription;
435 std::string m_firstAired;
436
437 void SetData(const EPG_TAG* tag)
438 {
439 m_title = tag->strTitle == nullptr ? "" : tag->strTitle;
440 m_plotOutline = tag->strPlotOutline == nullptr ? "" : tag->strPlotOutline;
441 m_plot = tag->strPlot == nullptr ? "" : tag->strPlot;
442 m_originalTitle = tag->strOriginalTitle == nullptr ? "" : tag->strOriginalTitle;
443 m_cast = tag->strCast == nullptr ? "" : tag->strCast;
444 m_director = tag->strDirector == nullptr ? "" : tag->strDirector;
445 m_writer = tag->strWriter == nullptr ? "" : tag->strWriter;
446 m_IMDBNumber = tag->strIMDBNumber == nullptr ? "" : tag->strIMDBNumber;
447 m_iconPath = tag->strIconPath == nullptr ? "" : tag->strIconPath;
448 m_genreDescription = tag->strGenreDescription == nullptr ? "" : tag->strGenreDescription;
449 m_episodeName = tag->strEpisodeName == nullptr ? "" : tag->strEpisodeName;
450 m_seriesLink = tag->strSeriesLink == nullptr ? "" : tag->strSeriesLink;
451 m_firstAired = tag->strFirstAired == nullptr ? "" : tag->strFirstAired;
452 }
453};
454///@}
455//------------------------------------------------------------------------------
456
457//==============================================================================
458/// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet class PVREPGTagsResultSet
459/// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag
460/// @brief **PVR add-on EPG entry transfer class**\n
461/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetEPGForChannel().
462///
463/// @note This becomes only be used on addon call above, not usable outside on
464/// addon itself.
465///@{
466class PVREPGTagsResultSet
467{
468public:
469 /*! \cond PRIVATE */
470 PVREPGTagsResultSet() = delete;
471 PVREPGTagsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
472 : m_instance(instance), m_handle(handle)
473 {
474 }
475 /*! \endcond */
476
477 /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet
478 ///@{
479
480 /// @brief To add and give content from addon to Kodi on related call.
481 ///
482 /// @param[in] tag The to transferred data.
483 void Add(const kodi::addon::PVREPGTag& tag)
484 {
485 m_instance->toKodi->TransferEpgEntry(m_instance->toKodi->kodiInstance, m_handle, tag.GetTag());
486 }
487
488 ///@}
489
490private:
491 const AddonInstance_PVR* m_instance = nullptr;
492 const ADDON_HANDLE m_handle;
493};
494///@}
495//------------------------------------------------------------------------------
496
497} /* namespace addon */
498} /* namespace kodi */
499
500#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/General.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/General.h
deleted file mode 100644
index c7977c2..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/General.h
+++ /dev/null
@@ -1,511 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr/pvr_general.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 1 - General PVR
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue class PVRTypeIntValue
25/// @ingroup cpp_kodi_addon_pvr_Defs_General
26/// @brief **PVR add-on type value**\n
27/// Representation of a <b>`<int, std::string>`</b> event related value.
28///
29/// ----------------------------------------------------------------------------
30///
31/// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
32///
33///@{
34class PVRTypeIntValue : public CStructHdl<PVRTypeIntValue, PVR_ATTRIBUTE_INT_VALUE>
35{
36 friend class CInstancePVRClient;
37
38public:
39 /*! \cond PRIVATE */
40 PVRTypeIntValue(const PVRTypeIntValue& data) : CStructHdl(data) {}
41 /*! \endcond */
42
43 /// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help Value Help
44 /// @ingroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue
45 ///
46 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue :</b>
47 /// | Name | Type | Set call | Get call
48 /// |------|------|----------|----------
49 /// | **Value** | `int` | @ref PVRTypeIntValue::SetValue "SetValue" | @ref PVRTypeIntValue::GetValue "GetValue"
50 /// | **Description** | `std::string` | @ref PVRTypeIntValue::SetDescription "SetDescription" | @ref PVRTypeIntValue::GetDescription "GetDescription"
51 ///
52 /// @remark Further can there be used his class constructor to set values.
53
54 /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue
55 ///@{
56
57 /// @brief Default class constructor.
58 ///
59 /// @note Values must be set afterwards.
60 PVRTypeIntValue() = default;
61
62 /// @brief Class constructor with integrated value set.
63 ///
64 /// @param[in] value Type identification value
65 /// @param[in] description Type description text
66 PVRTypeIntValue(int value, const std::string& description)
67 {
68 SetValue(value);
69 SetDescription(description);
70 }
71
72 /// @brief To set with the identification value.
73 void SetValue(int value) { m_cStructure->iValue = value; }
74
75 /// @brief To get with the identification value.
76 int GetValue() const { return m_cStructure->iValue; }
77
78 /// @brief To set with the description text of the value.
79 void SetDescription(const std::string& description)
80 {
81 strncpy(m_cStructure->strDescription, description.c_str(),
82 sizeof(m_cStructure->strDescription) - 1);
83 }
84
85 /// @brief To get with the description text of the value.
86 std::string GetDescription() const { return m_cStructure->strDescription; }
87 ///@}
88
89private:
90 PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {}
91 PVRTypeIntValue(PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {}
92};
93///@}
94//------------------------------------------------------------------------------
95
96//==============================================================================
97/// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities class PVRCapabilities
98/// @ingroup cpp_kodi_addon_pvr_Defs_General
99/// @brief **PVR add-on capabilities**\n
100/// This class is needed to tell Kodi which options are supported on the addon.
101///
102/// If a capability is set to **true**, then the corresponding methods from
103/// @ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient" need to be
104/// implemented.
105///
106/// As default them all set to **false**.
107///
108/// Used on @ref kodi::addon::CInstancePVRClient::GetCapabilities().
109///
110/// ----------------------------------------------------------------------------
111///
112/// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help
113///
114///@{
115class PVRCapabilities
116{
117 friend class CInstancePVRClient;
118
119public:
120 /*! \cond PRIVATE */
121 explicit PVRCapabilities() = delete;
122 /*! \endcond */
123
124 /// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help Value Help
125 /// @ingroup cpp_kodi_addon_pvr_Defs_PVRCapabilities
126 /// ----------------------------------------------------------------------------
127 ///
128 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities :</b>
129 /// | Name | Type | Set call | Get call
130 /// |------|------|----------|----------
131 /// | **Supports EPG** | `boolean` | @ref PVRCapabilities::SetSupportsEPG "SetSupportsEPG" | @ref PVRCapabilities::GetSupportsEPG "GetSupportsEPG"
132 /// | **Supports EPG EDL** | `boolean` | @ref PVRCapabilities::SetSupportsEPGEdl "SetSupportsEPGEdl" | @ref PVRCapabilities::GetSupportsEPGEdl "GetSupportsEPGEdl"
133 /// | **Supports TV** | `boolean` | @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" | @ref PVRCapabilities::GetSupportsTV "GetSupportsTV"
134 /// | **Supports radio** | `boolean` | @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" | @ref PVRCapabilities::GetSupportsRadio "GetSupportsRadio"
135 /// | **Supports recordings** | `boolean` | @ref PVRCapabilities::SetSupportsRecordings "SetSupportsRecordings" | @ref PVRCapabilities::GetSupportsRecordings "GetSupportsRecordings"
136 /// | **Supports recordings undelete** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" | @ref PVRCapabilities::GetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete"
137 /// | **Supports timers** | `boolean` | @ref PVRCapabilities::SetSupportsTimers "SetSupportsTimers" | @ref PVRCapabilities::GetSupportsTimers "GetSupportsTimers"
138 /// | **Supports channel groups** | `boolean` | @ref PVRCapabilities::SetSupportsChannelGroups "SetSupportsChannelGroups" | @ref PVRCapabilities::GetSupportsChannelGroups "GetSupportsChannelGroups"
139 /// | **Supports channel scan** | `boolean` | @ref PVRCapabilities::SetSupportsChannelScan "SetSupportsChannelScan" | @ref PVRCapabilities::GetSupportsChannelScan "GetSupportsChannelScan"
140 /// | **Supports channel settings** | `boolean` | @ref PVRCapabilities::SetSupportsChannelSettings "SetSupportsChannelSettings" | @ref PVRCapabilities::GetSupportsChannelSettings "GetSupportsChannelSettings"
141 /// | **Handles input stream** | `boolean` | @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" | @ref PVRCapabilities::GetHandlesInputStream "GetHandlesInputStream"
142 /// | **Handles demuxing** | `boolean` | @ref PVRCapabilities::SetHandlesDemuxing "SetHandlesDemuxing" | @ref PVRCapabilities::GetHandlesDemuxing "GetHandlesDemuxing"
143 /// | **Supports recording play count** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingPlayCount "SetSupportsRecordingPlayCount" | @ref PVRCapabilities::GetSupportsRecordingPlayCount "GetSupportsRecordingPlayCount"
144 /// | **Supports last played position** | `boolean` | @ref PVRCapabilities::SetSupportsLastPlayedPosition "SetSupportsLastPlayedPosition" | @ref PVRCapabilities::GetSupportsLastPlayedPosition "GetSupportsLastPlayedPosition"
145 /// | **Supports recording EDL** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingEdl "SetSupportsRecordingEdl" | @ref PVRCapabilities::GetSupportsRecordingEdl "GetSupportsRecordingEdl"
146 /// | **Supports recordings rename** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsRename "SetSupportsRecordingsRename" | @ref PVRCapabilities::GetSupportsRecordingsRename "GetSupportsRecordingsRename"
147 /// | **Supports recordings lifetime change** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "SetSupportsRecordingsLifetimeChange" | @ref PVRCapabilities::GetSupportsRecordingsLifetimeChange "GetSupportsRecordingsLifetimeChange"
148 /// | **Supports descramble info** | `boolean` | @ref PVRCapabilities::SetSupportsDescrambleInfo "SetSupportsDescrambleInfo" | @ref PVRCapabilities::GetSupportsDescrambleInfo "GetSupportsDescrambleInfo"
149 /// | **Supports async EPG transfer** | `boolean` | @ref PVRCapabilities::SetSupportsAsyncEPGTransfer "SetSupportsAsyncEPGTransfer" | @ref PVRCapabilities::GetSupportsAsyncEPGTransfer "GetSupportsAsyncEPGTransfer"
150 /// | **Supports recording size** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingSize "SetSupportsRecordingSize" | @ref PVRCapabilities::GetSupportsRecordingSize "GetSupportsRecordingSize"
151 /// | **Recordings lifetime values** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRCapabilities::SetRecordingsLifetimeValues "SetRecordingsLifetimeValues" | @ref PVRCapabilities::GetRecordingsLifetimeValues "GetRecordingsLifetimeValues"
152 ///
153 /// @warning This class can not be used outside of @ref kodi::addon::CInstancePVRClient::GetCapabilities()
154 ///
155
156 /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRCapabilities
157 ///@{
158
159 /// @brief Set **true** if the add-on provides EPG information.
160 void SetSupportsEPG(bool supportsEPG) { m_capabilities->bSupportsEPG = supportsEPG; }
161
162 /// @brief To get with @ref SetSupportsEPG changed values.
163 bool GetSupportsEPG() const { return m_capabilities->bSupportsEPG; }
164
165 /// @brief Set **true** if the backend supports retrieving an edit decision
166 /// list for an EPG tag.
167 void SetSupportsEPGEdl(bool supportsEPGEdl) { m_capabilities->bSupportsEPGEdl = supportsEPGEdl; }
168
169 /// @brief To get with @ref SetSupportsEPGEdl changed values.
170 bool GetSupportsEPGEdl() const { return m_capabilities->bSupportsEPGEdl; }
171
172 /// @brief Set **true** if this add-on provides TV channels.
173 void SetSupportsTV(bool supportsTV) { m_capabilities->bSupportsTV = supportsTV; }
174
175 /// @brief To get with @ref SetSupportsTV changed values.
176 bool GetSupportsTV() const { return m_capabilities->bSupportsTV; }
177
178 /// @brief Set **true** if this add-on provides TV channels.
179 void SetSupportsRadio(bool supportsRadio) { m_capabilities->bSupportsRadio = supportsRadio; }
180
181 /// @brief To get with @ref SetSupportsRadio changed values.
182 bool GetSupportsRadio() const { return m_capabilities->bSupportsRadio; }
183
184 /// @brief **true** if this add-on supports playback of recordings stored on
185 /// the backend.
186 void SetSupportsRecordings(bool supportsRecordings)
187 {
188 m_capabilities->bSupportsRecordings = supportsRecordings;
189 }
190
191 /// @brief To get with @ref SetSupportsRecordings changed values.
192 bool GetSupportsRecordings() const { return m_capabilities->bSupportsRecordings; }
193
194 /// @brief Set **true** if this add-on supports undelete of recordings stored
195 /// on the backend.
196 void SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete)
197 {
198 m_capabilities->bSupportsRecordingsUndelete = supportsRecordingsUndelete;
199 }
200
201 /// @brief To get with @ref SetSupportsRecordings changed values.
202 bool GetSupportsRecordingsUndelete() const { return m_capabilities->bSupportsRecordingsUndelete; }
203
204 /// @brief Set **true** if this add-on supports the creation and editing of
205 /// timers.
206 void SetSupportsTimers(bool supportsTimers) { m_capabilities->bSupportsTimers = supportsTimers; }
207
208 /// @brief To get with @ref SetSupportsTimers changed values.
209 bool GetSupportsTimers() const { return m_capabilities->bSupportsTimers; }
210
211 /// @brief Set **true** if this add-on supports channel groups.
212 ///
213 /// It use the following functions:
214 /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupsAmount()
215 /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroups()
216 /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers()
217 void SetSupportsChannelGroups(bool supportsChannelGroups)
218 {
219 m_capabilities->bSupportsChannelGroups = supportsChannelGroups;
220 }
221
222 /// @brief To get with @ref SetSupportsChannelGroups changed values.
223 bool GetSupportsChannelGroups() const { return m_capabilities->bSupportsChannelGroups; }
224
225 /// @brief Set **true** if this add-on support scanning for new channels on
226 /// the backend.
227 ///
228 /// It use the following function:
229 /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelScan()
230 void SetSupportsChannelScan(bool supportsChannelScan)
231 {
232 m_capabilities->bSupportsChannelScan = supportsChannelScan;
233 }
234
235 /// @brief To get with @ref SetSupportsChannelScan changed values.
236 bool GetSupportsChannelScan() const { return m_capabilities->bSupportsChannelScan; }
237
238 /// @brief Set **true** if this add-on supports channel edit.
239 ///
240 /// It use the following functions:
241 /// - @ref kodi::addon::CInstancePVRClient::DeleteChannel()
242 /// - @ref kodi::addon::CInstancePVRClient::RenameChannel()
243 /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelSettings()
244 /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelAdd()
245 void SetSupportsChannelSettings(bool supportsChannelSettings)
246 {
247 m_capabilities->bSupportsChannelSettings = supportsChannelSettings;
248 }
249
250 /// @brief To get with @ref SetSupportsChannelSettings changed values.
251 bool GetSupportsChannelSettings() const { return m_capabilities->bSupportsChannelSettings; }
252
253 /// @brief Set **true** if this add-on provides an input stream. false if Kodi
254 /// handles the stream.
255 void SetHandlesInputStream(bool handlesInputStream)
256 {
257 m_capabilities->bHandlesInputStream = handlesInputStream;
258 }
259
260 /// @brief To get with @ref SetHandlesInputStream changed values.
261 bool GetHandlesInputStream() const { return m_capabilities->bHandlesInputStream; }
262
263 /// @brief Set **true** if this add-on demultiplexes packets.
264 void SetHandlesDemuxing(bool handlesDemuxing)
265 {
266 m_capabilities->bHandlesDemuxing = handlesDemuxing;
267 }
268
269 /// @brief To get with @ref SetHandlesDemuxing changed values.
270 bool GetHandlesDemuxing() const { return m_capabilities->bHandlesDemuxing; }
271
272 /// @brief Set **true** if the backend supports play count for recordings.
273 void SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount)
274 {
275 m_capabilities->bSupportsRecordingPlayCount = supportsRecordingPlayCount;
276 }
277
278 /// @brief To get with @ref SetSupportsRecordingPlayCount changed values.
279 bool GetSupportsRecordingPlayCount() const { return m_capabilities->bSupportsRecordingPlayCount; }
280
281 /// @brief Set **true** if the backend supports store/retrieve of last played
282 /// position for recordings.
283 void SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition)
284 {
285 m_capabilities->bSupportsLastPlayedPosition = supportsLastPlayedPosition;
286 }
287
288 /// @brief To get with @ref SetSupportsLastPlayedPosition changed values.
289 bool GetSupportsLastPlayedPosition() const { return m_capabilities->bSupportsLastPlayedPosition; }
290
291 /// @brief Set **true** if the backend supports retrieving an edit decision
292 /// list for recordings.
293 void SetSupportsRecordingEdl(bool supportsRecordingEdl)
294 {
295 m_capabilities->bSupportsRecordingEdl = supportsRecordingEdl;
296 }
297
298 /// @brief To get with @ref SetSupportsRecordingEdl changed values.
299 bool GetSupportsRecordingEdl() const { return m_capabilities->bSupportsRecordingEdl; }
300
301 /// @brief Set **true** if the backend supports renaming recordings.
302 void SetSupportsRecordingsRename(bool supportsRecordingsRename)
303 {
304 m_capabilities->bSupportsRecordingsRename = supportsRecordingsRename;
305 }
306
307 /// @brief To get with @ref SetSupportsRecordingsRename changed values.
308 bool GetSupportsRecordingsRename() const { return m_capabilities->bSupportsRecordingsRename; }
309
310 /// @brief Set **true** if the backend supports changing lifetime for
311 /// recordings.
312 void SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange)
313 {
314 m_capabilities->bSupportsRecordingsLifetimeChange = supportsRecordingsLifetimeChange;
315 }
316
317 /// @brief To get with @ref SetSupportsRecordingsLifetimeChange changed
318 /// values.
319 bool GetSupportsRecordingsLifetimeChange() const
320 {
321 return m_capabilities->bSupportsRecordingsLifetimeChange;
322 }
323
324 /// @brief Set **true** if the backend supports descramble information for
325 /// playing channels.
326 void SetSupportsDescrambleInfo(bool supportsDescrambleInfo)
327 {
328 m_capabilities->bSupportsDescrambleInfo = supportsDescrambleInfo;
329 }
330
331 /// @brief To get with @ref SetSupportsDescrambleInfo changed values.
332 bool GetSupportsDescrambleInfo() const { return m_capabilities->bSupportsDescrambleInfo; }
333
334 /// @brief Set **true** if this addon-on supports asynchronous transfer of epg
335 /// events to Kodi using the callback function
336 /// @ref kodi::addon::CInstancePVRClient::EpgEventStateChange().
337 void SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer)
338 {
339 m_capabilities->bSupportsAsyncEPGTransfer = supportsAsyncEPGTransfer;
340 }
341
342 /// @brief To get with @ref SetSupportsAsyncEPGTransfer changed values.
343 bool GetSupportsAsyncEPGTransfer() const { return m_capabilities->bSupportsAsyncEPGTransfer; }
344
345 /// @brief Set **true** if this addon-on supports retrieving size of recordings.
346 void SetSupportsRecordingSize(bool supportsRecordingSize)
347 {
348 m_capabilities->bSupportsRecordingSize = supportsRecordingSize;
349 }
350
351 /// @brief To get with @ref SetSupportsRecordingSize changed values.
352 bool GetSupportsRecordingSize() const { return m_capabilities->bSupportsRecordingSize; }
353
354 /// @brief **optional**\n
355 /// Set array containing the possible values for @ref PVRRecording::SetLifetime().
356 ///
357 /// --------------------------------------------------------------------------
358 ///
359 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
360 void SetRecordingsLifetimeValues(
361 const std::vector<PVRTypeIntValue>& recordingsLifetimeValues)
362 {
363 m_capabilities->iRecordingsLifetimesSize = 0;
364 for (unsigned int i = 0; i < recordingsLifetimeValues.size() &&
365 i < sizeof(m_capabilities->recordingsLifetimeValues);
366 ++i)
367 {
368 m_capabilities->recordingsLifetimeValues[i].iValue =
369 recordingsLifetimeValues[i].GetCStructure()->iValue;
370 strncpy(m_capabilities->recordingsLifetimeValues[i].strDescription,
371 recordingsLifetimeValues[i].GetCStructure()->strDescription,
372 sizeof(m_capabilities->recordingsLifetimeValues[i].strDescription) - 1);
373 ++m_capabilities->iRecordingsLifetimesSize;
374 }
375 }
376
377 /// @brief To get with @ref SetRecordingsLifetimeValues changed values.
378 std::vector<PVRTypeIntValue> GetRecordingsLifetimeValues() const
379 {
380 std::vector<PVRTypeIntValue> recordingsLifetimeValues;
381 for (unsigned int i = 0; i < m_capabilities->iRecordingsLifetimesSize; ++i)
382 recordingsLifetimeValues.emplace_back(
383 m_capabilities->recordingsLifetimeValues[i].iValue,
384 m_capabilities->recordingsLifetimeValues[i].strDescription);
385 return recordingsLifetimeValues;
386 }
387 ///@}
388
389private:
390 PVRCapabilities(PVR_ADDON_CAPABILITIES* capabilities) : m_capabilities(capabilities) {}
391
392 PVR_ADDON_CAPABILITIES* m_capabilities;
393};
394///@}
395//------------------------------------------------------------------------------
396
397//==============================================================================
398/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty class PVRStreamProperty
399/// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream
400/// @brief **PVR stream property value handler**\n
401/// To set for Kodi wanted stream properties.
402///
403/// ----------------------------------------------------------------------------
404///
405/// @copydetails cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help
406///
407///---------------------------------------------------------------------------
408///
409/// **Example:**
410/// ~~~~~~~~~~~~~{.cpp}
411/// ...
412///
413/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
414/// std::vector<kodi::addon::PVRStreamProperty>& properties)
415/// {
416/// ...
417/// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
418/// return PVR_ERROR_NO_ERROR;
419/// }
420///
421/// ...
422/// ~~~~~~~~~~~~~
423///
424///
425/// **Example 2:**
426/// ~~~~~~~~~~~~~{.cpp}
427/// ...
428///
429/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
430/// std::vector<kodi::addon::PVRStreamProperty>& properties)
431/// {
432/// ...
433/// kodi::addon::PVRStreamProperty property;
434/// property.SetName(PVR_STREAM_PROPERTY_INPUTSTREAM);
435/// property.SetValue("inputstream.adaptive");
436/// properties.emplace_back(property);
437/// return PVR_ERROR_NO_ERROR;
438/// }
439///
440/// ...
441/// ~~~~~~~~~~~~~
442///
443///@{
444class PVRStreamProperty : public CStructHdl<PVRStreamProperty, PVR_NAMED_VALUE>
445{
446 friend class CInstancePVRClient;
447
448public:
449 /*! \cond PRIVATE */
450 PVRStreamProperty(const PVRStreamProperty& data) : CStructHdl(data) {}
451 /*! \endcond */
452
453 /// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help Value Help
454 /// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty
455 ///
456 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty :</b>
457 /// | Name | Type | Set call | Get call
458 /// |------|------|----------|----------
459 /// | **Name** | `int` | @ref PVRStreamProperty::SetValue "SetName" | @ref PVRStreamProperty::GetName "GetName"
460 /// | **Value** | `std::string` | @ref PVRStreamProperty::SetValue "SetValue" | @ref PVRStreamProperty::GetValue "GetValue"
461 ///
462 /// @remark Further can there be used his class constructor to set values.
463
464 /// @addtogroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty
465 ///@{
466
467 /// @brief Default class constructor.
468 ///
469 /// @note Values must be set afterwards.
470 PVRStreamProperty() = default;
471
472 /// @brief Class constructor with integrated value set.
473 ///
474 /// @param[in] name Type identification
475 /// @param[in] value Type used property value
476 PVRStreamProperty(const std::string& name, const std::string& value)
477 {
478 SetName(name);
479 SetValue(value);
480 }
481
482 /// @brief To set with the identification name.
483 void SetName(const std::string& name)
484 {
485 strncpy(m_cStructure->strName, name.c_str(), sizeof(m_cStructure->strName) - 1);
486 }
487
488 /// @brief To get with the identification name.
489 std::string GetName() const { return m_cStructure->strName; }
490
491 /// @brief To set with the used property value.
492 void SetValue(const std::string& value)
493 {
494 strncpy(m_cStructure->strValue, value.c_str(), sizeof(m_cStructure->strValue) - 1);
495 }
496
497 /// @brief To get with the used property value.
498 std::string GetValue() const { return m_cStructure->strValue; }
499 ///@}
500
501private:
502 PVRStreamProperty(const PVR_NAMED_VALUE* data) : CStructHdl(data) {}
503 PVRStreamProperty(PVR_NAMED_VALUE* data) : CStructHdl(data) {}
504};
505///@}
506//------------------------------------------------------------------------------
507
508} /* namespace addon */
509} /* namespace kodi */
510
511#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h
deleted file mode 100644
index 053a4d5..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h
+++ /dev/null
@@ -1,130 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr/pvr_menu_hook.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 7 - Menu hook
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook class PVRMenuhook
25/// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook
26/// @brief **Context menu hook**\n
27/// Menu hooks that are available in the context menus while playing a stream via this add-on.
28/// And in the Live TV settings dialog.
29///
30/// Possible menu's given to Kodi.
31///
32/// This can be becomes used on this, if @ref kodi::addon::CInstancePVRClient::AddMenuHook()
33/// was set to related type:
34/// - @ref kodi::addon::CInstancePVRClient::CallSettingsMenuHook()
35/// - @ref kodi::addon::CInstancePVRClient::CallChannelMenuHook()
36/// - @ref kodi::addon::CInstancePVRClient::CallEPGMenuHook()
37/// - @ref kodi::addon::CInstancePVRClient::CallRecordingMenuHook()
38/// - @ref kodi::addon::CInstancePVRClient::CallTimerMenuHook()
39///
40/// ----------------------------------------------------------------------------
41///
42/// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help
43///
44///@{
45class PVRMenuhook : public CStructHdl<PVRMenuhook, PVR_MENUHOOK>
46{
47 friend class CInstancePVRClient;
48
49public:
50 /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook
51 /// @brief Optional class constructor with value set.
52 ///
53 /// @param[in] hookId This hook's identifier
54 /// @param[in] localizedStringId Localized string identifier
55 /// @param[in] category Category of menu hook, defined with @ref PVR_MENUHOOK_CAT
56 ///
57 ///
58 /// --------------------------------------------------------------------------
59 ///
60 /// Example:
61 /// ~~~~~~~~~~~~~{.cpp}
62 /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30001, PVR_MENUHOOK_CHANNEL));
63 /// ~~~~~~~~~~~~~
64 ///
65 PVRMenuhook(unsigned int hookId, unsigned int localizedStringId, PVR_MENUHOOK_CAT category)
66 {
67 m_cStructure->iHookId = hookId;
68 m_cStructure->iLocalizedStringId = localizedStringId;
69 m_cStructure->category = category;
70 }
71
72 /*! \cond PRIVATE */
73 PVRMenuhook()
74 {
75 m_cStructure->iHookId = 0;
76 m_cStructure->iLocalizedStringId = 0;
77 m_cStructure->category = PVR_MENUHOOK_UNKNOWN;
78 }
79 PVRMenuhook(const PVRMenuhook& data) : CStructHdl(data) {}
80 /*! \endcond */
81
82 /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help Value Help
83 /// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook
84 ///
85 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook :</b>
86 /// | Name | Type | Set call | Get call | Usage
87 /// |------|------|----------|----------|-----------
88 /// | **This hook's identifier** | `unsigned int` | @ref PVRMenuhook::SetHookId "SetHookId" | @ref PVRMenuhook::GetHookId "GetHookId" | *required to set*
89 /// | **Localized string Identifier** | `unsigned int` | @ref PVRMenuhook::SetLocalizedStringId "SetLocalizedStringId" | @ref PVRMenuhook::GetLocalizedStringId "GetLocalizedStringId" | *required to set*
90 /// | **Category of menu hook** | @ref PVR_MENUHOOK_CAT | @ref PVRMenuhook::SetCategory "SetCategory" | @ref PVRMenuhook::GetCategory "GetCategory" | *required to set*
91
92 /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook
93 ///@{
94
95 /// @brief **required**\n
96 /// This hook's identifier.
97 void SetHookId(unsigned int hookId) { m_cStructure->iHookId = hookId; }
98
99 /// @brief To get with @ref SetHookId() changed values.
100 unsigned int GetHookId() const { return m_cStructure->iHookId; }
101
102 /// @brief **required**\n
103 /// The id of the label for this hook in @ref kodi::GetLocalizedString().
104 void SetLocalizedStringId(unsigned int localizedStringId)
105 {
106 m_cStructure->iLocalizedStringId = localizedStringId;
107 }
108
109 /// @brief To get with @ref SetLocalizedStringId() changed values.
110 unsigned int GetLocalizedStringId() const { return m_cStructure->iLocalizedStringId; }
111
112 /// @brief **required**\n
113 /// Category of menu hook.
114 void SetCategory(PVR_MENUHOOK_CAT category) { m_cStructure->category = category; }
115
116 /// @brief To get with @ref SetCategory() changed values.
117 PVR_MENUHOOK_CAT GetCategory() const { return m_cStructure->category; }
118 ///@}
119
120private:
121 PVRMenuhook(const PVR_MENUHOOK* data) : CStructHdl(data) {}
122 PVRMenuhook(PVR_MENUHOOK* data) : CStructHdl(data) {}
123};
124///@}
125//------------------------------------------------------------------------------
126
127} /* namespace addon */
128} /* namespace kodi */
129
130#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Recordings.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Recordings.h
deleted file mode 100644
index 24ecf11..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Recordings.h
+++ /dev/null
@@ -1,520 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 5 - PVR recordings
16#ifdef __cplusplus
17
18namespace kodi
19{
20namespace addon
21{
22
23//==============================================================================
24/// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording class PVRRecording
25/// @ingroup cpp_kodi_addon_pvr_Defs_Recording
26/// @brief **Data structure with available recordings data**\n
27/// With this, recordings related data are transferred between addon and Kodi
28/// and can also be used by the addon itself.
29///
30/// The related values here are automatically initiated to defaults and need
31/// only be set if supported and used.
32///
33/// ----------------------------------------------------------------------------
34///
35/// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help
36///
37///@{
38class PVRRecording : public CStructHdl<PVRRecording, PVR_RECORDING>
39{
40 friend class CInstancePVRClient;
41
42public:
43 /*! \cond PRIVATE */
44 PVRRecording()
45 {
46 m_cStructure->iSeriesNumber = PVR_RECORDING_INVALID_SERIES_EPISODE;
47 m_cStructure->iEpisodeNumber = PVR_RECORDING_INVALID_SERIES_EPISODE;
48 m_cStructure->recordingTime = 0;
49 m_cStructure->iDuration = PVR_RECORDING_VALUE_NOT_AVAILABLE;
50 m_cStructure->iPriority = PVR_RECORDING_VALUE_NOT_AVAILABLE;
51 m_cStructure->iLifetime = PVR_RECORDING_VALUE_NOT_AVAILABLE;
52 m_cStructure->iGenreType = PVR_RECORDING_VALUE_NOT_AVAILABLE;
53 m_cStructure->iGenreSubType = PVR_RECORDING_VALUE_NOT_AVAILABLE;
54 m_cStructure->iPlayCount = PVR_RECORDING_VALUE_NOT_AVAILABLE;
55 m_cStructure->iLastPlayedPosition = PVR_RECORDING_VALUE_NOT_AVAILABLE;
56 m_cStructure->bIsDeleted = false;
57 m_cStructure->iEpgEventId = 0;
58 m_cStructure->iChannelUid = PVR_RECORDING_VALUE_NOT_AVAILABLE;
59 m_cStructure->channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN;
60 m_cStructure->iFlags = 0;
61 m_cStructure->sizeInBytes = PVR_RECORDING_VALUE_NOT_AVAILABLE;
62 }
63 PVRRecording(const PVRRecording& recording) : CStructHdl(recording) {}
64 /*! \endcond */
65
66 /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help Value Help
67 /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
68 ///
69 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording :</b>
70 /// | Name | Type | Set call | Get call | Usage
71 /// |------|------|----------|----------|-----------
72 /// | **Recording id** | `std::string` | @ref PVRRecording::SetRecordingId "SetRecordingId" | @ref PVRRecording::GetRecordingId "GetRecordingId" | *required to set*
73 /// | **Title** | `std::string` | @ref PVRRecording::SetTitle "SetTitle" | @ref PVRRecording::GetTitle "GetTitle" | *required to set*
74 /// | **Episode name** | `std::string` | @ref PVRRecording::SetEpisodeName "SetEpisodeName" | @ref PVRRecording::GetEpisodeName "GetEpisodeName" | *optional*
75 /// | **Series number** | `int` | @ref PVRRecording::SetSeriesNumber "SetSeriesNumber" | @ref PVRRecording::GetSeriesNumber "GetSeriesNumber" | *optional*
76 /// | **Episode number** | `int` | @ref PVRRecording::SetEpisodeNumber "SetEpisodeNumber" | @ref PVRRecording::GetEpisodeNumber "GetEpisodeNumber" | *optional*
77 /// | **Year** | `int` | @ref PVRRecording::SetYear "SetYear" | @ref PVRRecording::GetYear "GetYear" | *optional*
78 /// | **Directory** | `std::string` | @ref PVRRecording::SetDirectory "SetDirectory" | @ref PVRRecording::GetDirectory "GetDirectory" | *optional*
79 /// | **Plot outline** | `std::string` | @ref PVRRecording::SetPlotOutline "SetPlotOutline" | @ref PVRRecording::GetPlotOutline "GetPlotOutline" | *optional*
80 /// | **Plot** | `std::string` | @ref PVRRecording::SetPlot "SetPlot" | @ref PVRRecording::GetPlot "GetPlot" | *optional*
81 /// | **Genre description** | `std::string` | @ref PVRRecording::SetGenreDescription "SetGenreDescription" | @ref PVRRecording::GetGenreDescription "GetGenreDescription" | *optional*
82 /// | **Channel name** | `std::string` | @ref PVRRecording::SetChannelName "SetChannelName" | @ref PVRRecording::GetChannelName "GetChannelName" | *optional*
83 /// | **Icon path** | `std::string` | @ref PVRRecording::SetIconPath "SetIconPath" | @ref PVRRecording::GetIconPath "GetIconPath" | *optional*
84 /// | **Thumbnail path** | `std::string` | @ref PVRRecording::SetThumbnailPath "SetThumbnailPath" | @ref PVRRecording::GetThumbnailPath "GetThumbnailPath" | *optional*
85 /// | **Fanart path** | `std::string` | @ref PVRRecording::SetFanartPath "SetFanartPath" | @ref PVRRecording::GetFanartPath "GetFanartPath" | *optional*
86 /// | **Recording time** | `time_t` | @ref PVRRecording::SetRecordingTime "SetRecordingTime" | @ref PVRRecording::GetRecordingTime "GetRecordingTime" | *optional*
87 /// | **Duration** | `int` | @ref PVRRecording::SetDuration "SetDuration" | @ref PVRRecording::GetDuration "GetDuration" | *optional*
88 /// | **Priority** | `int` | @ref PVRRecording::SetPriority "SetPriority" | @ref PVRRecording::GetPriority "GetPriority" | *optional*
89 /// | **Lifetime** | `int` | @ref PVRRecording::SetLifetime "SetLifetime" | @ref PVRRecording::GetLifetime "GetLifetime" | *optional*
90 /// | **Genre type** | `int` | @ref PVRRecording::SetGenreType "SetGenreType" | @ref PVRRecording::GetGenreType "GetGenreType" | *optional*
91 /// | **Genre sub type** | `int` | @ref PVRRecording::SetGenreSubType "SetGenreSubType" | @ref PVRRecording::GetGenreSubType "GetGenreSubType" | *optional*
92 /// | **Play count** | `int` | @ref PVRRecording::SetPlayCount "SetPlayCount" | @ref PVRRecording::GetPlayCount "GetPlayCount" | *optional*
93 /// | **Last played position** | `int` | @ref PVRRecording::SetLastPlayedPosition "SetLastPlayedPosition" | @ref PVRRecording::GetLastPlayedPosition "GetLastPlayedPosition" | *optional*
94 /// | **Is deleted** | `bool` | @ref PVRRecording::SetIsDeleted "SetIsDeleted" | @ref PVRRecording::GetIsDeleted "GetIsDeleted" | *optional*
95 /// | **EPG event id** | `unsigned int` | @ref PVRRecording::SetEPGEventId "SetEPGEventId" | @ref PVRRecording::GetEPGEventId "GetEPGEventId" | *optional*
96 /// | **Channel unique id** | `int` | @ref PVRRecording::SetChannelUid "SetChannelUid" | @ref PVRRecording::GetChannelUid "GetChannelUid" | *optional*
97 /// | **Channel type** | @ref PVR_RECORDING_CHANNEL_TYPE | @ref PVRRecording::SetChannelType "SetChannelType" | @ref PVRRecording::GetChannelType "GetChannelType" | *optional*
98 /// | **First aired** | `std::string` | @ref PVRRecording::SetFirstAired "SetFirstAired" | @ref PVRRecording::GetFirstAired "GetFirstAired" | *optional*
99 /// | **Flags** | `std::string` | @ref PVRRecording::SetFlags "SetFlags" | @ref PVRRecording::GetFlags "GetFlags" | *optional*
100 /// | **Size in bytes** | `std::string` | @ref PVRRecording::SetSizeInBytes "SetSizeInBytes" | @ref PVRRecording::GetSizeInBytes "GetSizeInBytes" | *optional*
101
102 /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
103 ///@{
104
105 /// @brief **required**\n
106 /// Unique identifier of the recording on the client.
107 void SetRecordingId(const std::string& recordingId)
108 {
109 strncpy(m_cStructure->strRecordingId, recordingId.c_str(),
110 sizeof(m_cStructure->strRecordingId) - 1);
111 }
112
113 /// @brief To get with @ref SetRecordingId changed values.
114 std::string GetRecordingId() const { return m_cStructure->strRecordingId; }
115
116 /// @brief **required**\n
117 /// The title of this recording.
118 void SetTitle(const std::string& title)
119 {
120 strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1);
121 }
122
123 /// @brief To get with @ref SetTitle changed values.
124 std::string GetTitle() const { return m_cStructure->strTitle; }
125
126 /// @brief **optional**\n
127 /// Episode name (also known as subtitle).
128 void SetEpisodeName(const std::string& episodeName)
129 {
130 strncpy(m_cStructure->strEpisodeName, episodeName.c_str(),
131 sizeof(m_cStructure->strEpisodeName) - 1);
132 }
133
134 /// @brief To get with @ref SetEpisodeName changed values.
135 std::string GetEpisodeName() const { return m_cStructure->strEpisodeName; }
136
137 /// @brief **optional**\n
138 /// Series number (usually called season).
139 ///
140 /// Set to "0" for specials/pilot. For 'invalid' see @ref SetEpisodeNumber or set to -1.
141 void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; }
142
143 /// @brief To get with @ref SetSeriesNumber changed values.
144 int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; }
145
146 /// @brief **optional**\n
147 /// Eepisode number within the "iSeriesNumber" season.
148 ///
149 /// For 'invalid' set to -1 or seriesNumber=episodeNumber=0 to show both are invalid.
150 void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; }
151
152 /// @brief To get with @ref SetEpisodeNumber changed values.
153 int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; }
154
155 /// @brief **optional**\n
156 /// Year of first release (use to identify a specific movie re-make) / first
157 /// airing for TV shows.
158 ///
159 /// Set to '0' for invalid.
160 void SetYear(int year) { m_cStructure->iYear = year; }
161
162 /// @brief To get with @ref SetYear changed values.
163 int GetYear() const { return m_cStructure->iYear; }
164
165 /// @brief **optional**\n
166 ///
167 /// Directory of this recording on the client.
168 void SetDirectory(const std::string& directory)
169 {
170 strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1);
171 }
172
173 /// @brief To get with @ref SetDirectory changed values.
174 std::string GetDirectory() const { return m_cStructure->strDirectory; }
175
176 /// @brief **optional**\n
177 /// Plot outline name.
178 void SetPlotOutline(const std::string& plotOutline)
179 {
180 strncpy(m_cStructure->strPlotOutline, plotOutline.c_str(),
181 sizeof(m_cStructure->strPlotOutline) - 1);
182 }
183
184 /// @brief To get with @ref SetPlotOutline changed values.
185 std::string GetPlotOutline() const { return m_cStructure->strPlotOutline; }
186
187 /// @brief **optional**\n
188 /// Plot name.
189 void SetPlot(const std::string& plot)
190 {
191 strncpy(m_cStructure->strPlot, plot.c_str(), sizeof(m_cStructure->strPlot) - 1);
192 }
193
194 /// @brief To get with @ref SetPlot changed values.
195 std::string GetPlot() const { return m_cStructure->strPlot; }
196
197 /// @brief **optional**\n
198 /// Channel name.
199 void SetChannelName(const std::string& channelName)
200 {
201 strncpy(m_cStructure->strChannelName, channelName.c_str(),
202 sizeof(m_cStructure->strChannelName) - 1);
203 }
204
205 /// @brief To get with @ref SetChannelName changed values.
206 std::string GetChannelName() const { return m_cStructure->strChannelName; }
207
208 /// @brief **optional**\n
209 /// Channel logo (icon) path.
210 void SetIconPath(const std::string& iconPath)
211 {
212 strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1);
213 }
214
215 /// @brief To get with @ref SetIconPath changed values.
216 std::string GetIconPath() const { return m_cStructure->strIconPath; }
217
218 /// @brief **optional**\n
219 /// Thumbnail path.
220 void SetThumbnailPath(const std::string& thumbnailPath)
221 {
222 strncpy(m_cStructure->strThumbnailPath, thumbnailPath.c_str(),
223 sizeof(m_cStructure->strThumbnailPath) - 1);
224 }
225
226 /// @brief To get with @ref SetThumbnailPath changed values.
227 std::string GetThumbnailPath() const { return m_cStructure->strThumbnailPath; }
228
229 /// @brief **optional**\n
230 /// Fanart path.
231 void SetFanartPath(const std::string& fanartPath)
232 {
233 strncpy(m_cStructure->strFanartPath, fanartPath.c_str(),
234 sizeof(m_cStructure->strFanartPath) - 1);
235 }
236
237 /// @brief To get with @ref SetFanartPath changed values.
238 std::string GetFanartPath() const { return m_cStructure->strFanartPath; }
239
240 /// @brief **optional**\n
241 /// Start time of the recording.
242 void SetRecordingTime(time_t recordingTime) { m_cStructure->recordingTime = recordingTime; }
243
244 /// @brief To get with @ref SetRecordingTime changed values.
245 time_t GetRecordingTime() const { return m_cStructure->recordingTime; }
246
247 /// @brief **optional**\n
248 /// Duration of the recording in seconds.
249 void SetDuration(int duration) { m_cStructure->iDuration = duration; }
250
251 /// @brief To get with @ref SetDuration changed values.
252 int GetDuration() const { return m_cStructure->iDuration; }
253
254 /// @brief **optional**\n
255 /// Priority of this recording (from 0 - 100).
256 void SetPriority(int priority) { m_cStructure->iPriority = priority; }
257
258 /// @brief To get with @ref SetPriority changed values.
259 int GetPriority() const { return m_cStructure->iPriority; }
260
261 /// @brief **optional**\n
262 /// Life time in days of this recording.
263 void SetLifetime(int lifetime) { m_cStructure->iLifetime = lifetime; }
264
265 /// @brief To get with @ref SetLifetime changed values.
266 int GetLifetime() const { return m_cStructure->iLifetime; }
267
268 /// @brief **optional**\n
269 /// Genre type.
270 ///
271 /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription.
272 ///
273 /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
274 /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here
275 /// with backend value.
276 ///
277 ///
278 /// --------------------------------------------------------------------------
279 ///
280 /// **Example 1:**
281 /// ~~~~~~~~~~~~~{.cpp}
282 /// kodi::addon::PVRRecording tag;
283 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA);
284 /// ~~~~~~~~~~~~~
285 ///
286 /// --------------------------------------------------------------------------
287 ///
288 /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types):
289 /// ~~~~~~~~~~~~~{.cpp}
290 /// kodi::addon::PVRRecording tag;
291 /// tag.SetGenreType(EPG_GENRE_USE_STRING);
292 /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language.
293 /// ~~~~~~~~~~~~~
294 ///
295 void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; }
296
297 /// @brief To get with @ref SetGenreType changed values.
298 int GetGenreType() const { return m_cStructure->iGenreType; }
299
300 /// @brief **optional**\n
301 /// Genre sub type.
302 ///
303 /// Subtypes groups related to set by @ref SetGenreType:
304 /// | Main genre type | List with available sub genre types
305 /// |-----------------|-----------------------------------------
306 /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0
307 /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA
308 /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS
309 /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW
310 /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS
311 /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH
312 /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE
313 /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE
314 /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS
315 /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE
316 /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES
317 /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL
318 /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you
319 /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given.
320 ///
321 /// --------------------------------------------------------------------------
322 ///
323 /// **Example:**
324 /// ~~~~~~~~~~~~~{.cpp}
325 /// kodi::addon::PVRRecording tag;
326 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE);
327 /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ);
328 /// ~~~~~~~~~~~~~
329 ///
330 void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; }
331
332 /// @brief To get with @ref SetGenreSubType changed values.
333 int GetGenreSubType() const { return m_cStructure->iGenreSubType; }
334
335 /// @brief **optional**\n
336 /// To set own genre description name.
337 ///
338 /// Will be used only when genreType == @ref EPG_GENRE_USE_STRING or
339 /// genreSubType == @ref EPG_GENRE_USE_STRING.
340 ///
341 /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres.
342 ///
343 /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
344 /// conform genre types or something special.
345 ///
346 /// --------------------------------------------------------------------------
347 ///
348 /// **Example:**
349 /// ~~~~~~~~~~~~~{.cpp}
350 /// kodi::addon::PVRRecording tag;
351 /// tag.SetGenreType(EPG_GENRE_USE_STRING);
352 /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller");
353 /// ~~~~~~~~~~~~~
354 ///
355 void SetGenreDescription(const std::string& genreDescription)
356 {
357 strncpy(m_cStructure->strGenreDescription, genreDescription.c_str(),
358 sizeof(m_cStructure->strGenreDescription) - 1);
359 }
360
361 /// @brief To get with @ref SetGenreDescription changed values.
362 std::string GetGenreDescription() const { return m_cStructure->strGenreDescription; }
363
364 /// @brief **optional**\n
365 /// Play count of this recording on the client.
366 void SetPlayCount(int playCount) { m_cStructure->iPlayCount = playCount; }
367
368 /// @brief To get with @ref SetPlayCount changed values.
369 int GetPlayCount() const { return m_cStructure->iPlayCount; }
370
371 /// @brief **optional**\n
372 /// Last played position of this recording on the client.
373 void SetLastPlayedPosition(int lastPlayedPosition)
374 {
375 m_cStructure->iLastPlayedPosition = lastPlayedPosition;
376 }
377
378 /// @brief To get with @ref SetLastPlayedPosition changed values.
379 int GetLastPlayedPosition() const { return m_cStructure->iLastPlayedPosition; }
380
381 /// @brief **optional**\n
382 /// Shows this recording is deleted and can be undelete.
383 void SetIsDeleted(int isDeleted) { m_cStructure->bIsDeleted = isDeleted; }
384
385 /// @brief To get with @ref SetIsDeleted changed values.
386 int GetIsDeleted() const { return m_cStructure->bIsDeleted; }
387
388 /// @brief **optional**\n
389 /// EPG event id associated with this recording. Valid ids must be greater than @ref EPG_TAG_INVALID_UID.
390 void SetEPGEventId(unsigned int epgEventId) { m_cStructure->iEpgEventId = epgEventId; }
391
392 /// @brief To get with @ref SetEPGEventId changed values.
393 unsigned int GetEPGEventId() const { return m_cStructure->iEpgEventId; }
394
395 /// @brief **optional**\n
396 /// Unique identifier of the channel for this recording. @ref PVR_CHANNEL_INVALID_UID
397 /// denotes that channel uid is not available.
398 void SetChannelUid(int channelUid) { m_cStructure->iChannelUid = channelUid; }
399
400 /// @brief To get with @ref SetChannelUid changed values
401 int GetChannelUid() const { return m_cStructure->iChannelUid; }
402
403 /// @brief **optional**\n
404 /// Channel type.
405 ///
406 /// Set to @ref PVR_RECORDING_CHANNEL_TYPE_UNKNOWN if the type cannot be
407 /// determined.
408 ///
409 /// --------------------------------------------------------------------------
410 ///
411 /// Example:
412 /// ~~~~~~~~~~~~~{.cpp}
413 /// kodi::addon::PVRRecording tag;
414 /// tag.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_TV);
415 /// ~~~~~~~~~~~~~
416 ///
417 void SetChannelType(PVR_RECORDING_CHANNEL_TYPE channelType)
418 {
419 m_cStructure->channelType = channelType;
420 }
421
422 /// @brief To get with @ref SetChannelType changed values
423 PVR_RECORDING_CHANNEL_TYPE GetChannelType() const { return m_cStructure->channelType; }
424
425 /// @brief **optional**\n
426 /// First aired date of this recording.
427 ///
428 /// Used only for display purposes. Specify in W3C date format "YYYY-MM-DD".
429 ///
430 /// --------------------------------------------------------------------------
431 ///
432 /// Example:
433 /// ~~~~~~~~~~~~~{.cpp}
434 /// kodi::addon::PVRRecording tag;
435 /// tag.SetFirstAired(1982-10-22);
436 /// ~~~~~~~~~~~~~
437 ///
438 void SetFirstAired(const std::string& firstAired)
439 {
440 strncpy(m_cStructure->strFirstAired, firstAired.c_str(),
441 sizeof(m_cStructure->strFirstAired) - 1);
442 }
443
444 /// @brief To get with @ref SetFirstAired changed values
445 std::string GetFirstAired() const { return m_cStructure->strFirstAired; }
446
447 /// @brief **optional**\n
448 /// Bit field of independent flags associated with the recording.
449 ///
450 /// See @ref cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG for
451 /// available bit flags.
452 ///
453 /// --------------------------------------------------------------------------
454 ///
455 /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG
456 ///
457 void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; }
458
459 /// @brief To get with @ref SetFlags changed values.
460 unsigned int GetFlags() const { return m_cStructure->iFlags; }
461
462 /// @brief **optional**\n
463 /// Size of the recording in bytes.
464 void SetSizeInBytes(int64_t sizeInBytes) { m_cStructure->sizeInBytes = sizeInBytes; }
465
466 /// @brief To get with @ref SetSizeInBytes changed values.
467 int64_t GetSizeInBytes() const { return m_cStructure->sizeInBytes; }
468 ///@}
469
470private:
471 PVRRecording(const PVR_RECORDING* recording) : CStructHdl(recording) {}
472 PVRRecording(PVR_RECORDING* recording) : CStructHdl(recording) {}
473};
474///@}
475//------------------------------------------------------------------------------
476
477//==============================================================================
478/// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet class PVRRecordingsResultSet
479/// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
480/// @brief **PVR add-on recording transfer class**\n
481/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetRecordings().
482///
483/// @note This becomes only be used on addon call above, not usable outside on
484/// addon itself.
485///@{
486class PVRRecordingsResultSet
487{
488public:
489 /*! \cond PRIVATE */
490 PVRRecordingsResultSet() = delete;
491 PVRRecordingsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
492 : m_instance(instance), m_handle(handle)
493 {
494 }
495 /*! \endcond */
496
497 /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet
498 ///@{
499
500 /// @brief To add and give content from addon to Kodi on related call.
501 ///
502 /// @param[in] tag The to transferred data.
503 void Add(const kodi::addon::PVRRecording& tag)
504 {
505 m_instance->toKodi->TransferRecordingEntry(m_instance->toKodi->kodiInstance, m_handle, tag);
506 }
507
508 ///@}
509
510private:
511 const AddonInstance_PVR* m_instance = nullptr;
512 const ADDON_HANDLE m_handle;
513};
514///@}
515//------------------------------------------------------------------------------
516
517} /* namespace addon */
518} /* namespace kodi */
519
520#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Stream.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Stream.h
deleted file mode 100644
index 5613947..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Stream.h
+++ /dev/null
@@ -1,330 +0,0 @@
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 "../../AddonBase.h"
12#include "../../c-api/addon-instance/pvr/pvr_stream.h"
13
14//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
15// "C++" Definitions group 9 - PVR stream definitions (NOTE: Becomes replaced
16// in future by inputstream addon instance way)
17
18#ifdef __cplusplus
19
20namespace kodi
21{
22namespace addon
23{
24
25//==============================================================================
26/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec class PVRCodec
27/// @ingroup cpp_kodi_addon_pvr_Defs_Stream
28/// @brief **PVR codec identifier**\n
29/// Used to exchange the desired codec type between Kodi and addon.
30///
31/// @ref kodi::addon::CInstancePVRClient::GetCodecByName is used to get this data.
32///
33/// ----------------------------------------------------------------------------
34///
35/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help
36///
37///@{
38class PVRCodec : public CStructHdl<PVRCodec, PVR_CODEC>
39{
40 friend class CInstancePVRClient;
41
42public:
43 /*! \cond PRIVATE */
44 PVRCodec()
45 {
46 m_cStructure->codec_type = PVR_CODEC_TYPE_UNKNOWN;
47 m_cStructure->codec_id = PVR_INVALID_CODEC_ID;
48 }
49 PVRCodec(const PVRCodec& type) : CStructHdl(type) {}
50 /*! \endcond */
51
52 /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help Value Help
53 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec
54 ///
55 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRCodec :</b>
56 /// | Name | Type | Set call | Get call
57 /// |------|------|----------|----------
58 /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRCodec::SetCodecType "SetCodecType" | @ref PVRCodec::GetCodecType "GetCodecType"
59 /// | **Codec identifier** | `unsigned int` | @ref PVRCodec::SetCodecId "SetCodecId" | @ref PVRCodec::GetCodecId "GetCodecId"
60 ///
61
62 /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec
63 ///@{
64
65 /// @brief Codec type.
66 void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->codec_type = codecType; }
67
68 /// @brief To get with @ref SetCodecType() changed values.
69 PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->codec_type; }
70
71 /// @brief Codec id.
72 ///
73 /// Related codec identifier, normally match the ffmpeg id's.
74 void SetCodecId(unsigned int codecId) { m_cStructure->codec_id = codecId; }
75
76 /// @brief To get with @ref SetCodecId() changed values.
77 unsigned int GetCodecId() const { return m_cStructure->codec_id; }
78 ///@}
79
80private:
81 PVRCodec(const PVR_CODEC& type) : CStructHdl(&type) {}
82 PVRCodec(const PVR_CODEC* type) : CStructHdl(type) {}
83 PVRCodec(PVR_CODEC* type) : CStructHdl(type) {}
84};
85///@}
86//------------------------------------------------------------------------------
87
88//==============================================================================
89/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties class PVRStreamProperties
90/// @ingroup cpp_kodi_addon_pvr_Defs_Stream
91/// @brief **PVR stream properties**\n
92/// All information about a respective stream is stored in this, so that Kodi
93/// can process the data given by the addon after demux.
94///
95/// ----------------------------------------------------------------------------
96///
97/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help
98///
99///@{
100class PVRStreamProperties
101 : public CStructHdl<PVRStreamProperties, PVR_STREAM_PROPERTIES::PVR_STREAM>
102{
103 friend class CInstancePVRClient;
104
105public:
106 /*! \cond PRIVATE */
107 PVRStreamProperties() { memset(m_cStructure, 0, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); }
108 PVRStreamProperties(const PVRStreamProperties& type) : CStructHdl(type) {}
109 /*! \endcond */
110
111 /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help Value Help
112 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties
113 /// ----------------------------------------------------------------------------
114 ///
115 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties :</b>
116 /// | Name | Type | Set call | Get call
117 /// |------|------|----------|----------
118 /// | **PID** | `unsigned int` | @ref PVRStreamProperties::SetPID "SetPID" | @ref PVRStreamProperties::GetPID "GetPID"
119 /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRStreamProperties::SetCodecType "SetCodecType" | @ref PVRStreamProperties::GetCodecType "GetCodecType"
120 /// | **Codec identifier** | `unsigned int` | @ref PVRStreamProperties::SetCodecId "SetCodecId" | @ref PVRStreamProperties::GetCodecId "GetCodecId"
121 /// | **Language** | `std::string` | @ref PVRStreamProperties::SetLanguage "SetLanguage" | @ref PVRStreamProperties::GetLanguage "GetLanguage"
122 /// | **Subtitle info** | `int` | @ref PVRStreamProperties::SetSubtitleInfo "SetSubtitleInfo" | @ref PVRStreamProperties::GetSubtitleInfo "GetSubtitleInfo"
123 /// | **FPS scale** | `int` | @ref PVRStreamProperties::SetFPSScale "SetFPSScale" | @ref PVRStreamProperties::GetFPSScale "GetFPSScale"
124 /// | **FPS rate** | `int` | @ref PVRStreamProperties::SetFPSRate "SetFPSRate" | @ref PVRStreamProperties::GetFPSRate "GetFPSRate"
125 /// | **Height** | `int` | @ref PVRStreamProperties::SetHeight "SetHeight" | @ref PVRStreamProperties::GetHeight "GetHeight"
126 /// | **Width** | `int` | @ref PVRStreamProperties::SetWidth "SetWidth" | @ref PVRStreamProperties::GetWidth "GetWidth"
127 /// | **Aspect ratio** | `float` | @ref PVRStreamProperties::SetAspect "SetAspect" | @ref PVRStreamProperties::GetAspect "GetAspect"
128 /// | **Channels** | `int` | @ref PVRStreamProperties::SetChannels "SetChannels" | @ref PVRStreamProperties::GetChannels "GetChannels"
129 /// | **Samplerate** | `int` | @ref PVRStreamProperties::SetSampleRate "SetSampleRate" | @ref PVRStreamProperties::GetSampleRate "GetSampleRate"
130 /// | **Block align** | `int` | @ref PVRStreamProperties::SetBlockAlign "SetBlockAlign" | @ref PVRStreamProperties::GetBlockAlign "GetBlockAlign"
131 /// | **Bit rate** | `int` | @ref PVRStreamProperties::SetBitRate "SetBitRate" | @ref PVRStreamProperties::GetBitRate "GetBitRate"
132 /// | **Bits per sample** | `int` | @ref PVRStreamProperties::SetBitsPerSample "SetBitsPerSample" | @ref PVRStreamProperties::GetBitsPerSample "GetBitsPerSample"
133 ///
134
135 /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties
136 ///@{
137
138 /// @brief PID.
139 void SetPID(unsigned int pid) { m_cStructure->iPID = pid; }
140
141 /// @brief To get with @ref SetPID() changed values.
142 unsigned int GetPID() const { return m_cStructure->iPID; }
143
144 /// @brief Codec type this stream.
145 void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->iCodecType = codecType; }
146
147 /// @brief To get with @ref SetCodecType() changed values.
148 PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->iCodecType; }
149
150 /// @brief Codec id of this stream.
151 void SetCodecId(unsigned int codecId) { m_cStructure->iCodecId = codecId; }
152
153 /// @brief To get with @ref SetCodecId() changed values.
154 unsigned int GetCodecId() const { return m_cStructure->iCodecId; }
155
156 /// @brief 3 letter language id.
157 void SetLanguage(const std::string& language)
158 {
159 if (language.size() > 3)
160 {
161 kodi::Log(ADDON_LOG_ERROR,
162 "PVRStreamProperties::%s: Language string size '%li' higher as needed 3", __func__,
163 language.size());
164 return;
165 }
166 m_cStructure->strLanguage[0] = language[0];
167 m_cStructure->strLanguage[1] = language[1];
168 m_cStructure->strLanguage[2] = language[2];
169 m_cStructure->strLanguage[2] = 0;
170 }
171
172 /// @brief To get with @ref SetLanguage() changed values.
173 std::string GetLanguage() const { return m_cStructure->strLanguage; }
174
175 /// @brief Subtitle Info
176 void SetSubtitleInfo(int subtitleInfo) { m_cStructure->iSubtitleInfo = subtitleInfo; }
177
178 /// @brief To get with @ref SetSubtitleInfo() changed values.
179 int GetSubtitleInfo() const { return m_cStructure->iSubtitleInfo; }
180
181 /// @brief To set scale of 1000 and a rate of 29970 will result in 29.97 fps.
182 void SetFPSScale(int fpsScale) { m_cStructure->iFPSScale = fpsScale; }
183
184 /// @brief To get with @ref SetFPSScale() changed values.
185 int GetFPSScale() const { return m_cStructure->iFPSScale; }
186
187 /// @brief FPS rate
188 void SetFPSRate(int fpsRate) { m_cStructure->iFPSRate = fpsRate; }
189
190 /// @brief To get with @ref SetFPSRate() changed values.
191 int GetFPSRate() const { return m_cStructure->iFPSRate; }
192
193 /// @brief Height of the stream reported by the demuxer
194 void SetHeight(int height) { m_cStructure->iHeight = height; }
195
196 /// @brief To get with @ref SetHeight() changed values.
197 int GetHeight() const { return m_cStructure->iHeight; }
198
199 /// @brief Width of the stream reported by the demuxer.
200 void SetWidth(int width) { m_cStructure->iWidth = width; }
201
202 /// @brief To get with @ref SetWidth() changed values.
203 int GetWidth() const { return m_cStructure->iWidth; }
204
205 /// @brief Display aspect ratio of the stream.
206 void SetAspect(float aspect) { m_cStructure->fAspect = aspect; }
207
208 /// @brief To get with @ref SetAspect() changed values.
209 float GetAspect() const { return m_cStructure->fAspect; }
210
211 /// @brief Amount of channels.
212 void SetChannels(int channels) { m_cStructure->iChannels = channels; }
213
214 /// @brief To get with @ref SetChannels() changed values.
215 int GetChannels() const { return m_cStructure->iChannels; }
216
217 /// @brief Sample rate.
218 void SetSampleRate(int sampleRate) { m_cStructure->iSampleRate = sampleRate; }
219
220 /// @brief To get with @ref SetSampleRate() changed values.
221 int GetSampleRate() const { return m_cStructure->iSampleRate; }
222
223 /// @brief Block alignment
224 void SetBlockAlign(int blockAlign) { m_cStructure->iBlockAlign = blockAlign; }
225
226 /// @brief To get with @ref SetBlockAlign() changed values.
227 int GetBlockAlign() const { return m_cStructure->iBlockAlign; }
228
229 /// @brief Bit rate.
230 void SetBitRate(int bitRate) { m_cStructure->iBitRate = bitRate; }
231
232 /// @brief To get with @ref SetBitRate() changed values.
233 int GetBitRate() const { return m_cStructure->iBitRate; }
234
235 /// @brief Bits per sample.
236 void SetBitsPerSample(int bitsPerSample) { m_cStructure->iBitsPerSample = bitsPerSample; }
237
238 /// @brief To get with @ref SetBitsPerSample() changed values.
239 int GetBitsPerSample() const { return m_cStructure->iBitsPerSample; }
240 ///@}
241
242private:
243 PVRStreamProperties(const PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {}
244 PVRStreamProperties(PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {}
245};
246///@}
247//------------------------------------------------------------------------------
248
249//==============================================================================
250/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes class PVRStreamTimes
251/// @ingroup cpp_kodi_addon_pvr_Defs_Stream
252/// @brief **Times of playing stream (Live TV and recordings)**\n
253/// This class is used to transfer the necessary data when
254/// @ref kodi::addon::PVRStreamProperties::GetStreamTimes is called.
255///
256/// ----------------------------------------------------------------------------
257///
258/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help
259///
260///@{
261class PVRStreamTimes : public CStructHdl<PVRStreamTimes, PVR_STREAM_TIMES>
262{
263 friend class CInstancePVRClient;
264
265public:
266 /*! \cond PRIVATE */
267 PVRStreamTimes() { memset(m_cStructure, 0, sizeof(PVR_STREAM_TIMES)); }
268 PVRStreamTimes(const PVRStreamTimes& type) : CStructHdl(type) {}
269 /*! \endcond */
270
271 /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help Value Help
272 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes
273 /// ----------------------------------------------------------------------------
274 ///
275 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes :</b>
276 /// | Name | Type | Set call | Get call
277 /// |------|------|----------|----------
278 /// | **Start time** | `time_t` | @ref PVRStreamTimes::SetStartTime "SetStartTime" | @ref PVRStreamTimes::GetStartTime "GetStartTime"
279 /// | **PTS start** | `int64_t` | @ref PVRStreamTimes::SetPTSStart "SetPTSStart" | @ref PVRStreamTimes::GetPTSStart "GetPTSStart"
280 /// | **PTS begin** | `int64_t` | @ref PVRStreamTimes::SetPTSBegin "SetPTSBegin" | @ref PVRStreamTimes::GetPTSBegin "GetPTSBegin"
281 /// | **PTS end** | `int64_t` | @ref PVRStreamTimes::SetPTSEnd "SetPTSEnd" | @ref PVRStreamTimes::GetPTSEnd "GetPTSEnd"
282 ///
283
284 /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes
285 ///@{
286
287 /// @brief For recordings, this must be zero. For Live TV, this is a reference
288 /// time in units of time_t (UTC) from which time elapsed starts. Ideally start
289 /// of tv show, but can be any other value.
290 void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; }
291
292 /// @brief To get with @ref SetStartTime() changed values.
293 time_t GetStartTime() const { return m_cStructure->startTime; }
294
295 /// @brief The pts of startTime.
296 void SetPTSStart(int64_t ptsStart) { m_cStructure->ptsStart = ptsStart; }
297
298 /// @brief To get with @ref SetPTSStart() changed values.
299 int64_t GetPTSStart() const { return m_cStructure->ptsStart; }
300
301 /// @brief Earliest pts player can seek back. Value is in micro seconds,
302 /// relative to PTS start. For recordings, this must be zero. For Live TV, this
303 /// must be zero if not timeshifting and must point to begin of the timeshift
304 /// buffer, otherwise.
305 void SetPTSBegin(int64_t ptsBegin) { m_cStructure->ptsBegin = ptsBegin; }
306
307 /// @brief To get with @ref SetPTSBegin() changed values.
308 int64_t GetPTSBegin() const { return m_cStructure->ptsBegin; }
309
310 /// @brief Latest pts player can seek forward. Value is in micro seconds,
311 /// relative to PTS start. For recordings, this must be the total length. For
312 /// Live TV, this must be zero if not timeshifting and must point to end of
313 /// the timeshift buffer, otherwise.
314 void SetPTSEnd(int64_t ptsEnd) { m_cStructure->ptsEnd = ptsEnd; }
315
316 /// @brief To get with @ref SetPTSEnd() changed values.
317 int64_t GetPTSEnd() const { return m_cStructure->ptsEnd; }
318 ///@}
319
320private:
321 PVRStreamTimes(const PVR_STREAM_TIMES* type) : CStructHdl(type) {}
322 PVRStreamTimes(PVR_STREAM_TIMES* type) : CStructHdl(type) {}
323};
324///@}
325//------------------------------------------------------------------------------
326
327} /* namespace addon */
328} /* namespace kodi */
329
330#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Timers.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Timers.h
deleted file mode 100644
index 6e05e55..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/pvr/Timers.h
+++ /dev/null
@@ -1,896 +0,0 @@
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 "General.h"
12#include "../../AddonBase.h"
13#include "../../c-api/addon-instance/pvr.h"
14
15//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
16// "C++" Definitions group 6 - PVR timers
17#ifdef __cplusplus
18
19namespace kodi
20{
21namespace addon
22{
23
24//==============================================================================
25/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer class PVRTimer
26/// @ingroup cpp_kodi_addon_pvr_Defs_Timer
27/// @brief **PVR add-on timer type**\n
28/// Representation of a timer event.
29///
30/// The related values here are automatically initiated to defaults and need
31/// only be set if supported and used.
32///
33/// ----------------------------------------------------------------------------
34///
35/// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help
36///
37///@{
38class PVRTimer : public CStructHdl<PVRTimer, PVR_TIMER>
39{
40 friend class CInstancePVRClient;
41
42public:
43 /*! \cond PRIVATE */
44 PVRTimer()
45 {
46 m_cStructure->iClientIndex = 0;
47 m_cStructure->state = PVR_TIMER_STATE_NEW;
48 m_cStructure->iTimerType = PVR_TIMER_TYPE_NONE;
49 m_cStructure->iParentClientIndex = 0;
50 m_cStructure->iClientChannelUid = PVR_TIMER_VALUE_NOT_AVAILABLE;
51 m_cStructure->startTime = 0;
52 m_cStructure->endTime = 0;
53 m_cStructure->bStartAnyTime = false;
54 m_cStructure->bEndAnyTime = false;
55 m_cStructure->bFullTextEpgSearch = false;
56 m_cStructure->iPriority = PVR_TIMER_VALUE_NOT_AVAILABLE;
57 m_cStructure->iLifetime = PVR_TIMER_VALUE_NOT_AVAILABLE;
58 m_cStructure->iMaxRecordings = PVR_TIMER_VALUE_NOT_AVAILABLE;
59 m_cStructure->iRecordingGroup = 0;
60 m_cStructure->firstDay = 0;
61 m_cStructure->iWeekdays = PVR_WEEKDAY_NONE;
62 m_cStructure->iPreventDuplicateEpisodes = 0;
63 m_cStructure->iEpgUid = 0;
64 m_cStructure->iMarginStart = 0;
65 m_cStructure->iMarginEnd = 0;
66 m_cStructure->iGenreType = PVR_TIMER_VALUE_NOT_AVAILABLE;
67 m_cStructure->iGenreSubType = PVR_TIMER_VALUE_NOT_AVAILABLE;
68 }
69 PVRTimer(const PVRTimer& data) : CStructHdl(data) {}
70 /*! \endcond */
71
72 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help Value Help
73 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer
74 ///
75 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer :</b>
76 /// | Name | Type | Set call | Get call | Usage
77 /// |------|------|----------|----------|-----------
78 /// | **Client index** | `unsigned int` | @ref PVRTimer::SetClientIndex "SetClientIndex" | @ref PVRTimer::GetClientIndex "GetClientIndex" | *required to set*
79 /// | **State** | @ref PVR_TIMER_STATE | @ref PVRTimer::SetState "SetState" | @ref PVRTimer::GetState "GetState" | *required to set*
80 /// | **Type** | `unsigned int` | @ref PVRTimer::SetTimerType "SetTimerType" | @ref PVRTimer::GetTimerType "GetTimerType" | *required to set*
81 /// | **Title** | `std::string` | @ref PVRTimer::SetTitle "SetTitle" | @ref PVRTimer::GetTitle "GetTitle" | *required to set*
82 /// | **Parent client index** | `unsigned int` | @ref PVRTimer::SetParentClientIndex "SetParentClientIndex" | @ref PVRTimer::GetParentClientIndex "GetParentClientIndex" | *optional*
83 /// | **Client channel unique identifier** | `int` | @ref PVRTimer::SetClientChannelUid "SetClientChannelUid" | @ref PVRTimer::GetClientChannelUid "GetClientChannelUid" | *optional*
84 /// | **Start time** | `time_t` | @ref PVRTimer::SetStartTime "SetStartTime" | @ref PVRTimer::GetStartTime "GetStartTime" | *optional*
85 /// | **End time** | `time_t` | @ref PVRTimer::SetEndTime "SetEndTime" | @ref PVRTimer::GetEndTime "GetEndTime" | *optional*
86 /// | **Start any time** | `bool` | @ref PVRTimer::SetStartAnyTime "SetStartAnyTime" | @ref PVRTimer::GetStartAnyTime "GetStartAnyTime" | *optional*
87 /// | **End any time** | `bool` | @ref PVRTimer::SetEndAnyTime "SetEndAnyTime" | @ref PVRTimer::GetEndAnyTime "GetEndAnyTime" | *optional*
88 /// | **EPG search string** | `std::string` | @ref PVRTimer::SetEPGSearchString "SetEPGSearchString" | @ref PVRTimer::GetEPGSearchString "GetEPGSearchString" | *optional*
89 /// | **Full text EPG search** | `bool` | @ref PVRTimer::SetFullTextEpgSearch "SetFullTextEpgSearch" | @ref PVRTimer::GetFullTextEpgSearch "GetFullTextEpgSearch" | *optional*
90 /// | **Recording store directory** | `std::string` | @ref PVRTimer::SetDirectory "SetDirectory" | @ref PVRTimer::GetDirectory "GetDirectory" | *optional*
91 /// | **Timer priority** | `int` | @ref PVRTimer::SetPriority "SetPriority" | @ref PVRTimer::GetPriority "GetPriority" | *optional*
92 /// | **Timer lifetime** | `int` | @ref PVRTimer::SetLifetime "SetLifetime" | @ref PVRTimer::GetLifetime "GetLifetime" | *optional*
93 /// | **Max recordings** | `int` | @ref PVRTimer::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimer::GetMaxRecordings "GetMaxRecordings" | *optional*
94 /// | **Recording group** | `unsigned int` | @ref PVRTimer::SetRecordingGroup "SetRecordingGroup" | @ref PVRTimer::GetRecordingGroup "GetRecordingGroup" | *optional*
95 /// | **First start day** | `time_t` | @ref PVRTimer::SetFirstDay "SetFirstDay" | @ref PVRTimer::GetFirstDay "GetFirstDay" | *optional*
96 /// | **Used timer weekdays** | `unsigned int` | @ref PVRTimer::SetWeekdays "SetWeekdays" | @ref PVRTimer::GetWeekdays "GetWeekdays" | *optional*
97 /// | **Prevent duplicate episodes** | `unsigned int` | @ref PVRTimer::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimer::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional*
98 /// | **EPG unique identifier** | `unsigned int` | @ref PVRTimer::SetEPGUid "SetEPGUid" | @ref PVRTimer::GetEPGUid "GetEPGUid" | *optional*
99 /// | **Margin start** | `unsigned int` | @ref PVRTimer::SetMarginStart "SetMarginStart" | @ref PVRTimer::GetMarginStart "GetMarginStart" | *optional*
100 /// | **Margin end** | `unsigned int` | @ref PVRTimer::SetMarginEnd "SetMarginEnd" | @ref PVRTimer::GetMarginEnd "GetMarginEnd" | *optional*
101 /// | **Genre type** | `int` | @ref PVRTimer::SetGenreType "SetGenreType" | @ref PVRTimer::GetGenreType "GetGenreType" | *optional*
102 /// | **Genre sub type** | `int` | @ref PVRTimer::SetGenreSubType "SetGenreSubType" | @ref PVRTimer::GetGenreSubType "GetGenreSubType" | *optional*
103 /// | **Series link** | `std::string` | @ref PVRTimer::SetSeriesLink "SetSeriesLink" | @ref PVRTimer::GetSeriesLink "GetSeriesLink" | *optional*
104
105 /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer
106 ///@{
107
108 /// @brief **required**\n
109 /// The index of this timer given by the client.
110 ///
111 /// @ref PVR_TIMER_NO_CLIENT_INDEX indicates that the index was not yet set
112 /// by the client, for example for new timers created by Kodi and passed the
113 /// first time to the client. A valid index must be greater than
114 /// @ref PVR_TIMER_NO_CLIENT_INDEX.
115 ///
116 void SetClientIndex(unsigned int clientIndex) { m_cStructure->iClientIndex = clientIndex; }
117
118 /// @brief To get with @ref SetClientIndex changed values.
119 unsigned int GetClientIndex() const { return m_cStructure->iClientIndex; }
120
121 /// @brief **required**\n
122 /// The state of this timer.
123 ///
124 /// @note @ref PVR_TIMER_STATE_NEW is default.
125 ///
126 ///
127 /// --------------------------------------------------------------------------
128 ///
129 /// **Example:**
130 /// ~~~~~~~~~~~~~{.cpp}
131 /// kodi::addon::PVRTimer tag;
132 /// tag.SetState(PVR_TIMER_STATE_RECORDING);
133 /// ~~~~~~~~~~~~~
134 ///
135 void SetState(PVR_TIMER_STATE state) { m_cStructure->state = state; }
136
137 /// @brief To get with @ref SetState changed values.
138 PVR_TIMER_STATE GetState() const { return m_cStructure->state; }
139
140 /// @brief **required**\n
141 /// The type of this timer.
142 ///
143 /// It is private to the addon and can be freely defined by the addon.
144 /// The value must be greater than @ref PVR_TIMER_TYPE_NONE.
145 ///
146 /// Kodi does not interpret this value (except for checking for @ref PVR_TIMER_TYPE_NONE),
147 /// but will pass the right id to the addon with every @ref PVRTimer instance,
148 /// thus the addon easily can determine the timer type.
149 ///
150 /// @note @ref PVR_TIMER_TYPE_NONE is default.
151 ///
152 ///
153 /// --------------------------------------------------------------------------
154 ///
155 /// **Example:**
156 /// ~~~~~~~~~~~~~{.cpp}
157 /// kodi::addon::PVRTimer tag;
158 /// tag.SetTimerType(123);
159 /// ~~~~~~~~~~~~~
160 ///
161 void SetTimerType(unsigned int timerType) { m_cStructure->iTimerType = timerType; }
162
163 /// @brief To get with @ref SetTimerType changed values.
164 unsigned int GetTimerType() const { return m_cStructure->iTimerType; }
165
166 /// @brief **required**\n
167 /// A title for this timer.
168 void SetTitle(const std::string& title)
169 {
170 strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1);
171 }
172
173 /// @brief To get with @ref SetTitle changed values.
174 std::string GetTitle() const { return m_cStructure->strTitle; }
175
176 /// @brief **optional**\n
177 /// For timers scheduled by a repeating timer.
178 ///
179 /// The index of the repeating timer that scheduled this timer (it's
180 /// @ref clientIndex value). Use @ref PVR_TIMER_NO_PARENT to indicate that
181 /// this timer was no scheduled by a repeating timer.
182 void SetParentClientIndex(unsigned int parentClientIndex)
183 {
184 m_cStructure->iParentClientIndex = parentClientIndex;
185 }
186
187 /// @brief To get with @ref SetParentClientIndex changed values.
188 unsigned int GetParentClientIndex() const { return m_cStructure->iParentClientIndex; }
189
190 /// @brief **optional**\n
191 /// Unique identifier of the channel to record on.
192 ///
193 /// @ref PVR_TIMER_ANY_CHANNEL will denote "any channel", not a specific one.
194 /// @ref PVR_CHANNEL_INVALID_UID denotes that channel uid is not available.
195 void SetClientChannelUid(int clientChannelUid)
196 {
197 m_cStructure->iClientChannelUid = clientChannelUid;
198 }
199
200 /// @brief To get with @ref SetClientChannelUid changed values
201 int GetClientChannelUid() const { return m_cStructure->iClientChannelUid; }
202
203 /// @brief **optional**\n
204 /// Start time of the recording in UTC.
205 ///
206 /// Instant timers that are sent to the add-on by Kodi will have this value
207 /// set to 0.
208 void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; }
209
210 /// @brief To get with @ref SetStartTime changed values.
211 time_t GetStartTime() const { return m_cStructure->startTime; }
212
213 /// @brief **optional**\n
214 /// End time of the recording in UTC.
215 void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; }
216
217 /// @brief To get with @ref SetEndTime changed values.
218 time_t GetEndTime() const { return m_cStructure->endTime; }
219
220 /// @brief **optional**\n
221 /// For EPG based (not Manual) timers indicates startTime does not apply.
222 ///
223 /// Default = false.
224 void SetStartAnyTime(bool startAnyTime) { m_cStructure->bStartAnyTime = startAnyTime; }
225
226 /// @brief To get with @ref SetStartAnyTime changed values.
227 bool GetStartAnyTime() const { return m_cStructure->bStartAnyTime; }
228
229 /// @brief **optional**\n
230 /// For EPG based (not Manual) timers indicates endTime does not apply.
231 ///
232 /// Default = false
233 void SetEndAnyTime(bool endAnyTime) { m_cStructure->bEndAnyTime = endAnyTime; }
234
235 /// @brief To get with @ref SetEndAnyTime changed values.
236 bool GetEndAnyTime() const { return m_cStructure->bEndAnyTime; }
237
238 /// @brief **optional**\n
239 /// A string used to search epg data for repeating epg-based timers.
240 ///
241 /// Format is backend-dependent, for example regexp.
242 void SetEPGSearchString(const std::string& epgSearchString)
243 {
244 strncpy(m_cStructure->strEpgSearchString, epgSearchString.c_str(),
245 sizeof(m_cStructure->strEpgSearchString) - 1);
246 }
247
248 /// @brief To get with @ref SetEPGSearchString changed values
249 std::string GetEPGSearchString() const { return m_cStructure->strEpgSearchString; }
250
251 /// @brief **optional**\n
252 /// Indicates, whether @ref SetEPGSearchString() is to match against the epg
253 /// episode title only or also against "other" epg data (backend-dependent).
254 void SetFullTextEpgSearch(bool fullTextEpgSearch)
255 {
256 m_cStructure->bFullTextEpgSearch = fullTextEpgSearch;
257 }
258
259 /// @brief To get with @ref SetFullTextEpgSearch changed values.
260 bool GetFullTextEpgSearch() const { return m_cStructure->bFullTextEpgSearch; }
261
262 /// @brief **optional**\n
263 /// The (relative) directory where the recording will be stored in.
264 void SetDirectory(const std::string& directory)
265 {
266 strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1);
267 }
268
269 /// @brief To get with @ref SetDirectory changed values.
270 std::string GetDirectory() const { return m_cStructure->strDirectory; }
271
272 /// @brief **optional**\n
273 /// The summary for this timer.
274 void SetSummary(const std::string& summary)
275 {
276 strncpy(m_cStructure->strSummary, summary.c_str(), sizeof(m_cStructure->strSummary) - 1);
277 }
278
279 /// @brief To get with @ref SetDirectory changed values.
280 std::string GetSummary() const { return m_cStructure->strSummary; }
281
282 /// @brief **optional**\n
283 /// The priority of this timer.
284 void SetPriority(int priority) { m_cStructure->iPriority = priority; }
285
286 /// @brief To get with @ref SetPriority changed values.
287 int GetPriority() const { return m_cStructure->iPriority; }
288
289 /// @brief **optional**\n
290 /// Lifetime of recordings created by this timer.
291 ///
292 /// Value > 0 days after which recordings will be deleted by the backend, < 0
293 /// addon defined integer list reference, == 0 disabled.
294 void SetLifetime(int priority) { m_cStructure->iLifetime = priority; }
295
296 /// @brief To get with @ref SetLifetime changed values.
297 int GetLifetime() const { return m_cStructure->iLifetime; }
298
299 /// @brief **optional**\n
300 /// Maximum number of recordings this timer shall create.
301 ///
302 /// Value > 0 number of recordings, < 0 addon defined integer list reference, == 0 disabled.
303 void SetMaxRecordings(int maxRecordings) { m_cStructure->iMaxRecordings = maxRecordings; }
304
305 /// @brief To get with @ref SetMaxRecordings changed values.
306 int GetMaxRecordings() const { return m_cStructure->iMaxRecordings; }
307
308 /// @brief **optional**\n
309 /// Integer ref to addon/backend defined list of recording groups.
310 void SetRecordingGroup(unsigned int recordingGroup)
311 {
312 m_cStructure->iRecordingGroup = recordingGroup;
313 }
314
315 /// @brief To get with @ref SetRecordingGroup changed values.
316 unsigned int GetRecordingGroup() const { return m_cStructure->iRecordingGroup; }
317
318 /// @brief **optional**\n
319 /// The first day this timer is active, for repeating timers.
320 void SetFirstDay(time_t firstDay) { m_cStructure->firstDay = firstDay; }
321
322 /// @brief To get with @ref SetFirstDay changed values.
323 time_t GetFirstDay() const { return m_cStructure->firstDay; }
324
325 /// @brief **optional**\n
326 /// Week days, for repeating timers (see
327 /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVR_WEEKDAY "PVR_WEEKDAY_*" constant values)
328 ///
329 /// @note @ref PVR_WEEKDAY_NONE is default.
330 ///
331 ///
332 /// --------------------------------------------------------------------------
333 ///
334 /// **Example:**
335 /// ~~~~~~~~~~~~~{.cpp}
336 /// ...
337 /// kodi::addon::PVRTimer tag;
338 /// tag.SetWeekdays(PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_SATURDAY);
339 /// ...
340 /// ~~~~~~~~~~~~~
341 void SetWeekdays(unsigned int weekdays) { m_cStructure->iWeekdays = weekdays; }
342
343 /// @brief To get with @ref SetFirstDay changed values.
344 unsigned int GetWeekdays() const { return m_cStructure->iWeekdays; }
345
346 /// @brief **optional**\n
347 /// Prevent duplicate episodes.
348 ///
349 /// Should 1 if backend should only record new episodes in case of a repeating
350 /// epg-based timer, 0 if all episodes shall be recorded (no duplicate detection).
351 ///
352 /// Actual algorithm for duplicate detection is defined by the backend.
353 /// Addons may define own values for different duplicate detection
354 /// algorithms, thus this is not just a bool.
355 void SetPreventDuplicateEpisodes(unsigned int preventDuplicateEpisodes)
356 {
357 m_cStructure->iPreventDuplicateEpisodes = preventDuplicateEpisodes;
358 }
359
360 /// @brief To get with @ref SetPreventDuplicateEpisodes changed values.
361 unsigned int GetPreventDuplicateEpisodes() const
362 {
363 return m_cStructure->iPreventDuplicateEpisodes;
364 }
365
366 /// @brief **optional**\n
367 /// EPG event id associated with this timer. Event ids must be unique for a
368 /// channel.
369 ///
370 /// Valid ids must be greater than @ref EPG_TAG_INVALID_UID.
371 void SetEPGUid(unsigned int epgUid) { m_cStructure->iEpgUid = epgUid; }
372
373 /// @brief To get with @ref SetEPGUid changed values.
374 unsigned int GetEPGUid() const { return m_cStructure->iEpgUid; }
375
376 /// @brief **optional**\n
377 /// If set, the backend starts the recording selected minutes before
378 /// @ref SetStartTime.
379 void SetMarginStart(unsigned int marginStart) { m_cStructure->iMarginStart = marginStart; }
380
381 /// @brief To get with @ref SetMarginStart changed values.
382 unsigned int GetMarginStart() const { return m_cStructure->iMarginStart; }
383
384 /// @brief **optional**\n
385 /// If set, the backend ends the recording selected minutes after
386 /// @ref SetEndTime.
387 void SetMarginEnd(unsigned int marginEnd) { m_cStructure->iMarginEnd = marginEnd; }
388
389 /// @brief To get with @ref SetMarginEnd changed values.
390 unsigned int GetMarginEnd() const { return m_cStructure->iMarginEnd; }
391
392 /// @brief **optional**\n
393 /// Genre type.
394 ///
395 /// @copydetails EPG_EVENT_CONTENTMASK
396 ///
397 /// --------------------------------------------------------------------------
398 ///
399 /// **Example:**
400 /// ~~~~~~~~~~~~~{.cpp}
401 /// ...
402 /// kodi::addon::PVRTimer tag;
403 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA);
404 /// ...
405 /// ~~~~~~~~~~~~~
406 ///
407 /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
408 /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here
409 /// with backend value.
410 ///
411 void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; }
412
413 /// @brief To get with @ref SetGenreType changed values.
414 int GetGenreType() const { return m_cStructure->iGenreType; }
415
416 /// @brief **optional**\n
417 /// Genre sub type.
418 ///
419 /// @copydetails EPG_EVENT_CONTENTMASK
420 ///
421 /// Subtypes groups related to set by @ref SetGenreType:
422 /// | Main genre type | List with available sub genre types
423 /// |-----------------|-----------------------------------------
424 /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0
425 /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA
426 /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS
427 /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW
428 /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS
429 /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH
430 /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE
431 /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE
432 /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS
433 /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE
434 /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES
435 /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL
436 /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you
437 ///
438 /// --------------------------------------------------------------------------
439 ///
440 /// **Example:**
441 /// ~~~~~~~~~~~~~{.cpp}
442 /// ...
443 /// kodi::addon::PVRTimer tag;
444 /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE);
445 /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ);
446 /// ...
447 /// ~~~~~~~~~~~~~
448 ///
449 void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; }
450
451 /// @brief To get with @ref SetGenreType changed values.
452 int GetGenreSubType() const { return m_cStructure->iGenreSubType; }
453
454 /// @brief **optional**\n
455 /// Series link for this timer.
456 ///
457 /// If set for an epg-based timer rule, matching events will be found by
458 /// checking with here, instead of @ref SetTitle() (and @ref SetFullTextEpgSearch()).
459 void SetSeriesLink(const std::string& seriesLink)
460 {
461 strncpy(m_cStructure->strSeriesLink, seriesLink.c_str(),
462 sizeof(m_cStructure->strSeriesLink) - 1);
463 }
464
465 /// @brief To get with @ref SetSeriesLink changed values.
466 std::string GetSeriesLink() const { return m_cStructure->strSeriesLink; }
467 ///@}
468
469private:
470 PVRTimer(const PVR_TIMER* data) : CStructHdl(data) {}
471 PVRTimer(PVR_TIMER* data) : CStructHdl(data) {}
472};
473
474///@}
475//------------------------------------------------------------------------------
476
477//==============================================================================
478/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet class PVRTimersResultSet
479/// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer
480/// @brief **PVR add-on timer transfer class**\n
481/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetTimers().
482///
483/// @note This becomes only be used on addon call above, not usable outside on
484/// addon itself.
485///@{
486class PVRTimersResultSet
487{
488public:
489 /*! \cond PRIVATE */
490 PVRTimersResultSet() = delete;
491 PVRTimersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle)
492 : m_instance(instance), m_handle(handle)
493 {
494 }
495 /*! \endcond */
496
497 /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet
498 ///@{
499
500 /// @brief To add and give content from addon to Kodi on related call.
501 ///
502 /// @param[in] tag The to transferred data.
503 void Add(const kodi::addon::PVRTimer& tag)
504 {
505 m_instance->toKodi->TransferTimerEntry(m_instance->toKodi->kodiInstance, m_handle, tag);
506 }
507
508 ///@}
509
510private:
511 const AddonInstance_PVR* m_instance = nullptr;
512 const ADDON_HANDLE m_handle;
513};
514///@}
515//------------------------------------------------------------------------------
516
517//==============================================================================
518/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType class PVRTimerType
519/// @ingroup cpp_kodi_addon_pvr_Defs_Timer
520/// @brief **PVR add-on timer type**\n
521/// To define the content of @ref kodi::addon::CInstancePVRClient::GetTimerTypes()
522/// given groups.
523///
524/// ----------------------------------------------------------------------------
525///
526/// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help
527///
528///@{
529class PVRTimerType : public CStructHdl<PVRTimerType, PVR_TIMER_TYPE>
530{
531 friend class CInstancePVRClient;
532
533public:
534 /*! \cond PRIVATE */
535 PVRTimerType()
536 {
537 memset(m_cStructure, 0, sizeof(PVR_TIMER_TYPE));
538 m_cStructure->iPrioritiesDefault = -1;
539 m_cStructure->iLifetimesDefault = -1;
540 m_cStructure->iPreventDuplicateEpisodesDefault = -1;
541 m_cStructure->iRecordingGroupDefault = -1;
542 m_cStructure->iMaxRecordingsDefault = -1;
543 }
544 PVRTimerType(const PVRTimerType& type) : CStructHdl(type) {}
545 /*! \endcond */
546
547 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help Value Help
548 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType
549 /// ----------------------------------------------------------------------------
550 ///
551 /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType :</b>
552 /// | Name | Type | Set call | Get call | Usage
553 /// |------|------|----------|----------|-----------
554 /// | **Identifier** | `unsigned int` | @ref PVRTimerType::SetId "SetId" | @ref PVRTimerType::GetId "GetId" | *required to set*
555 /// | **Attributes** | `unsigned int` | @ref PVRTimerType::SetAttributes "SetAttributes" | @ref PVRTimerType::GetAttributes "GetAttributes" | *required to set*
556 /// | **Description** | `std::string` | @ref PVRTimerType::SetDescription "SetDescription" | @ref PVRTimerType::GetDescription "GetDescription" | *optional*
557 /// | | | | | |
558 /// | **Priority selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPriorities "SetPriorities" | @ref PVRTimerType::GetPriorities "GetPriorities" | *optional*
559 /// | **Priority default selection** | `int`| @ref PVRTimerType::SetPrioritiesDefault "SetPrioritiesDefault" | @ref PVRTimerType::GetPrioritiesDefault "GetPrioritiesDefault" | *optional*
560 /// | | | | | |
561 /// | **Lifetime selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetLifetimes "SetLifetimes" | @ref PVRTimerType::GetLifetimes "GetLifetimes" | *optional*
562 /// | **Lifetime default selection** | `int`| @ref PVRTimerType::SetLifetimesDefault "SetLifetimesDefault" | @ref PVRTimerType::GetLifetimesDefault "GetLifetimesDefault" | *optional*
563 /// | | | | | |
564 /// | **Prevent duplicate episodes selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimerType::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional*
565 /// | **Prevent duplicate episodes default** | `int`| @ref PVRTimerType::SetPreventDuplicateEpisodesDefault "SetPreventDuplicateEpisodesDefault" | @ref PVRTimerType::GetPreventDuplicateEpisodesDefault "GetPreventDuplicateEpisodesDefault" | *optional*
566 /// | | | | | |
567 /// | **Recording group selection**| @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetRecordingGroups "SetRecordingGroups" | @ref PVRTimerType::GetRecordingGroups "GetRecordingGroups" | *optional*
568 /// | **Recording group default** | `int`| @ref PVRTimerType::SetRecordingGroupDefault "SetRecordingGroupDefault" | @ref PVRTimerType::GetRecordingGroupDefault "GetRecordingGroupDefault" | *optional*
569 /// | | | | | |
570 /// | **Max recordings selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimerType::GetMaxRecordings "GetMaxRecordings" | *optional*
571 /// | **Max recordings default** | `int`| @ref PVRTimerType::SetMaxRecordingsDefault "SetMaxRecordingsDefault" | @ref PVRTimerType::GetMaxRecordingsDefault "GetMaxRecordingsDefault" | *optional*
572 ///
573
574 /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType
575 ///@{
576
577 /// @brief **required**\n
578 /// This type's identifier. Ids must be > @ref PVR_TIMER_TYPE_NONE.
579 void SetId(unsigned int id) { m_cStructure->iId = id; }
580
581 /// @brief To get with @ref SetAttributes changed values.
582 unsigned int GetId() const { return m_cStructure->iId; }
583
584 /// @brief **required**\n
585 /// Defines the attributes for this type (@ref cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_TYPE "PVR_TIMER_TYPE_*" constants).
586 ///
587 /// To defines the attributes for a type. These values are bit fields that can be
588 /// used together.
589 ///
590 ///--------------------------------------------------------------------------
591 ///
592 /// **Example:**
593 /// ~~~~~~~~~~~~~{.cpp}
594 /// kodi::addon::PVRTimerType tag;
595 /// tag.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_REPEATING);
596 /// ~~~~~~~~~~~~~
597 ///
598 void SetAttributes(uint64_t attributes) { m_cStructure->iAttributes = attributes; }
599
600 /// @brief To get with @ref SetAttributes changed values.
601 uint64_t GetAttributes() const { return m_cStructure->iAttributes; }
602
603 /// @brief **optional**\n
604 /// A short localized string describing the purpose of the type. (e.g.
605 /// "Any time at this channel if title matches").
606 ///
607 /// If left blank, Kodi will generate a description based on the attributes
608 /// REPEATING and MANUAL. (e.g. "Repeating EPG-based.")
609 void SetDescription(const std::string& description)
610 {
611 strncpy(m_cStructure->strDescription, description.c_str(),
612 sizeof(m_cStructure->strDescription) - 1);
613 }
614
615 /// @brief To get with @ref SetDescription changed values.
616 std::string GetDescription() const { return m_cStructure->strDescription; }
617
618 //----------------------------------------------------------------------------
619
620 /// @brief **optional**\n
621 /// Priority value definitions.
622 ///
623 /// Array containing the possible values for @ref PVRTimer::SetPriority().
624 ///
625 /// @param[in] priorities List of priority values
626 /// @param[in] prioritiesDefault [opt] The default value in list, can also be
627 /// set by @ref SetPrioritiesDefault()
628 ///
629 /// --------------------------------------------------------------------------
630 ///
631 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
632 void SetPriorities(const std::vector<PVRTypeIntValue>& priorities, int prioritiesDefault = -1)
633 {
634 m_cStructure->iPrioritiesSize = static_cast<unsigned int>(priorities.size());
635 for (unsigned int i = 0;
636 i < m_cStructure->iPrioritiesSize && i < sizeof(m_cStructure->priorities); ++i)
637 {
638 m_cStructure->priorities[i].iValue = priorities[i].GetCStructure()->iValue;
639 strncpy(m_cStructure->priorities[i].strDescription,
640 priorities[i].GetCStructure()->strDescription,
641 sizeof(m_cStructure->priorities[i].strDescription) - 1);
642 }
643 if (prioritiesDefault != -1)
644 m_cStructure->iPrioritiesDefault = prioritiesDefault;
645 }
646
647 /// @brief To get with @ref SetPriorities changed values.
648 std::vector<PVRTypeIntValue> GetPriorities() const
649 {
650 std::vector<PVRTypeIntValue> ret;
651 for (unsigned int i = 0; i < m_cStructure->iPrioritiesSize; ++i)
652 ret.emplace_back(m_cStructure->priorities[i].iValue,
653 m_cStructure->priorities[i].strDescription);
654 return ret;
655 }
656
657 /// @brief **optional**\n
658 /// The default value for @ref PVRTimer::SetPriority().
659 ///
660 /// @note Must be filled if @ref SetPriorities contain values and not
661 /// defined there on second function value.
662 void SetPrioritiesDefault(int prioritiesDefault)
663 {
664 m_cStructure->iPrioritiesDefault = prioritiesDefault;
665 }
666
667 /// @brief To get with @ref SetPrioritiesDefault changed values.
668 int GetPrioritiesDefault() const { return m_cStructure->iPrioritiesDefault; }
669
670 //----------------------------------------------------------------------------
671
672 /// @brief **optional**\n
673 /// Lifetime value definitions.
674 ///
675 /// Array containing the possible values for @ref PVRTimer::SetLifetime().
676 ///
677 /// @param[in] lifetimes List of lifetimes values
678 /// @param[in] lifetimesDefault [opt] The default value in list, can also be
679 /// set by @ref SetLifetimesDefault()
680 ///
681 /// --------------------------------------------------------------------------
682 ///
683 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
684 void SetLifetimes(const std::vector<PVRTypeIntValue>& lifetimes, int lifetimesDefault = -1)
685 {
686 m_cStructure->iLifetimesSize = static_cast<unsigned int>(lifetimes.size());
687 for (unsigned int i = 0;
688 i < m_cStructure->iLifetimesSize && i < sizeof(m_cStructure->lifetimes); ++i)
689 {
690 m_cStructure->lifetimes[i].iValue = lifetimes[i].GetCStructure()->iValue;
691 strncpy(m_cStructure->lifetimes[i].strDescription,
692 lifetimes[i].GetCStructure()->strDescription,
693 sizeof(m_cStructure->lifetimes[i].strDescription) - 1);
694 }
695 if (lifetimesDefault != -1)
696 m_cStructure->iLifetimesDefault = lifetimesDefault;
697 }
698
699 /// @brief To get with @ref SetLifetimes changed values.
700 std::vector<PVRTypeIntValue> GetLifetimes() const
701 {
702 std::vector<PVRTypeIntValue> ret;
703 for (unsigned int i = 0; i < m_cStructure->iLifetimesSize; ++i)
704 ret.emplace_back(m_cStructure->lifetimes[i].iValue,
705 m_cStructure->lifetimes[i].strDescription);
706 return ret;
707 }
708
709 /// @brief **optional**\n
710 /// The default value for @ref SetLifetimes().
711 ///
712 /// @note Must be filled if @ref SetLifetimes contain values and not
713 /// defined there on second function value.
714 void SetLifetimesDefault(int lifetimesDefault)
715 {
716 m_cStructure->iLifetimesDefault = lifetimesDefault;
717 }
718
719 /// @brief To get with @ref SetLifetimesDefault changed values.
720 int GetLifetimesDefault() const { return m_cStructure->iLifetimesDefault; }
721
722 //----------------------------------------------------------------------------
723
724 /// @brief **optional**\n
725 /// Prevent duplicate episodes value definitions.
726 ///
727 /// Array containing the possible values for @ref PVRTimer::SetPreventDuplicateEpisodes().
728 ///
729 /// @note Must be filled if @ref PVRTimer::SetPreventDuplicateEpisodes() is not empty.
730 ///
731 /// @param[in] preventDuplicateEpisodes List of duplicate episodes values
732 /// @param[in] preventDuplicateEpisodesDefault [opt] The default value in list, can also be
733 /// set by @ref SetPreventDuplicateEpisodesDefault()
734 ///
735 /// --------------------------------------------------------------------------
736 ///
737 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
738 void SetPreventDuplicateEpisodes(
739 const std::vector<PVRTypeIntValue>& preventDuplicateEpisodes,
740 int preventDuplicateEpisodesDefault = -1)
741 {
742 m_cStructure->iPreventDuplicateEpisodesSize =
743 static_cast<unsigned int>(preventDuplicateEpisodes.size());
744 for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize &&
745 i < sizeof(m_cStructure->preventDuplicateEpisodes);
746 ++i)
747 {
748 m_cStructure->preventDuplicateEpisodes[i].iValue =
749 preventDuplicateEpisodes[i].GetCStructure()->iValue;
750 strncpy(m_cStructure->preventDuplicateEpisodes[i].strDescription,
751 preventDuplicateEpisodes[i].GetCStructure()->strDescription,
752 sizeof(m_cStructure->preventDuplicateEpisodes[i].strDescription) - 1);
753 }
754 if (preventDuplicateEpisodesDefault != -1)
755 m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault;
756 }
757
758 /// @brief To get with @ref SetPreventDuplicateEpisodes changed values.
759 std::vector<PVRTypeIntValue> GetPreventDuplicateEpisodes() const
760 {
761 std::vector<PVRTypeIntValue> ret;
762 for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize; ++i)
763 ret.emplace_back(m_cStructure->preventDuplicateEpisodes[i].iValue,
764 m_cStructure->preventDuplicateEpisodes[i].strDescription);
765 return ret;
766 }
767
768 /// @brief **optional**\n
769 /// The default value for @ref PVRTimer::SetPreventDuplicateEpisodes().
770 ///
771 /// @note Must be filled if @ref SetPreventDuplicateEpisodes contain values and not
772 /// defined there on second function value.
773 void SetPreventDuplicateEpisodesDefault(int preventDuplicateEpisodesDefault)
774 {
775 m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault;
776 }
777
778 /// @brief To get with @ref SetPreventDuplicateEpisodesDefault changed values.
779 int GetPreventDuplicateEpisodesDefault() const
780 {
781 return m_cStructure->iPreventDuplicateEpisodesDefault;
782 }
783
784 //----------------------------------------------------------------------------
785
786 /// @brief **optional**\n
787 /// Array containing the possible values of @ref PVRTimer::SetRecordingGroup()
788 ///
789 /// @param[in] recordingGroup List of recording group values
790 /// @param[in] recordingGroupDefault [opt] The default value in list, can also be
791 /// set by @ref SetRecordingGroupDefault()
792 ///
793 /// --------------------------------------------------------------------------
794 ///
795 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
796 void SetRecordingGroups(const std::vector<PVRTypeIntValue>& recordingGroup,
797 int recordingGroupDefault = -1)
798 {
799 m_cStructure->iRecordingGroupSize = static_cast<unsigned int>(recordingGroup.size());
800 for (unsigned int i = 0;
801 i < m_cStructure->iRecordingGroupSize && i < sizeof(m_cStructure->recordingGroup); ++i)
802 {
803 m_cStructure->recordingGroup[i].iValue = recordingGroup[i].GetCStructure()->iValue;
804 strncpy(m_cStructure->recordingGroup[i].strDescription,
805 recordingGroup[i].GetCStructure()->strDescription,
806 sizeof(m_cStructure->recordingGroup[i].strDescription) - 1);
807 }
808 if (recordingGroupDefault != -1)
809 m_cStructure->iRecordingGroupDefault = recordingGroupDefault;
810 }
811
812 /// @brief To get with @ref SetRecordingGroups changed values
813 std::vector<PVRTypeIntValue> GetRecordingGroups() const
814 {
815 std::vector<PVRTypeIntValue> ret;
816 for (unsigned int i = 0; i < m_cStructure->iRecordingGroupSize; ++i)
817 ret.emplace_back(m_cStructure->recordingGroup[i].iValue,
818 m_cStructure->recordingGroup[i].strDescription);
819 return ret;
820 }
821
822 /// @brief **optional**\n
823 /// The default value for @ref PVRTimer::SetRecordingGroup().
824 ///
825 /// @note Must be filled if @ref SetRecordingGroups contain values and not
826 /// defined there on second function value.
827 void SetRecordingGroupDefault(int recordingGroupDefault)
828 {
829 m_cStructure->iRecordingGroupDefault = recordingGroupDefault;
830 }
831
832 /// @brief To get with @ref SetRecordingGroupDefault changed values
833 int GetRecordingGroupDefault() const { return m_cStructure->iRecordingGroupDefault; }
834
835 //----------------------------------------------------------------------------
836
837 /// @brief **optional**\n
838 /// Array containing the possible values of @ref PVRTimer::SetMaxRecordings().
839 ///
840 /// @param[in] maxRecordings List of lifetimes values
841 /// @param[in] maxRecordingsDefault [opt] The default value in list, can also be
842 /// set by @ref SetMaxRecordingsDefault()
843 ///
844 /// --------------------------------------------------------------------------
845 ///
846 /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
847 void SetMaxRecordings(const std::vector<PVRTypeIntValue>& maxRecordings,
848 int maxRecordingsDefault = -1)
849 {
850 m_cStructure->iMaxRecordingsSize = static_cast<unsigned int>(maxRecordings.size());
851 for (unsigned int i = 0;
852 i < m_cStructure->iMaxRecordingsSize && i < sizeof(m_cStructure->maxRecordings); ++i)
853 {
854 m_cStructure->maxRecordings[i].iValue = maxRecordings[i].GetCStructure()->iValue;
855 strncpy(m_cStructure->maxRecordings[i].strDescription,
856 maxRecordings[i].GetCStructure()->strDescription,
857 sizeof(m_cStructure->maxRecordings[i].strDescription) - 1);
858 }
859 if (maxRecordingsDefault != -1)
860 m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault;
861 }
862
863 /// @brief To get with @ref SetMaxRecordings changed values
864 std::vector<PVRTypeIntValue> GetMaxRecordings() const
865 {
866 std::vector<PVRTypeIntValue> ret;
867 for (unsigned int i = 0; i < m_cStructure->iMaxRecordingsSize; ++i)
868 ret.emplace_back(m_cStructure->maxRecordings[i].iValue,
869 m_cStructure->maxRecordings[i].strDescription);
870 return ret;
871 }
872
873 /// @brief **optional**\n
874 /// The default value for @ref SetMaxRecordings().
875 ///
876 /// Can be set with here if on @ref SetMaxRecordings not given as second value.
877 void SetMaxRecordingsDefault(int maxRecordingsDefault)
878 {
879 m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault;
880 }
881
882 /// @brief To get with @ref SetMaxRecordingsDefault changed values
883 int GetMaxRecordingsDefault() const { return m_cStructure->iMaxRecordingsDefault; }
884 ///@}
885
886private:
887 PVRTimerType(const PVR_TIMER_TYPE* type) : CStructHdl(type) {}
888 PVRTimerType(PVR_TIMER_TYPE* type) : CStructHdl(type) {}
889};
890///@}
891//------------------------------------------------------------------------------
892
893} /* namespace addon */
894} /* namespace kodi */
895
896#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/CMakeLists.txt
deleted file mode 100644
index d7b2269..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
1set(HEADERS addon_base.h
2 audio_engine.h
3 filesystem.h
4 general.h
5 network.h)
6
7if(NOT ENABLE_STATIC_LIBS)
8 core_add_library(addons_kodi-addon-dev-kit_include_kodi_c-api)
9endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt
deleted file mode 100644
index dfcfe66..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
1set(HEADERS image_decoder.h
2 pvr.h)
3
4if(NOT ENABLE_STATIC_LIBS)
5 core_add_library(addons_kodi-addon-dev-kit_include_kodi_c-api_addon-instance)
6endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h
deleted file mode 100644
index 595a5dc..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h
+++ /dev/null
@@ -1,78 +0,0 @@
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 "../addon_base.h"
12
13#ifdef __cplusplus
14extern "C"
15{
16#endif /* __cplusplus */
17
18 //============================================================================
19 /// @ingroup cpp_kodi_addon_imagedecoder_Defs
20 /// @brief **Image format types**\n
21 /// Used to define wanted target format where image decoder should give to
22 /// Kodi.
23 ///
24 typedef enum ImageFormat
25 {
26 /// @brief A 32-bit ARGB pixel format, with alpha, that uses 8 bits per
27 /// channel, ARGBARGB...
28 ADDON_IMG_FMT_A8R8G8B8 = 1,
29
30 /// @brief A 8, alpha only, 8bpp, AAA...
31 ADDON_IMG_FMT_A8 = 2,
32
33 /// @brief RGBA 8:8:8:8, with alpha, 32bpp, RGBARGBA...
34 ADDON_IMG_FMT_RGBA8 = 3,
35
36 /// @brief RGB 8:8:8, with alpha, 24bpp, RGBRGB...
37 ADDON_IMG_FMT_RGB8 = 4
38 } ImageFormat;
39 //----------------------------------------------------------------------------
40
41 typedef struct AddonProps_ImageDecoder
42 {
43 const char* mimetype;
44 } AddonProps_ImageDecoder;
45
46 typedef struct AddonToKodiFuncTable_ImageDecoder
47 {
48 KODI_HANDLE kodi_instance;
49 } AddonToKodiFuncTable_ImageDecoder;
50
51 struct AddonInstance_ImageDecoder;
52 typedef struct KodiToAddonFuncTable_ImageDecoder
53 {
54 KODI_HANDLE addonInstance;
55 bool(__cdecl* load_image_from_memory)(const struct AddonInstance_ImageDecoder* instance,
56 unsigned char* buffer,
57 unsigned int buf_size,
58 unsigned int* width,
59 unsigned int* height);
60
61 bool(__cdecl* decode)(const struct AddonInstance_ImageDecoder* instance,
62 unsigned char* pixels,
63 unsigned int width,
64 unsigned int height,
65 unsigned int pitch,
66 enum ImageFormat format);
67 } KodiToAddonFuncTable_ImageDecoder;
68
69 typedef struct AddonInstance_ImageDecoder
70 {
71 struct AddonProps_ImageDecoder* props;
72 struct AddonToKodiFuncTable_ImageDecoder* toKodi;
73 struct KodiToAddonFuncTable_ImageDecoder* toAddon;
74 } AddonInstance_ImageDecoder;
75
76#ifdef __cplusplus
77} /* extern "C" */
78#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr.h
deleted file mode 100644
index 2d255ad..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr.h
+++ /dev/null
@@ -1,327 +0,0 @@
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 "../../AddonBase.h"
12#include "pvr/pvr_channel_groups.h"
13#include "pvr/pvr_channels.h"
14#include "pvr/pvr_defines.h"
15#include "pvr/pvr_edl.h"
16#include "pvr/pvr_epg.h"
17#include "pvr/pvr_general.h"
18#include "pvr/pvr_menu_hook.h"
19#include "pvr/pvr_recordings.h"
20#include "pvr/pvr_stream.h"
21#include "pvr/pvr_timers.h"
22
23//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
24// "C" main interface function tables between Kodi and addon
25//
26// Values related to all parts and not used direct on addon, are to define here.
27//
28#ifdef __cplusplus
29extern "C"
30{
31#endif /* __cplusplus */
32
33 /*!
34 * @internal
35 * @brief PVR "C" basis API interface
36 *
37 * This field contains things that are exchanged between Kodi and Addon
38 * and is the basis of the PVR-side "C" API.
39 *
40 * @warning Care should be taken when making changes in this fields!\n
41 * Changes can destroy API in addons that have already been created. If a
42 * necessary change or new feature is added, the version of the PVR
43 * at @ref ADDON_INSTANCE_VERSION_PVR_MIN must be increased too.\n
44 * \n
45 * Conditional changes can be made in some places, without min PVR version
46 * increase. The add-on should then use CreateInstanceEx and add partial tests
47 * for this in the C++ header.
48 *
49 * Have by add of new parts a look about **Doxygen** `\\ingroup`, so that
50 * added parts included in documentation.
51 *
52 * If you add addon side related documentation, where his dev need know,
53 * use `///`. For parts only for Kodi make it like here.
54 *
55 * @endinternal
56 */
57
58 struct AddonInstance_PVR;
59
60 /*!
61 * @brief Structure to define typical standard values
62 */
63 typedef struct AddonProperties_PVR
64 {
65 const char* strUserPath;
66 const char* strClientPath;
67 int iEpgMaxDays;
68 } AddonProperties_PVR;
69
70 /*!
71 * @brief Structure to transfer the methods from Kodi to addon
72 */
73 typedef struct AddonToKodiFuncTable_PVR
74 {
75 // Pointer inside Kodi where used from him to find his class
76 KODI_HANDLE kodiInstance;
77
78 //--==----==----==----==----==----==----==----==----==----==----==----==----==
79 // General callback functions
80 void (*AddMenuHook)(void* kodiInstance, const struct PVR_MENUHOOK* hook);
81 void (*RecordingNotification)(void* kodiInstance,
82 const char* name,
83 const char* fileName,
84 bool on);
85 void (*ConnectionStateChange)(void* kodiInstance,
86 const char* strConnectionString,
87 enum PVR_CONNECTION_STATE newState,
88 const char* strMessage);
89 void (*EpgEventStateChange)(void* kodiInstance,
90 struct EPG_TAG* tag,
91 enum EPG_EVENT_STATE newState);
92
93 //--==----==----==----==----==----==----==----==----==----==----==----==----==
94 // Transfer functions where give data back to Kodi, e.g. GetChannels calls TransferChannelEntry
95 void (*TransferChannelEntry)(void* kodiInstance,
96 const ADDON_HANDLE handle,
97 const struct PVR_CHANNEL* chan);
98 void (*TransferChannelGroup)(void* kodiInstance,
99 const ADDON_HANDLE handle,
100 const struct PVR_CHANNEL_GROUP* group);
101 void (*TransferChannelGroupMember)(void* kodiInstance,
102 const ADDON_HANDLE handle,
103 const struct PVR_CHANNEL_GROUP_MEMBER* member);
104 void (*TransferEpgEntry)(void* kodiInstance,
105 const ADDON_HANDLE handle,
106 const struct EPG_TAG* epgentry);
107 void (*TransferRecordingEntry)(void* kodiInstance,
108 const ADDON_HANDLE handle,
109 const struct PVR_RECORDING* recording);
110 void (*TransferTimerEntry)(void* kodiInstance,
111 const ADDON_HANDLE handle,
112 const struct PVR_TIMER* timer);
113
114 //--==----==----==----==----==----==----==----==----==----==----==----==----==
115 // Kodi inform interface functions
116 void (*TriggerChannelUpdate)(void* kodiInstance);
117 void (*TriggerChannelGroupsUpdate)(void* kodiInstance);
118 void (*TriggerEpgUpdate)(void* kodiInstance, unsigned int iChannelUid);
119 void (*TriggerRecordingUpdate)(void* kodiInstance);
120 void (*TriggerTimerUpdate)(void* kodiInstance);
121
122 //--==----==----==----==----==----==----==----==----==----==----==----==----==
123 // Stream demux interface functions
124 void (*FreeDemuxPacket)(void* kodiInstance, struct DemuxPacket* pPacket);
125 struct DemuxPacket* (*AllocateDemuxPacket)(void* kodiInstance, int iDataSize);
126 struct PVR_CODEC (*GetCodecByName)(const void* kodiInstance, const char* strCodecName);
127
128 //--==----==----==----==----==----==----==----==----==----==----==----==----==
129 // New functions becomes added below and can be on another API change (where
130 // breaks min API version) moved up.
131 } AddonToKodiFuncTable_PVR;
132
133 /*!
134 * @brief Structure to transfer the methods from addon to Kodi
135 */
136 typedef struct KodiToAddonFuncTable_PVR
137 {
138 // Pointer inside addon where used on them to find his instance class (currently unused!)
139 KODI_HANDLE addonInstance;
140
141 //--==----==----==----==----==----==----==----==----==----==----==----==----==
142 // General interface functions
143 enum PVR_ERROR(__cdecl* GetCapabilities)(const struct AddonInstance_PVR*,
144 struct PVR_ADDON_CAPABILITIES*);
145 enum PVR_ERROR(__cdecl* GetBackendName)(const struct AddonInstance_PVR*, char*, int);
146 enum PVR_ERROR(__cdecl* GetBackendVersion)(const struct AddonInstance_PVR*, char*, int);
147 enum PVR_ERROR(__cdecl* GetBackendHostname)(const struct AddonInstance_PVR*, char*, int);
148 enum PVR_ERROR(__cdecl* GetConnectionString)(const struct AddonInstance_PVR*, char*, int);
149 enum PVR_ERROR(__cdecl* GetDriveSpace)(const struct AddonInstance_PVR*, uint64_t*, uint64_t*);
150 enum PVR_ERROR(__cdecl* CallSettingsMenuHook)(const struct AddonInstance_PVR*,
151 const struct PVR_MENUHOOK*);
152
153 //--==----==----==----==----==----==----==----==----==----==----==----==----==
154 // Channel interface functions
155
156 enum PVR_ERROR(__cdecl* GetChannelsAmount)(const struct AddonInstance_PVR*, int*);
157 enum PVR_ERROR(__cdecl* GetChannels)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool);
158 enum PVR_ERROR(__cdecl* GetChannelStreamProperties)(const struct AddonInstance_PVR*,
159 const struct PVR_CHANNEL*,
160 struct PVR_NAMED_VALUE*,
161 unsigned int*);
162 enum PVR_ERROR(__cdecl* GetSignalStatus)(const struct AddonInstance_PVR*,
163 int,
164 struct PVR_SIGNAL_STATUS*);
165 enum PVR_ERROR(__cdecl* GetDescrambleInfo)(const struct AddonInstance_PVR*,
166 int,
167 struct PVR_DESCRAMBLE_INFO*);
168
169 //--==----==----==----==----==----==----==----==----==----==----==----==----==
170 // Channel group interface functions
171 enum PVR_ERROR(__cdecl* GetChannelGroupsAmount)(const struct AddonInstance_PVR*, int*);
172 enum PVR_ERROR(__cdecl* GetChannelGroups)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool);
173 enum PVR_ERROR(__cdecl* GetChannelGroupMembers)(const struct AddonInstance_PVR*,
174 ADDON_HANDLE,
175 const struct PVR_CHANNEL_GROUP*);
176
177 //--==----==----==----==----==----==----==----==----==----==----==----==----==
178 // Channel edit interface functions
179 enum PVR_ERROR(__cdecl* DeleteChannel)(const struct AddonInstance_PVR*,
180 const struct PVR_CHANNEL*);
181 enum PVR_ERROR(__cdecl* RenameChannel)(const struct AddonInstance_PVR*,
182 const struct PVR_CHANNEL*);
183 enum PVR_ERROR(__cdecl* OpenDialogChannelSettings)(const struct AddonInstance_PVR*,
184 const struct PVR_CHANNEL*);
185 enum PVR_ERROR(__cdecl* OpenDialogChannelAdd)(const struct AddonInstance_PVR*,
186 const struct PVR_CHANNEL*);
187 enum PVR_ERROR(__cdecl* OpenDialogChannelScan)(const struct AddonInstance_PVR*);
188 enum PVR_ERROR(__cdecl* CallChannelMenuHook)(const struct AddonInstance_PVR*,
189 const PVR_MENUHOOK*,
190 const PVR_CHANNEL*);
191
192 //--==----==----==----==----==----==----==----==----==----==----==----==----==
193 // EPG interface functions
194 enum PVR_ERROR(__cdecl* GetEPGForChannel)(
195 const struct AddonInstance_PVR*, ADDON_HANDLE, int, time_t, time_t);
196 enum PVR_ERROR(__cdecl* IsEPGTagRecordable)(const struct AddonInstance_PVR*,
197 const struct EPG_TAG*,
198 bool*);
199 enum PVR_ERROR(__cdecl* IsEPGTagPlayable)(const struct AddonInstance_PVR*,
200 const struct EPG_TAG*,
201 bool*);
202 enum PVR_ERROR(__cdecl* GetEPGTagEdl)(const struct AddonInstance_PVR*,
203 const struct EPG_TAG*,
204 struct PVR_EDL_ENTRY[],
205 int*);
206 enum PVR_ERROR(__cdecl* GetEPGTagStreamProperties)(const struct AddonInstance_PVR*,
207 const struct EPG_TAG*,
208 struct PVR_NAMED_VALUE*,
209 unsigned int*);
210 enum PVR_ERROR(__cdecl* SetEPGTimeFrame)(const struct AddonInstance_PVR*, int);
211 enum PVR_ERROR(__cdecl* CallEPGMenuHook)(const struct AddonInstance_PVR*,
212 const struct PVR_MENUHOOK*,
213 const struct EPG_TAG*);
214
215 //--==----==----==----==----==----==----==----==----==----==----==----==----==
216 // Recording interface functions
217 enum PVR_ERROR(__cdecl* GetRecordingsAmount)(const struct AddonInstance_PVR*, bool, int*);
218 enum PVR_ERROR(__cdecl* GetRecordings)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool);
219 enum PVR_ERROR(__cdecl* DeleteRecording)(const struct AddonInstance_PVR*,
220 const struct PVR_RECORDING*);
221 enum PVR_ERROR(__cdecl* UndeleteRecording)(const struct AddonInstance_PVR*,
222 const struct PVR_RECORDING*);
223 enum PVR_ERROR(__cdecl* DeleteAllRecordingsFromTrash)(const struct AddonInstance_PVR*);
224 enum PVR_ERROR(__cdecl* RenameRecording)(const struct AddonInstance_PVR*,
225 const struct PVR_RECORDING*);
226 enum PVR_ERROR(__cdecl* SetRecordingLifetime)(const struct AddonInstance_PVR*,
227 const struct PVR_RECORDING*);
228 enum PVR_ERROR(__cdecl* SetRecordingPlayCount)(const struct AddonInstance_PVR*,
229 const struct PVR_RECORDING*,
230 int);
231 enum PVR_ERROR(__cdecl* SetRecordingLastPlayedPosition)(const struct AddonInstance_PVR*,
232 const struct PVR_RECORDING*,
233 int);
234 enum PVR_ERROR(__cdecl* GetRecordingLastPlayedPosition)(const struct AddonInstance_PVR*,
235 const struct PVR_RECORDING*,
236 int*);
237 enum PVR_ERROR(__cdecl* GetRecordingEdl)(const struct AddonInstance_PVR*,
238 const struct PVR_RECORDING*,
239 struct PVR_EDL_ENTRY[],
240 int*);
241 enum PVR_ERROR(__cdecl* GetRecordingSize)(const struct AddonInstance_PVR*,
242 const PVR_RECORDING*,
243 int64_t*);
244 enum PVR_ERROR(__cdecl* GetRecordingStreamProperties)(const struct AddonInstance_PVR*,
245 const struct PVR_RECORDING*,
246 struct PVR_NAMED_VALUE*,
247 unsigned int*);
248 enum PVR_ERROR(__cdecl* CallRecordingMenuHook)(const struct AddonInstance_PVR*,
249 const struct PVR_MENUHOOK*,
250 const struct PVR_RECORDING*);
251
252 //--==----==----==----==----==----==----==----==----==----==----==----==----==
253 // Timer interface functions
254 enum PVR_ERROR(__cdecl* GetTimerTypes)(const struct AddonInstance_PVR*,
255 struct PVR_TIMER_TYPE[],
256 int*);
257 enum PVR_ERROR(__cdecl* GetTimersAmount)(const struct AddonInstance_PVR*, int*);
258 enum PVR_ERROR(__cdecl* GetTimers)(const struct AddonInstance_PVR*, ADDON_HANDLE);
259 enum PVR_ERROR(__cdecl* AddTimer)(const struct AddonInstance_PVR*, const struct PVR_TIMER*);
260 enum PVR_ERROR(__cdecl* DeleteTimer)(const struct AddonInstance_PVR*,
261 const struct PVR_TIMER*,
262 bool);
263 enum PVR_ERROR(__cdecl* UpdateTimer)(const struct AddonInstance_PVR*, const struct PVR_TIMER*);
264 enum PVR_ERROR(__cdecl* CallTimerMenuHook)(const struct AddonInstance_PVR*,
265 const struct PVR_MENUHOOK*,
266 const struct PVR_TIMER*);
267
268 //--==----==----==----==----==----==----==----==----==----==----==----==----==
269 // Powersaving interface functions
270 enum PVR_ERROR(__cdecl* OnSystemSleep)(const struct AddonInstance_PVR*);
271 enum PVR_ERROR(__cdecl* OnSystemWake)(const struct AddonInstance_PVR*);
272 enum PVR_ERROR(__cdecl* OnPowerSavingActivated)(const struct AddonInstance_PVR*);
273 enum PVR_ERROR(__cdecl* OnPowerSavingDeactivated)(const struct AddonInstance_PVR*);
274
275 //--==----==----==----==----==----==----==----==----==----==----==----==----==
276 // Live stream read interface functions
277 bool(__cdecl* OpenLiveStream)(const struct AddonInstance_PVR*, const struct PVR_CHANNEL*);
278 void(__cdecl* CloseLiveStream)(const struct AddonInstance_PVR*);
279 int(__cdecl* ReadLiveStream)(const struct AddonInstance_PVR*, unsigned char*, unsigned int);
280 int64_t(__cdecl* SeekLiveStream)(const struct AddonInstance_PVR*, int64_t, int);
281 int64_t(__cdecl* LengthLiveStream)(const struct AddonInstance_PVR*);
282
283 //--==----==----==----==----==----==----==----==----==----==----==----==----==
284 // Recording stream read interface functions
285 bool(__cdecl* OpenRecordedStream)(const struct AddonInstance_PVR*, const struct PVR_RECORDING*);
286 void(__cdecl* CloseRecordedStream)(const struct AddonInstance_PVR*);
287 int(__cdecl* ReadRecordedStream)(const struct AddonInstance_PVR*, unsigned char*, unsigned int);
288 int64_t(__cdecl* SeekRecordedStream)(const struct AddonInstance_PVR*, int64_t, int);
289 int64_t(__cdecl* LengthRecordedStream)(const struct AddonInstance_PVR*);
290
291 //--==----==----==----==----==----==----==----==----==----==----==----==----==
292 // Stream demux interface functions
293 enum PVR_ERROR(__cdecl* GetStreamProperties)(const struct AddonInstance_PVR*,
294 struct PVR_STREAM_PROPERTIES*);
295 struct DemuxPacket*(__cdecl* DemuxRead)(const struct AddonInstance_PVR*);
296 void(__cdecl* DemuxReset)(const struct AddonInstance_PVR*);
297 void(__cdecl* DemuxAbort)(const struct AddonInstance_PVR*);
298 void(__cdecl* DemuxFlush)(const struct AddonInstance_PVR*);
299 void(__cdecl* SetSpeed)(const struct AddonInstance_PVR*, int);
300 void(__cdecl* FillBuffer)(const struct AddonInstance_PVR*, bool);
301 bool(__cdecl* SeekTime)(const struct AddonInstance_PVR*, double, bool, double*);
302
303 //--==----==----==----==----==----==----==----==----==----==----==----==----==
304 // General stream interface functions
305 bool(__cdecl* CanPauseStream)(const struct AddonInstance_PVR*);
306 void(__cdecl* PauseStream)(const struct AddonInstance_PVR*, bool);
307 bool(__cdecl* CanSeekStream)(const struct AddonInstance_PVR*);
308 bool(__cdecl* IsRealTimeStream)(const struct AddonInstance_PVR*);
309 enum PVR_ERROR(__cdecl* GetStreamTimes)(const struct AddonInstance_PVR*,
310 struct PVR_STREAM_TIMES*);
311 enum PVR_ERROR(__cdecl* GetStreamReadChunkSize)(const struct AddonInstance_PVR*, int*);
312
313 //--==----==----==----==----==----==----==----==----==----==----==----==----==
314 // New functions becomes added below and can be on another API change (where
315 // breaks min API version) moved up.
316 } KodiToAddonFuncTable_PVR;
317
318 typedef struct AddonInstance_PVR
319 {
320 struct AddonProperties_PVR* props;
321 struct AddonToKodiFuncTable_PVR* toKodi;
322 struct KodiToAddonFuncTable_PVR* toAddon;
323 } AddonInstance_PVR;
324
325#ifdef __cplusplus
326}
327#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt
deleted file mode 100644
index 6617084..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
1set(HEADERS pvr_channel_groups.h
2 pvr_channels.h
3 pvr_defines.h
4 pvr_edl.h
5 pvr_epg.h
6 pvr_general.h
7 pvr_menu_hook.h
8 pvr_recordings.h
9 pvr_stream.h
10 pvr_timers.h)
11
12if(NOT ENABLE_STATIC_LIBS)
13 core_add_library(addons_kodi-addon-dev-kit_include_kodi_c-api_addon-instance_pvr)
14endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channel_groups.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channel_groups.h
deleted file mode 100644
index 36f9ed6..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channel_groups.h
+++ /dev/null
@@ -1,54 +0,0 @@
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 "pvr_defines.h"
12
13#include <stdbool.h>
14
15//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
16// "C" Definitions group 3 - PVR channel group
17#ifdef __cplusplus
18extern "C"
19{
20#endif /* __cplusplus */
21
22 /*!
23 * @brief "C" PVR add-on channel group.
24 *
25 * Structure used to interface in "C" between Kodi and Addon.
26 *
27 * See @ref kodi::addon::PVRChannelGroup for description of values.
28 */
29 typedef struct PVR_CHANNEL_GROUP
30 {
31 char strGroupName[PVR_ADDON_NAME_STRING_LENGTH];
32 bool bIsRadio;
33 unsigned int iPosition;
34 } PVR_CHANNEL_GROUP;
35
36 /*!
37 * @brief "C" PVR add-on channel group member.
38 *
39 * Structure used to interface in "C" between Kodi and Addon.
40 *
41 * See @ref kodi::addon::PVRChannelGroupMember for description of values.
42 */
43 typedef struct PVR_CHANNEL_GROUP_MEMBER
44 {
45 char strGroupName[PVR_ADDON_NAME_STRING_LENGTH];
46 unsigned int iChannelUniqueId;
47 unsigned int iChannelNumber;
48 unsigned int iSubChannelNumber;
49 int iOrder;
50 } PVR_CHANNEL_GROUP_MEMBER;
51
52#ifdef __cplusplus
53}
54#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channels.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channels.h
deleted file mode 100644
index a2ce591..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_channels.h
+++ /dev/null
@@ -1,104 +0,0 @@
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 "pvr_defines.h"
12
13#include <stdbool.h>
14
15//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
16// "C" Definitions group 2 - PVR channel
17#ifdef __cplusplus
18extern "C"
19{
20#endif /* __cplusplus */
21
22 //============================================================================
23 /// @ingroup cpp_kodi_addon_pvr_Defs_Channel
24 /// @brief Denotes that no channel uid is available.
25 ///
26 /// Special @ref kodi::addon::PVRTimer::SetClientChannelUid() and
27 /// @ref kodi::addon::PVRRecording::SetChannelUid() value to indicate that no
28 /// channel uid is available.
29 #define PVR_CHANNEL_INVALID_UID -1
30 //----------------------------------------------------------------------------
31
32 /*!
33 * @brief "C" PVR add-on channel.
34 *
35 * Structure used to interface in "C" between Kodi and Addon.
36 *
37 * See @ref kodi::addon::PVRChannel for description of values.
38 */
39 typedef struct PVR_CHANNEL
40 {
41 unsigned int iUniqueId;
42 bool bIsRadio;
43 unsigned int iChannelNumber;
44 unsigned int iSubChannelNumber;
45 char strChannelName[PVR_ADDON_NAME_STRING_LENGTH];
46 char strMimeType[PVR_ADDON_INPUT_FORMAT_STRING_LENGTH];
47 unsigned int iEncryptionSystem;
48 char strIconPath[PVR_ADDON_URL_STRING_LENGTH];
49 bool bIsHidden;
50 bool bHasArchive;
51 int iOrder;
52 } PVR_CHANNEL;
53
54 /*!
55 * @brief "C" PVR add-on signal status information.
56 *
57 * Structure used to interface in "C" between Kodi and Addon.
58 *
59 * See @ref kodi::addon::PVRSignalStatus for description of values.
60 */
61 typedef struct PVR_SIGNAL_STATUS
62 {
63 char strAdapterName[PVR_ADDON_NAME_STRING_LENGTH];
64 char strAdapterStatus[PVR_ADDON_NAME_STRING_LENGTH];
65 char strServiceName[PVR_ADDON_NAME_STRING_LENGTH];
66 char strProviderName[PVR_ADDON_NAME_STRING_LENGTH];
67 char strMuxName[PVR_ADDON_NAME_STRING_LENGTH];
68 int iSNR;
69 int iSignal;
70 long iBER;
71 long iUNC;
72 } PVR_SIGNAL_STATUS;
73
74 //============================================================================
75 /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo
76 /// @brief Special @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo
77 /// value to indicate that a struct member's value is not available
78 ///
79 #define PVR_DESCRAMBLE_INFO_NOT_AVAILABLE -1
80 //----------------------------------------------------------------------------
81
82 /*!
83 * @brief "C" PVR add-on descramble information.
84 *
85 * Structure used to interface in "C" between Kodi and Addon.
86 *
87 * See @ref kodi::addon::PVRDescrambleInfo for description of values.
88 */
89 typedef struct PVR_DESCRAMBLE_INFO
90 {
91 int iPid;
92 int iCaid;
93 int iProvid;
94 int iEcmTime;
95 int iHops;
96 char strCardSystem[PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH];
97 char strReader[PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH];
98 char strFrom[PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH];
99 char strProtocol[PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH];
100 } PVR_DESCRAMBLE_INFO;
101
102#ifdef __cplusplus
103}
104#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_defines.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_defines.h
deleted file mode 100644
index af1daae..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_defines.h
+++ /dev/null
@@ -1,61 +0,0 @@
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//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
12// "C" Standard PVR definitions
13//
14// Values related to all parts and not used direct on addon, are to define here.
15//
16#ifdef __cplusplus
17extern "C"
18{
19#endif /* __cplusplus */
20
21 /*!
22 * @brief API array sizes which are used for data exchange between
23 * Kodi and addon.
24 */
25 ///@{
26 #define PVR_ADDON_NAME_STRING_LENGTH 1024
27 #define PVR_ADDON_URL_STRING_LENGTH 1024
28 #define PVR_ADDON_DESC_STRING_LENGTH 1024
29 #define PVR_ADDON_INPUT_FORMAT_STRING_LENGTH 32
30 #define PVR_ADDON_EDL_LENGTH 32
31 #define PVR_ADDON_TIMERTYPE_ARRAY_SIZE 32
32 #define PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE 512
33 #define PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL 128
34 #define PVR_ADDON_TIMERTYPE_STRING_LENGTH 128
35 #define PVR_ADDON_ATTRIBUTE_DESC_LENGTH 128
36 #define PVR_ADDON_ATTRIBUTE_VALUES_ARRAY_SIZE 512
37 #define PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH 64
38 #define PVR_ADDON_DATE_STRING_LENGTH 32
39 ///@}
40
41 /*!
42 * @brief "C" Representation of a general attribute integer value.
43 */
44 typedef struct PVR_ATTRIBUTE_INT_VALUE
45 {
46 int iValue;
47 char strDescription[PVR_ADDON_ATTRIBUTE_DESC_LENGTH];
48 } PVR_ATTRIBUTE_INT_VALUE;
49
50 /*!
51 * @brief "C" Representation of a named value.
52 */
53 typedef struct PVR_NAMED_VALUE
54 {
55 char strName[PVR_ADDON_NAME_STRING_LENGTH];
56 char strValue[PVR_ADDON_NAME_STRING_LENGTH];
57 } PVR_NAMED_VALUE;
58
59#ifdef __cplusplus
60}
61#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_edl.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_edl.h
deleted file mode 100644
index 8378eaf..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_edl.h
+++ /dev/null
@@ -1,62 +0,0 @@
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 "pvr_defines.h"
12
13#include <stdint.h>
14
15//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
16// "C" Definitions group 8 - PVR Edit definition list (EDL)
17#ifdef __cplusplus
18extern "C"
19{
20#endif /* __cplusplus */
21
22 //============================================================================
23 /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVR_EDL_TYPE enum PVR_EDL_TYPE
24 /// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry
25 /// @brief **Edit definition list types**\n
26 /// Possible type values for @ref cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry.
27 ///
28 ///@{
29 typedef enum PVR_EDL_TYPE
30 {
31 /// @brief __0__ : cut (completely remove content)
32 PVR_EDL_TYPE_CUT = 0,
33
34 /// @brief __1__ : mute audio
35 PVR_EDL_TYPE_MUTE = 1,
36
37 /// @brief __2__ : scene markers (chapter seeking)
38 PVR_EDL_TYPE_SCENE = 2,
39
40 /// @brief __3__ : commercial breaks
41 PVR_EDL_TYPE_COMBREAK = 3
42 } PVR_EDL_TYPE;
43 ///@}
44 //----------------------------------------------------------------------------
45
46 /*!
47 * @brief "C" Edit definition list entry.
48 *
49 * Structure used to interface in "C" between Kodi and Addon.
50 *
51 * See @ref kodi::addon::PVREDLEntry for description of values.
52 */
53 typedef struct PVR_EDL_ENTRY
54 {
55 int64_t start;
56 int64_t end;
57 enum PVR_EDL_TYPE type;
58 } PVR_EDL_ENTRY;
59
60#ifdef __cplusplus
61}
62#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_epg.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_epg.h
deleted file mode 100644
index 57c603f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_epg.h
+++ /dev/null
@@ -1,653 +0,0 @@
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 "pvr_defines.h"
12
13#include <time.h>
14
15//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
16// "C" Definitions group 4 - PVR EPG
17#ifdef __cplusplus
18extern "C"
19{
20#endif /* __cplusplus */
21
22 //============================================================================
23 /// @defgroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT enum EPG_EVENT_CONTENTMASK (and sub types)
24 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
25 /// @brief **EPG entry content event types.**\n
26 /// These ID's come from the DVB-SI EIT table "content descriptor"
27 /// Also known under the name "E-book genre assignments".
28 ///
29 /// See [ETSI EN 300 468 V1.14.1 (2014-05)](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
30 /// about.
31 ///
32 /// Values used by this functions:
33 /// - @ref kodi::addon::PVREPGTag::SetGenreType()
34 /// - @ref kodi::addon::PVREPGTag::SetGenreSubType()
35 /// - @ref kodi::addon::PVRRecording::SetGenreType()
36 /// - @ref kodi::addon::PVRRecording::SetGenreSubType()
37 ///
38 /// Following types are listed here:
39 /// | emum Type | Description
40 /// |-----------|--------------------
41 /// | @ref EPG_EVENT_CONTENTMASK | EPG entry main content to use.
42 /// | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA event types for sub type of <b>"Movie/Drama"</b>.
43 /// | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS event types for sub type of <b>"News/Current affairs"</b>.
44 /// | @ref EPG_EVENT_CONTENTSUBMASK_SHOW | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SHOW event types for sub type of <b>"Show/Game show"</b>.
45 /// | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS | @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SPORTS event types for sub type of <b>"Sports"</b>.
46 /// | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH event types for sub type of <b>"Children's/Youth programmes"</b>.
47 /// | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE event types for sub type of <b>"Music/Ballet/Dance"</b>.
48 /// | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE event types for sub type of <b>"Arts/Culture (without music)"</b>.
49 /// | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS event types for sub type of <b>"Social/Political issues/Economics"</b>.
50 /// | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE event types for sub type of <b>"Education/Science/Factual topics"</b>.
51 /// | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES event types for sub type of <b>"Leisure hobbies"</b>.
52 /// | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL | EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SPECIAL event types for sub type of <b>"Special characteristics"</b>.
53 ///@{
54
55 //============================================================================
56 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
57 /// @brief EPG entry main content to use.
58 ///
59 ///@{
60 typedef enum EPG_EVENT_CONTENTMASK
61 {
62 /// @brief __0x00__ : Undefined content mask entry.
63 EPG_EVENT_CONTENTMASK_UNDEFINED = 0x00,
64
65 /// @brief __0x10__ : Movie/Drama.\n
66 /// \n
67 /// See @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA about related sub types.
68 EPG_EVENT_CONTENTMASK_MOVIEDRAMA = 0x10,
69
70 /// @brief __0x20__ : News/Current affairs.\n
71 /// \n
72 /// See @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS about related sub types.
73 EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS = 0x20,
74
75 /// @brief __0x30__ : Show/Game show.\n
76 /// \n
77 /// See @ref EPG_EVENT_CONTENTSUBMASK_SHOW about related sub types.
78 EPG_EVENT_CONTENTMASK_SHOW = 0x30,
79
80 /// @brief __0x40__ : Sports.\n
81 /// \n
82 /// See @ref EPG_EVENT_CONTENTSUBMASK_SPORTS about related sub types.
83 EPG_EVENT_CONTENTMASK_SPORTS = 0x40,
84
85 /// @brief __0x50__ : Children's/Youth programmes.\n
86 /// \n
87 /// See @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH about related sub types.
88 EPG_EVENT_CONTENTMASK_CHILDRENYOUTH = 0x50,
89
90 /// @brief __0x60__ : Music/Ballet/Dance.\n
91 /// \n
92 /// See @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE about related sub types.
93 EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE = 0x60,
94
95 /// @brief __0x70__ : Arts/Culture (without music).\n
96 /// \n
97 /// See @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE about related sub types.
98 EPG_EVENT_CONTENTMASK_ARTSCULTURE = 0x70,
99
100 /// @brief __0x80__ : Social/Political issues/Economics.\n
101 /// \n
102 /// See @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS about related sub types.
103 EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS = 0x80,
104
105 /// @brief __0x90__ : Education/Science/Factual topics.\n
106 /// \n
107 /// See @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE about related sub types.
108 EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE = 0x90,
109
110 /// @brief __0xA0__ : Leisure hobbies.\n
111 /// \n
112 /// See @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES about related sub types.
113 EPG_EVENT_CONTENTMASK_LEISUREHOBBIES = 0xA0,
114
115 /// @brief __0xB0__ : Special characteristics.\n
116 /// \n
117 /// See @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL about related sub types.
118 EPG_EVENT_CONTENTMASK_SPECIAL = 0xB0,
119
120 /// @brief __0xF0__ User defined.
121 EPG_EVENT_CONTENTMASK_USERDEFINED = 0xF0,
122
123 /// @brief Used to override standard genre types with a own name about.\n
124 /// \n
125 /// Set to this value @ref EPG_GENRE_USE_STRING on following places:
126 /// - @ref kodi::addon::PVREPGTag::SetGenreType()
127 /// - @ref kodi::addon::PVREPGTag::SetGenreSubType()
128 /// - @ref kodi::addon::PVRRecording::SetGenreType()
129 /// - @ref kodi::addon::PVRRecording::SetGenreSubType()
130 ///
131 /// @warning Value here is not a [ETSI EN 300 468 V1.14.1 (2014-05)](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf)
132 /// conform.
133 ///
134 /// @note This is a own Kodi definition to set that genre is given by own
135 /// string. Used on @ref kodi::addon::PVREPGTag::SetGenreDescription() and
136 /// @ref kodi::addon::PVRRecording::SetGenreDescription()
137 EPG_GENRE_USE_STRING = 0x100
138 } EPG_EVENT_CONTENTMASK;
139 ///@}
140 //----------------------------------------------------------------------------
141
142 //============================================================================
143 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
144 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA event
145 /// types for sub type of <b>"Movie/Drama"</b>.
146 ///
147 ///@{
148 typedef enum EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA
149 {
150 /// @brief __0x0__ : Movie/drama (general).
151 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_GENERAL = 0x0,
152
153 /// @brief __0x1__ : Detective/thriller.
154 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_DETECTIVE_THRILLER = 0x1,
155
156 /// @brief __0x2__ : Adventure/western/war.
157 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_ADVENTURE_WESTERN_WAR = 0x2,
158
159 /// @brief __0x3__ : Science fiction/fantasy/horror.
160 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_SCIENCEFICTION_FANTASY_HORROR = 0x3,
161
162 /// @brief __0x4__ : Comedy.
163 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_COMEDY = 0x4,
164
165 /// @brief __0x5__ : Soap/melodrama/folkloric.
166 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_SOAP_MELODRAMA_FOLKLORIC = 0x5,
167
168 /// @brief __0x6__ : Romance.
169 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_ROMANCE = 0x6,
170
171 /// @brief __0x7__ : Serious/classical/religious/historical movie/drama.
172 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_SERIOUS_CLASSICAL_RELIGIOUS_HISTORICAL = 0x7,
173
174 /// @brief __0x8__ : Adult movie/drama.
175 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_ADULT = 0x8,
176
177 /// @brief __0xF__ : User defined.
178 EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA_USERDEFINED = 0xF
179 } EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA;
180 ///@}
181 //----------------------------------------------------------------------------
182
183 //============================================================================
184 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
185 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS event
186 /// types for sub type of <b>"News/Current affairs"</b>.
187 ///
188 typedef enum EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS
189 {
190 /// @brief __0x0__ : News/current affairs (general).
191 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_GENERAL = 0x0,
192
193 /// @brief __0x1__ : News/weather report.
194 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_WEATHER = 0x1,
195
196 /// @brief __0x2__ : News magazine.
197 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_MAGAZINE = 0x2,
198
199 /// @brief __0x3__ : Documentary.
200 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_DOCUMENTARY = 0x3,
201
202 /// @brief __0x4__ : Discussion/interview/debate
203 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_DISCUSSION_INTERVIEW_DEBATE = 0x4,
204
205 /// @brief __0xF__ : User defined.
206 EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS_USERDEFINED = 0xF
207 } EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS;
208 //----------------------------------------------------------------------------
209
210 //============================================================================
211 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
212 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SHOW event
213 /// types for sub type of <b>"Show/Game show"</b>.
214 ///
215 typedef enum EPG_EVENT_CONTENTSUBMASK_SHOW
216 {
217 /// @brief __0x0__ : Show/game show (general).
218 EPG_EVENT_CONTENTSUBMASK_SHOW_GENERAL = 0x0,
219
220 /// @brief __0x1__ : Game show/quiz/contest.
221 EPG_EVENT_CONTENTSUBMASK_SHOW_GAMESHOW_QUIZ_CONTEST = 0x1,
222
223 /// @brief __0x2__ : Variety show.
224 EPG_EVENT_CONTENTSUBMASK_SHOW_VARIETY_SHOW = 0x2,
225
226 /// @brief __0x3__ : Talk show.
227 EPG_EVENT_CONTENTSUBMASK_SHOW_TALK_SHOW = 0x3,
228
229 /// @brief __0xF__ : User defined.
230 EPG_EVENT_CONTENTSUBMASK_SHOW_USERDEFINED = 0xF
231 } EPG_EVENT_CONTENTSUBMASK_SHOW;
232 //----------------------------------------------------------------------------
233
234 //============================================================================
235 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
236 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SPORTS event
237 /// types for sub type of <b>"Sports"</b>.
238 ///
239 typedef enum EPG_EVENT_CONTENTSUBMASK_SPORTS
240 {
241 /// @brief __0x0__ : Sports (general).
242 EPG_EVENT_CONTENTSUBMASK_SPORTS_GENERAL = 0x0,
243
244 /// @brief __0x1__ : Special events (Olympic Games, World Cup, etc.).
245 EPG_EVENT_CONTENTSUBMASK_SPORTS_OLYMPICGAMES_WORLDCUP = 0x1,
246
247 /// @brief __0x2__ : Sports magazines.
248 EPG_EVENT_CONTENTSUBMASK_SPORTS_SPORTS_MAGAZINES = 0x2,
249
250 /// @brief __0x3__ : Football/soccer.
251 EPG_EVENT_CONTENTSUBMASK_SPORTS_FOOTBALL_SOCCER = 0x3,
252
253 /// @brief __0x4__ : Tennis/squash.
254 EPG_EVENT_CONTENTSUBMASK_SPORTS_TENNIS_SQUASH = 0x4,
255
256 /// @brief __0x5__ : Team sports (excluding football).
257 EPG_EVENT_CONTENTSUBMASK_SPORTS_TEAMSPORTS = 0x5,
258
259 /// @brief __0x6__ : Athletics.
260 EPG_EVENT_CONTENTSUBMASK_SPORTS_ATHLETICS = 0x6,
261
262 /// @brief __0x7__ : Motor sport.
263 EPG_EVENT_CONTENTSUBMASK_SPORTS_MOTORSPORT = 0x7,
264
265 /// @brief __0x8__ : Water sport.
266 EPG_EVENT_CONTENTSUBMASK_SPORTS_WATERSPORT = 0x8,
267
268 /// @brief __0x9__ : Winter sports.
269 EPG_EVENT_CONTENTSUBMASK_SPORTS_WINTERSPORTS = 0x9,
270
271 /// @brief __0xA__ : Equestrian.
272 EPG_EVENT_CONTENTSUBMASK_SPORTS_EQUESTRIAN = 0xA,
273
274 /// @brief __0xB__ : Martial sports.
275 EPG_EVENT_CONTENTSUBMASK_SPORTS_MARTIALSPORTS = 0xB,
276
277 /// @brief __0xF__ : User defined.
278 EPG_EVENT_CONTENTSUBMASK_SPORTS_USERDEFINED = 0xF
279 } EPG_EVENT_CONTENTSUBMASK_SPORTS;
280 //----------------------------------------------------------------------------
281
282 //============================================================================
283 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
284 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH event
285 /// types for sub type of <b>"Children's/Youth programmes"</b>.
286 ///
287 typedef enum EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH
288 {
289 /// @brief __0x0__ : Children's/youth programmes (general).
290 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_GENERAL = 0x0,
291
292 /// @brief __0x1__ : Pre-school children's programmes.
293 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_PRESCHOOL_CHILDREN = 0x1,
294
295 /// @brief __0x2__ : Entertainment programmes for 6 to 14.
296 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_ENTERTAIN_6TO14 = 0x2,
297
298 /// @brief __0x3__ : Entertainment programmes for 10 to 16.
299 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_ENTERTAIN_10TO16 = 0x3,
300
301 /// @brief __0x4__ : Informational/educational/school programmes.
302 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_INFORMATIONAL_EDUCATIONAL_SCHOOL = 0x4,
303
304 /// @brief __0x5__ : Cartoons/puppets.
305 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_CARTOONS_PUPPETS = 0x5,
306
307 /// @brief __0xF__ : User defined.
308 EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH_USERDEFINED = 0xF
309 } EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH;
310 //----------------------------------------------------------------------------
311
312 //============================================================================
313 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
314 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE event
315 /// types for sub type of <b>"Music/Ballet/Dance"</b>.
316 ///
317 typedef enum EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE
318 {
319 /// @brief __0x0__ : Music/ballet/dance (general).
320 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_GENERAL = 0x0,
321
322 /// @brief __0x1__ : Rock/pop.
323 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_ROCKPOP = 0x1,
324
325 /// @brief __0x2__ : Serious music/classical music.
326 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_SERIOUSMUSIC_CLASSICALMUSIC = 0x2,
327
328 /// @brief __0x3__ : Folk/traditional music.
329 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_FOLK_TRADITIONAL_MUSIC = 0x3,
330
331 /// @brief __0x4__ : Jazz.
332 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ = 0x4,
333
334 /// @brief __0x5__ : Musical/opera.
335 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_MUSICAL_OPERA = 0x5,
336
337 /// @brief __0x6__ : Ballet.
338 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_BALLET = 0x6,
339
340 /// @brief __0xF__ : User defined.
341 EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_USERDEFINED = 0xF
342 } EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE;
343 //----------------------------------------------------------------------------
344
345 //============================================================================
346 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
347 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE event
348 /// types for sub type of <b>"Arts/Culture (without music)"</b>.
349 ///
350 typedef enum EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE
351 {
352 /// @brief __0x0__ : Arts/culture (without music, general).
353 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_GENERAL = 0x0,
354
355 /// @brief __0x1__ : Performing arts.
356 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_PERFORMINGARTS = 0x1,
357
358 /// @brief __0x2__ : Fine arts.
359 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_FINEARTS = 0x2,
360
361 /// @brief __0x3__ : Religion.
362 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_RELIGION = 0x3,
363
364 /// @brief __0x4__ : Popular culture/traditional arts.
365 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_POPULARCULTURE_TRADITIONALARTS = 0x4,
366
367 /// @brief __0x5__ : Literature.
368 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_LITERATURE = 0x5,
369
370 /// @brief __0x6__ : Film/cinema.
371 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_FILM_CINEMA = 0x6,
372
373 /// @brief __0x7__ : Experimental film/video.
374 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_EXPERIMENTALFILM_VIDEO = 0x7,
375
376 /// @brief __0x8__ : Broadcasting/press.
377 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_BROADCASTING_PRESS = 0x8,
378
379 /// @brief __0x9__ : New media.
380 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_NEWMEDIA = 0x9,
381
382 /// @brief __0xA__ : Arts/culture magazines.
383 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_ARTS_CULTUREMAGAZINES = 0xA,
384
385 /// @brief __0xB__ : Fashion.
386 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_FASHION = 0xB,
387
388 /// @brief __0xF__ : User defined.
389 EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE_USERDEFINED = 0xF
390 } EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE;
391 //----------------------------------------------------------------------------
392
393 //============================================================================
394 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
395 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS event
396 /// types for sub type of <b>"Social/Political issues/Economics"</b>.
397 ///
398 typedef enum EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS
399 {
400 /// @brief __0x0__ : Social/political issues/economics (general).
401 EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS_GENERAL = 0x0,
402
403 /// @brief __0x1__ : Magazines/reports/documentary.
404 EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS_MAGAZINES_REPORTS_DOCUMENTARY = 0x1,
405
406 /// @brief __0x2__ : Economics/social advisory.
407 EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS_ECONOMICS_SOCIALADVISORY = 0x2,
408
409 /// @brief __0x3__ : Remarkable people.
410 EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS_REMARKABLEPEOPLE = 0x3,
411
412 /// @brief __0xF__ : User defined.
413 EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS_USERDEFINED = 0xF
414 } EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS;
415 //----------------------------------------------------------------------------
416
417 //============================================================================
418 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
419 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE event
420 /// types for sub type of <b>"Education/Science/Factual topics"</b>.
421 ///
422 typedef enum EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE
423 {
424 /// @brief __0x0__ : Education/science/factual topics (general).
425 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_GENERAL = 0x0,
426
427 /// @brief __0x1__ : Nature/animals/environment.
428 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_NATURE_ANIMALS_ENVIRONMENT = 0x1,
429
430 /// @brief __0x2__ : Technology/natural sciences.
431 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_TECHNOLOGY_NATURALSCIENCES = 0x2,
432
433 /// @brief __0x3__ : Medicine/physiology/psychology.
434 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_MEDICINE_PHYSIOLOGY_PSYCHOLOGY = 0x3,
435
436 /// @brief __0x4__ : Foreign countries/expeditions.
437 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_FOREIGNCOUNTRIES_EXPEDITIONS = 0x4,
438
439 /// @brief __0x5__ : Social/spiritual sciences.
440 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_SOCIAL_SPIRITUALSCIENCES = 0x5,
441
442 /// @brief __0x6__ : Further education.
443 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_FURTHEREDUCATION = 0x6,
444
445 /// @brief __0x7__ : Languages.
446 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_LANGUAGES = 0x7,
447
448 /// @brief __0xF__ : User defined.
449 EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE_USERDEFINED = 0xF
450 } EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE;
451 //----------------------------------------------------------------------------
452
453 //============================================================================
454 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
455 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES event
456 /// types for sub type of <b>"Leisure hobbies"</b>.
457 ///
458 typedef enum EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES
459 {
460 /// @brief __0x0__ : Leisure hobbies (general) .
461 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_GENERAL = 0x0,
462
463 /// @brief __0x1__ : Tourism/travel.
464 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_TOURISM_TRAVEL = 0x1,
465
466 /// @brief __0x2__ : Handicraft.
467 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_HANDICRAFT = 0x2,
468
469 /// @brief __0x3__ : Motoring.
470 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_MOTORING = 0x3,
471
472 /// @brief __0x4__ : Fitness and health.
473 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_FITNESSANDHEALTH = 0x4,
474
475 /// @brief __0x5__ : Cooking.
476 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_COOKING = 0x5,
477
478 /// @brief __0x6__ : Advertisement/shopping.
479 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_ADVERTISEMENT_SHOPPING = 0x6,
480
481 /// @brief __0x7__ : Gardening.
482 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_GARDENING = 0x7,
483
484 /// @brief __0xF__ : User defined.
485 EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES_USERDEFINED = 0xF
486 } EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES;
487 //----------------------------------------------------------------------------
488
489 //============================================================================
490 /// @ingroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT
491 /// @brief EPG entry sub content to @ref EPG_EVENT_CONTENTMASK_SPECIAL event
492 /// types for sub type of <b>"Special characteristics"</b>.
493 ///
494 typedef enum EPG_EVENT_CONTENTSUBMASK_SPECIAL
495 {
496 /// @brief __0x0__ : Special characteristics / Original language (general).
497 EPG_EVENT_CONTENTSUBMASK_SPECIAL_GENERAL = 0x0,
498
499 /// @brief __0x1__ : Black and white.
500 EPG_EVENT_CONTENTSUBMASK_SPECIAL_BLACKANDWHITE = 0x1,
501
502 /// @brief __0x2__ : Unpublished.
503 EPG_EVENT_CONTENTSUBMASK_SPECIAL_UNPUBLISHED = 0x2,
504
505 /// @brief __0x3__ : Live broadcast.
506 EPG_EVENT_CONTENTSUBMASK_SPECIAL_LIVEBROADCAST = 0x3,
507
508 /// @brief __0x4__ : Plano-stereoscopic.
509 EPG_EVENT_CONTENTSUBMASK_SPECIAL_PLANOSTEREOSCOPIC = 0x4,
510
511 /// @brief __0x5__ : Local or regional.
512 EPG_EVENT_CONTENTSUBMASK_SPECIAL_LOCALORREGIONAL = 0x5,
513
514 /// @brief __0xF__ : User defined.
515 EPG_EVENT_CONTENTSUBMASK_SPECIAL_USERDEFINED = 0xF
516 } EPG_EVENT_CONTENTSUBMASK_SPECIAL;
517 //----------------------------------------------------------------------------
518
519 ///@}
520
521 //============================================================================
522 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
523 /// @brief Separator to use in strings containing different tokens, for example
524 /// writers, directors, actors of an event.
525 ///
526 #define EPG_STRING_TOKEN_SEPARATOR ","
527 //----------------------------------------------------------------------------
528
529 //============================================================================
530 /// @defgroup cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG enum EPG_TAG_FLAG
531 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
532 /// @brief <b>Bit field of independent flags associated with the EPG entry.</b>\n
533 /// Values used by @ref kodi::addon::PVREPGTag::SetFlags().
534 ///
535 /// Here's example about the use of this:
536 /// ~~~~~~~~~~~~~{.cpp}
537 /// kodi::addon::PVREPGTag tag;
538 /// tag.SetFlags(EPG_TAG_FLAG_IS_SERIES | EPG_TAG_FLAG_IS_NEW);
539 /// ~~~~~~~~~~~~~
540 ///
541 ///@{
542 typedef enum EPG_TAG_FLAG
543 {
544 /// @brief __0000 0000__ : Nothing special to say about this entry.
545 EPG_TAG_FLAG_UNDEFINED = 0,
546
547 /// @brief __0000 0001__ : This EPG entry is part of a series.
548 EPG_TAG_FLAG_IS_SERIES = (1 << 0),
549
550 /// @brief __0000 0010__ : This EPG entry will be flagged as new.
551 EPG_TAG_FLAG_IS_NEW = (1 << 1),
552
553 /// @brief __0000 0100__ : This EPG entry will be flagged as a premiere.
554 EPG_TAG_FLAG_IS_PREMIERE = (1 << 2),
555
556 /// @brief __0000 1000__ : This EPG entry will be flagged as a finale.
557 EPG_TAG_FLAG_IS_FINALE = (1 << 3),
558
559 /// @brief __0001 0000__ : This EPG entry will be flagged as live.
560 EPG_TAG_FLAG_IS_LIVE = (1 << 4),
561 } EPG_TAG_FLAG;
562 ///@}
563 //----------------------------------------------------------------------------
564
565 //============================================================================
566 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
567 /// @brief Special PVREPGTag::SetUniqueBroadcastId value
568 ///
569 /// Special @ref kodi::addon::PVREPGTag::SetUniqueBroadcastId() value to
570 /// indicate that a tag has not a valid EPG event uid.
571 ///
572 #define EPG_TAG_INVALID_UID 0
573 //----------------------------------------------------------------------------
574
575 //============================================================================
576 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
577 /// @brief Special @ref kodi::addon::PVREPGTag::SetSeriesNumber(), @ref kodi::addon::PVREPGTag::SetEpisodeNumber()
578 /// and @ref kodi::addon::PVREPGTag::SetEpisodePartNumber() value to indicate
579 /// it is not to be used.
580 ///
581 #define EPG_TAG_INVALID_SERIES_EPISODE -1
582 //----------------------------------------------------------------------------
583
584 //============================================================================
585 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
586 /// @brief Timeframe value for use with @ref kodi::addon::CInstancePVRClient::SetEPGTimeFrame()
587 /// function to indicate "no timeframe".
588 ///
589 #define EPG_TIMEFRAME_UNLIMITED -1
590 //----------------------------------------------------------------------------
591
592 //============================================================================
593 /// @defgroup cpp_kodi_addon_pvr_Defs_epg_EPG_EVENT_STATE enum EPG_EVENT_STATE
594 /// @ingroup cpp_kodi_addon_pvr_Defs_epg
595 /// @brief **EPG event states.**\n
596 /// Used with @ref kodi::addon::CInstancePVRClient::EpgEventStateChange()
597 /// callback.
598 ///
599 ///@{
600 typedef enum EPG_EVENT_STATE
601 {
602 /// @brief __0__ : Event created.
603 EPG_EVENT_CREATED = 0,
604
605 /// @brief __1__ : Event updated.
606 EPG_EVENT_UPDATED = 1,
607
608 /// @brief __2__ : Event deleted.
609 EPG_EVENT_DELETED = 2,
610 } EPG_EVENT_STATE;
611 ///@}
612 //----------------------------------------------------------------------------
613
614 /*!
615 * @brief "C" PVR add-on channel group member.
616 *
617 * Structure used to interface in "C" between Kodi and Addon.
618 *
619 * See @ref kodi::addon::PVREPGTag for description of values.
620 */
621 typedef struct EPG_TAG
622 {
623 unsigned int iUniqueBroadcastId;
624 unsigned int iUniqueChannelId;
625 const char* strTitle;
626 time_t startTime;
627 time_t endTime;
628 const char* strPlotOutline;
629 const char* strPlot;
630 const char* strOriginalTitle;
631 const char* strCast;
632 const char* strDirector;
633 const char* strWriter;
634 int iYear;
635 const char* strIMDBNumber;
636 const char* strIconPath;
637 int iGenreType;
638 int iGenreSubType;
639 const char* strGenreDescription;
640 const char* strFirstAired;
641 int iParentalRating;
642 int iStarRating;
643 int iSeriesNumber;
644 int iEpisodeNumber;
645 int iEpisodePartNumber;
646 const char* strEpisodeName;
647 unsigned int iFlags;
648 const char* strSeriesLink;
649 } EPG_TAG;
650
651#ifdef __cplusplus
652}
653#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_general.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_general.h
deleted file mode 100644
index 52787b0..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_general.h
+++ /dev/null
@@ -1,288 +0,0 @@
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 "pvr_defines.h"
12
13#ifdef BUILD_KODI_ADDON
14#include "../../../InputStreamConstants.h"
15#else
16#include "cores/VideoPlayer/Interface/Addon/InputStreamConstants.h"
17#endif
18
19//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
20// "C" Definitions group 1 - General PVR
21#ifdef __cplusplus
22extern "C"
23{
24#endif /* __cplusplus */
25
26 //============================================================================
27 /// @defgroup cpp_kodi_addon_pvr_Defs_General_PVR_ERROR enum PVR_ERROR
28 /// @ingroup cpp_kodi_addon_pvr_Defs_General
29 /// @brief **PVR add-on error codes**\n
30 /// Used as return values on most PVR related functions.
31 ///
32 /// In this way, a PVR instance signals errors in its processing and, under
33 /// certain conditions, allows Kodi to make corrections.
34 ///
35 ///@{
36 typedef enum PVR_ERROR
37 {
38 /// @brief __0__ : No error occurred.
39 PVR_ERROR_NO_ERROR = 0,
40
41 /// @brief __-1__ : An unknown error occurred.
42 PVR_ERROR_UNKNOWN = -1,
43
44 /// @brief __-2__ : The method that Kodi called is not implemented by the add-on.
45 PVR_ERROR_NOT_IMPLEMENTED = -2,
46
47 /// @brief __-3__ : The backend reported an error, or the add-on isn't connected.
48 PVR_ERROR_SERVER_ERROR = -3,
49
50 /// @brief __-4__ : The command was sent to the backend, but the response timed out.
51 PVR_ERROR_SERVER_TIMEOUT = -4,
52
53 /// @brief __-5__ : The command was rejected by the backend.
54 PVR_ERROR_REJECTED = -5,
55
56 /// @brief __-6__ : The requested item can not be added, because it's already present.
57 PVR_ERROR_ALREADY_PRESENT = -6,
58
59 /// @brief __-7__ : The parameters of the method that was called are invalid for this
60 /// operation.
61 PVR_ERROR_INVALID_PARAMETERS = -7,
62
63 /// @brief __-8__ : A recording is running, so the timer can't be deleted without
64 /// doing a forced delete.
65 PVR_ERROR_RECORDING_RUNNING = -8,
66
67 /// @brief __-9__ : The command failed.
68 PVR_ERROR_FAILED = -9,
69 } PVR_ERROR;
70 ///@}
71 //----------------------------------------------------------------------------
72
73 //============================================================================
74 /// @defgroup cpp_kodi_addon_pvr_Defs_General_PVR_CONNECTION_STATE enum PVR_CONNECTION_STATE
75 /// @ingroup cpp_kodi_addon_pvr_Defs_General
76 /// @brief **PVR backend connection states**\n
77 /// Used with @ref kodi::addon::CInstancePVRClient::ConnectionStateChange() callback.
78 ///
79 /// With this, a PVR instance signals that Kodi should perform special
80 /// operations.
81 ///
82 ///@{
83 typedef enum PVR_CONNECTION_STATE
84 {
85 /// @brief __0__ : Unknown state (e.g. not yet tried to connect).
86 PVR_CONNECTION_STATE_UNKNOWN = 0,
87
88 /// @brief __1__ : Backend server is not reachable (e.g. server not existing or
89 /// network down).
90 PVR_CONNECTION_STATE_SERVER_UNREACHABLE = 1,
91
92 /// @brief __2__ : Backend server is reachable, but there is not the expected type of
93 /// server running (e.g. HTSP required, but FTP running at given server:port).
94 PVR_CONNECTION_STATE_SERVER_MISMATCH = 2,
95
96 /// @brief __3__ : Backend server is reachable, but server version does not match
97 /// client requirements.
98 PVR_CONNECTION_STATE_VERSION_MISMATCH = 3,
99
100 /// @brief __4__ : Backend server is reachable, but denies client access (e.g. due
101 /// to wrong credentials).
102 PVR_CONNECTION_STATE_ACCESS_DENIED = 4,
103
104 /// @brief __5__ : Connection to backend server is established.
105 PVR_CONNECTION_STATE_CONNECTED = 5,
106
107 /// @brief __6__ : No connection to backend server (e.g. due to network errors or
108 /// client initiated disconnect).
109 PVR_CONNECTION_STATE_DISCONNECTED = 6,
110
111 /// @brief __7__ : Connecting to backend.
112 PVR_CONNECTION_STATE_CONNECTING = 7,
113 } PVR_CONNECTION_STATE;
114 ///@}
115 //----------------------------------------------------------------------------
116
117 //============================================================================
118 /// @defgroup cpp_kodi_addon_pvr_Defs_General_PVR_STREAM_PROPERTY definition PVR_STREAM_PROPERTY
119 /// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream
120 /// @brief **PVR related stream property values**\n
121 /// This is used to pass additional data to Kodi on a given PVR stream.
122 ///
123 /// Then transferred to livestream, recordings or EPG Tag stream using the
124 /// properties.
125 ///
126 /// This defines are used by:
127 /// - @ref kodi::addon::CInstancePVRClient::GetChannelStreamProperties()
128 /// - @ref kodi::addon::CInstancePVRClient::GetEPGTagStreamProperties()
129 /// - @ref kodi::addon::CInstancePVRClient::GetRecordingStreamProperties()
130 ///
131 ///
132 ///---------------------------------------------------------------------------
133 ///
134 /// **Example:**
135 /// ~~~~~~~~~~~~~{.cpp}
136 /// ...
137 ///
138 /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
139 /// std::vector<PVRStreamProperty>& properties)
140 /// {
141 /// ...
142 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
143 /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd");
144 /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full");
145 /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash");
146 /// return PVR_ERROR_NO_ERROR;
147 /// }
148 ///
149 /// ...
150 /// ~~~~~~~~~~~~~
151 ///
152 ///@{
153
154 /// @brief the URL of the stream that should be played.
155 ///
156 #define PVR_STREAM_PROPERTY_STREAMURL "streamurl"
157
158 /// @brief To define in stream properties the name of the inputstream add-on
159 /// that should be used.
160 ///
161 /// Leave blank to use Kodi's built-in playing capabilities or to allow ffmpeg
162 /// to handle directly set to @ref PVR_STREAM_PROPERTY_VALUE_INPUTSTREAMFFMPEG.
163 ///
164 #define PVR_STREAM_PROPERTY_INPUTSTREAM STREAM_PROPERTY_INPUTSTREAM
165
166 /// @brief Identification string for an input stream.
167 ///
168 /// This value can be used in addition to @ref PVR_STREAM_PROPERTY_INPUTSTREAM.
169 /// It is used to provide the respective inpustream addon with additional
170 /// identification.
171 ///
172 /// The difference between this and other stream properties is that it is also
173 /// passed in the associated @ref kodi::addon::CAddonBase::CreateInstance()
174 /// call.
175 ///
176 /// This makes it possible to select different processing classes within the
177 /// associated add-on.
178 ///
179 ///
180 ///---------------------------------------------------------------------------
181 ///
182 /// **Example:**
183 /// ~~~~~~~~~~~~~{.cpp}
184 /// ...
185 ///
186 /// // On PVR instance of addon
187 /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
188 /// std::vector<PVRStreamProperty>& properties)
189 /// {
190 /// ...
191 /// // For here on example the inpustream is also inside the PVR addon
192 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "pvr.my_one");
193 /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM_INSTANCE_ID, "my_special_id_1");
194 /// return PVR_ERROR_NO_ERROR;
195 /// }
196 ///
197 /// ...
198 ///
199 /// // On CAddonBase part of addon
200 /// ADDON_STATUS CMyAddon::CreateInstanceEx(int instanceType,
201 /// std::string instanceID,
202 /// KODI_HANDLE instance,
203 /// KODI_HANDLE& addonInstance
204 /// const std::string& version)
205 /// {
206 /// if (instanceType == ADDON_INSTANCE_INPUTSTREAM)
207 /// {
208 /// kodi::Log(ADDON_LOG_NOTICE, "Creating my special inputstream");
209 /// if (instanceID == "my_special_id_1")
210 /// addonInstance = new CMyPVRClientInstance_Type1(instance, version);
211 /// else if (instanceID == "my_special_id_2")
212 /// addonInstance = new CMyPVRClientInstance_Type2(instance, version);
213 /// return ADDON_STATUS_OK;
214 /// }
215 /// else if (...)
216 /// {
217 /// ...
218 /// }
219 /// return ADDON_STATUS_UNKNOWN;
220 /// }
221 ///
222 /// ...
223 /// ~~~~~~~~~~~~~
224 ///
225 #define PVR_STREAM_PROPERTY_INPUTSTREAM_INSTANCE_ID STREAM_PROPERTY_INPUTSTREAM_INSTANCE_ID
226
227 /// @brief the MIME type of the stream that should be played.
228 ///
229 #define PVR_STREAM_PROPERTY_MIMETYPE "mimetype"
230
231 /// @brief <b>"true"</b> to denote that the stream that should be played is a
232 /// realtime stream.
233 ///
234 /// Any other value indicates that this is no realtime stream.
235 ///
236 #define PVR_STREAM_PROPERTY_ISREALTIMESTREAM STREAM_PROPERTY_ISREALTIMESTREAM
237
238 /// @brief <b>"true"</b> to denote that if the stream is from an EPG tag.
239 ///
240 /// It should be played is a live stream. Otherwise if it's a EPG tag it will
241 /// play as normal video.
242 ///
243 #define PVR_STREAM_PROPERTY_EPGPLAYBACKASLIVE "epgplaybackaslive"
244
245 /// @brief Special value for @ref PVR_STREAM_PROPERTY_INPUTSTREAM to use
246 /// ffmpeg to directly play a stream URL.
247 #define PVR_STREAM_PROPERTY_VALUE_INPUTSTREAMFFMPEG STREAM_PROPERTY_VALUE_INPUTSTREAMFFMPEG
248
249 ///@}
250 //-----------------------------------------------------------------------------
251
252 /*!
253 * @brief "C" PVR add-on capabilities.
254 *
255 * Structure used to interface in "C" between Kodi and Addon.
256 *
257 * See @ref kodi::addon::PVRCapabilities for description of values.
258 */
259 typedef struct PVR_ADDON_CAPABILITIES
260 {
261 bool bSupportsEPG;
262 bool bSupportsEPGEdl;
263 bool bSupportsTV;
264 bool bSupportsRadio;
265 bool bSupportsRecordings;
266 bool bSupportsRecordingsUndelete;
267 bool bSupportsTimers;
268 bool bSupportsChannelGroups;
269 bool bSupportsChannelScan;
270 bool bSupportsChannelSettings;
271 bool bHandlesInputStream;
272 bool bHandlesDemuxing;
273 bool bSupportsRecordingPlayCount;
274 bool bSupportsLastPlayedPosition;
275 bool bSupportsRecordingEdl;
276 bool bSupportsRecordingsRename;
277 bool bSupportsRecordingsLifetimeChange;
278 bool bSupportsDescrambleInfo;
279 bool bSupportsAsyncEPGTransfer;
280 bool bSupportsRecordingSize;
281
282 unsigned int iRecordingsLifetimesSize;
283 struct PVR_ATTRIBUTE_INT_VALUE recordingsLifetimeValues[PVR_ADDON_ATTRIBUTE_VALUES_ARRAY_SIZE];
284 } PVR_ADDON_CAPABILITIES;
285
286#ifdef __cplusplus
287}
288#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_menu_hook.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_menu_hook.h
deleted file mode 100644
index df2216f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_menu_hook.h
+++ /dev/null
@@ -1,72 +0,0 @@
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 "pvr_defines.h"
12
13//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
14// "C" Definitions group 7 - Menu hook
15#ifdef __cplusplus
16extern "C"
17{
18#endif /* __cplusplus */
19
20 //============================================================================
21 /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVR_MENUHOOK_CAT enum PVR_MENUHOOK_CAT
22 /// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook
23 /// @brief **PVR context menu hook categories**\n
24 /// Possible menu types given to Kodi with @ref kodi::addon::CInstancePVRClient::AddMenuHook().
25 ///
26 ///@{
27 typedef enum PVR_MENUHOOK_CAT
28 {
29 /// @brief __-1__ : Unknown menu hook.
30 PVR_MENUHOOK_UNKNOWN = -1,
31
32 /// @brief __0__ : All categories.
33 PVR_MENUHOOK_ALL = 0,
34
35 /// @brief __1__ : For channels.
36 PVR_MENUHOOK_CHANNEL = 1,
37
38 /// @brief __2__ : For timers.
39 PVR_MENUHOOK_TIMER = 2,
40
41 /// @brief __3__ : For EPG.
42 PVR_MENUHOOK_EPG = 3,
43
44 /// @brief __4__ : For recordings.
45 PVR_MENUHOOK_RECORDING = 4,
46
47 /// @brief __5__ : For deleted recordings.
48 PVR_MENUHOOK_DELETED_RECORDING = 5,
49
50 /// @brief __6__ : For settings.
51 PVR_MENUHOOK_SETTING = 6,
52 } PVR_MENUHOOK_CAT;
53 ///@}
54 //----------------------------------------------------------------------------
55
56 /*!
57 * @brief "C" PVR add-on menu hook.
58 *
59 * Structure used to interface in "C" between Kodi and Addon.
60 *
61 * See @ref kodi::addon::PVRMenuhook for description of values.
62 */
63 typedef struct PVR_MENUHOOK
64 {
65 unsigned int iHookId;
66 unsigned int iLocalizedStringId;
67 enum PVR_MENUHOOK_CAT category;
68 } PVR_MENUHOOK;
69
70#ifdef __cplusplus
71}
72#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_recordings.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_recordings.h
deleted file mode 100644
index 1a7fc66..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_recordings.h
+++ /dev/null
@@ -1,143 +0,0 @@
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 "pvr_defines.h"
12
13#include <stdbool.h>
14#include <stdint.h>
15#include <time.h>
16
17//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
18// "C" Definitions group 5 - PVR recordings
19#ifdef __cplusplus
20extern "C"
21{
22#endif /* __cplusplus */
23
24 //============================================================================
25 /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG enum PVR_RECORDING_FLAG
26 /// @ingroup cpp_kodi_addon_pvr_Defs_Recording
27 /// @brief **Bit field of independent flags associated with the EPG entry.**\n
28 /// Values used by @ref kodi::addon::PVRRecording::SetFlags().
29 ///
30 /// Here's example about the use of this:
31 /// ~~~~~~~~~~~~~{.cpp}
32 /// kodi::addon::PVRRecording tag;
33 /// tag.SetFlags(PVR_RECORDING_FLAG_IS_SERIES | PVR_RECORDING_FLAG_IS_PREMIERE);
34 /// ~~~~~~~~~~~~~
35 ///
36 ///@{
37 typedef enum PVR_RECORDING_FLAG
38 {
39 /// @brief __0000 0000__ : Nothing special to say about this recording.
40 PVR_RECORDING_FLAG_UNDEFINED = 0,
41
42 /// @brief __0000 0001__ : This recording is part of a series.
43 PVR_RECORDING_FLAG_IS_SERIES = (1 << 0),
44
45 /// @brief __0000 0010__ : This recording will be flagged as new.
46 PVR_RECORDING_FLAG_IS_NEW = (1 << 1),
47
48 /// @brief __0000 0100__ : This recording will be flagged as a premiere.
49 PVR_RECORDING_FLAG_IS_PREMIERE = (1 << 2),
50
51 /// @brief __0000 1000__ : This recording will be flagged as a finale.
52 PVR_RECORDING_FLAG_IS_FINALE = (1 << 3),
53
54 /// @brief __0001 0000__ : This recording will be flagged as live.
55 PVR_RECORDING_FLAG_IS_LIVE = (1 << 4),
56 } PVR_RECORDING_FLAG;
57 ///@}
58 //----------------------------------------------------------------------------
59
60 //============================================================================
61 /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
62 /// @brief Special @ref kodi::addon::PVRRecording::SetSeriesNumber() and
63 /// @ref kodi::addon::PVRRecording::SetEpisodeNumber() value to indicate it is
64 /// not to be used.
65 ///
66 /// Used if recording has no valid season and/or episode info.
67 ///
68 #define PVR_RECORDING_INVALID_SERIES_EPISODE EPG_TAG_INVALID_SERIES_EPISODE
69 //----------------------------------------------------------------------------
70
71 //============================================================================
72 /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording
73 /// @brief Value where set in background to inform that related part not used.
74 ///
75 /// Normally this related parts need not to set by this as it is default.
76 #define PVR_RECORDING_VALUE_NOT_AVAILABLE -1
77 //----------------------------------------------------------------------------
78
79 //============================================================================
80 /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_CHANNEL_TYPE enum PVR_RECORDING_CHANNEL_TYPE
81 /// @ingroup cpp_kodi_addon_pvr_Defs_Recording
82 /// @brief **PVR recording channel types**\n
83 /// Used on @ref kodi::addon::PVRRecording::SetChannelType() value to set related
84 /// type.
85 ///
86 ///@{
87 typedef enum PVR_RECORDING_CHANNEL_TYPE
88 {
89 /// @brief __0__ : Unknown type.
90 PVR_RECORDING_CHANNEL_TYPE_UNKNOWN = 0,
91
92 /// @brief __1__ : TV channel.
93 PVR_RECORDING_CHANNEL_TYPE_TV = 1,
94
95 /// @brief __2__ : Radio channel.
96 PVR_RECORDING_CHANNEL_TYPE_RADIO = 2,
97 } PVR_RECORDING_CHANNEL_TYPE;
98 ///@}
99 //----------------------------------------------------------------------------
100
101 /*!
102 * @brief "C" PVR add-on recording.
103 *
104 * Structure used to interface in "C" between Kodi and Addon.
105 *
106 * See @ref kodi::addon::PVRRecording for description of values.
107 */
108 typedef struct PVR_RECORDING
109 {
110 char strRecordingId[PVR_ADDON_NAME_STRING_LENGTH];
111 char strTitle[PVR_ADDON_NAME_STRING_LENGTH];
112 char strEpisodeName[PVR_ADDON_NAME_STRING_LENGTH];
113 int iSeriesNumber;
114 int iEpisodeNumber;
115 int iYear;
116 char strDirectory[PVR_ADDON_URL_STRING_LENGTH];
117 char strPlotOutline[PVR_ADDON_DESC_STRING_LENGTH];
118 char strPlot[PVR_ADDON_DESC_STRING_LENGTH];
119 char strGenreDescription[PVR_ADDON_DESC_STRING_LENGTH];
120 char strChannelName[PVR_ADDON_NAME_STRING_LENGTH];
121 char strIconPath[PVR_ADDON_URL_STRING_LENGTH];
122 char strThumbnailPath[PVR_ADDON_URL_STRING_LENGTH];
123 char strFanartPath[PVR_ADDON_URL_STRING_LENGTH];
124 time_t recordingTime;
125 int iDuration;
126 int iPriority;
127 int iLifetime;
128 int iGenreType;
129 int iGenreSubType;
130 int iPlayCount;
131 int iLastPlayedPosition;
132 bool bIsDeleted;
133 unsigned int iEpgEventId;
134 int iChannelUid;
135 enum PVR_RECORDING_CHANNEL_TYPE channelType;
136 char strFirstAired[PVR_ADDON_DATE_STRING_LENGTH];
137 unsigned int iFlags;
138 int64_t sizeInBytes;
139 } PVR_RECORDING;
140
141#ifdef __cplusplus
142}
143#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_stream.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_stream.h
deleted file mode 100644
index 04b4059..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_stream.h
+++ /dev/null
@@ -1,155 +0,0 @@
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 "pvr_defines.h"
12
13#ifdef BUILD_KODI_ADDON
14#include "../../../DemuxPacket.h"
15#else
16#include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h"
17#endif
18
19#include <stdint.h>
20#include <time.h>
21
22//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
23// "C" Definitions group 9 - PVR stream definitions (NOTE: Becomes replaced
24// in future by inputstream addon instance way)
25#ifdef __cplusplus
26extern "C"
27{
28#endif /* __cplusplus */
29
30 //============================================================================
31 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream
32 /// @brief Maximum of allowed streams
33 ///
34 #define PVR_STREAM_MAX_STREAMS 20
35 //----------------------------------------------------------------------------
36
37 //============================================================================
38 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream
39 /// @brief Invalid codec identifier
40 ///
41 #define PVR_INVALID_CODEC_ID 0
42 //----------------------------------------------------------------------------
43
44 //============================================================================
45 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream
46 /// @brief Invalid codec
47 ///
48 #define PVR_INVALID_CODEC \
49 { \
50 PVR_CODEC_TYPE_UNKNOWN, PVR_INVALID_CODEC_ID \
51 }
52 //----------------------------------------------------------------------------
53
54 //============================================================================
55 /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVR_CODEC_TYPE enum PVR_CODEC_TYPE
56 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream
57 /// @brief **Inputstream types**\n
58 /// To identify type on stream.
59 ///
60 /// Used on @ref kodi::addon::PVRStreamProperties::SetCodecType and @ref kodi::addon::PVRStreamProperties::SetCodecType.
61 ///
62 ///@{
63 typedef enum PVR_CODEC_TYPE
64 {
65 /// @brief To set nothing defined.
66 PVR_CODEC_TYPE_UNKNOWN = -1,
67
68 /// @brief To identify @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties as Video.
69 PVR_CODEC_TYPE_VIDEO,
70
71 /// @brief To identify @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties as Audio.
72 PVR_CODEC_TYPE_AUDIO,
73
74 /// @brief To identify @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties as Data.
75 ///
76 /// With codec id related source identified.
77 PVR_CODEC_TYPE_DATA,
78
79 /// @brief To identify @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties as Subtitle.
80 PVR_CODEC_TYPE_SUBTITLE,
81
82 /// @brief To identify @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties as Radio RDS.
83 PVR_CODEC_TYPE_RDS,
84
85 PVR_CODEC_TYPE_NB
86 } PVR_CODEC_TYPE;
87 ///@}
88 //----------------------------------------------------------------------------
89
90 //============================================================================
91 /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVR_CODEC struct PVR_CODEC
92 /// @ingroup cpp_kodi_addon_pvr_Defs_Stream
93 /// @brief **Codec identification structure**\n
94 /// Identifier about stream between Kodi and addon.
95 ///
96 ///@{
97 typedef struct PVR_CODEC
98 {
99 /// @brief Used codec type for stream.
100 enum PVR_CODEC_TYPE codec_type;
101
102 /// @brief Related codec identifier, normally match the ffmpeg id's.
103 unsigned int codec_id;
104 } PVR_CODEC;
105 ///@}
106 //----------------------------------------------------------------------------
107
108 /*!
109 * @brief "C" Stream properties
110 *
111 * Structure used to interface in "C" between Kodi and Addon.
112 *
113 * See @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties for description of values.
114 */
115 typedef struct PVR_STREAM_PROPERTIES
116 {
117 unsigned int iStreamCount;
118 struct PVR_STREAM
119 {
120 unsigned int iPID;
121 enum PVR_CODEC_TYPE iCodecType;
122 unsigned int iCodecId;
123 char strLanguage[4];
124 int iSubtitleInfo;
125 int iFPSScale;
126 int iFPSRate;
127 int iHeight;
128 int iWidth;
129 float fAspect;
130 int iChannels;
131 int iSampleRate;
132 int iBlockAlign;
133 int iBitRate;
134 int iBitsPerSample;
135 } stream[PVR_STREAM_MAX_STREAMS];
136 } PVR_STREAM_PROPERTIES;
137
138 /*!
139 * @brief "C" Times of playing stream (Live TV and recordings)
140 *
141 * Structure used to interface in "C" between Kodi and Addon.
142 *
143 * See @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes for description of values.
144 */
145 typedef struct PVR_STREAM_TIMES
146 {
147 time_t startTime;
148 int64_t ptsStart;
149 int64_t ptsBegin;
150 int64_t ptsEnd;
151 } PVR_STREAM_TIMES;
152
153#ifdef __cplusplus
154}
155#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_timers.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_timers.h
deleted file mode 100644
index bc16adb..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon-instance/pvr/pvr_timers.h
+++ /dev/null
@@ -1,407 +0,0 @@
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 "pvr_defines.h"
12
13#include <stdbool.h>
14#include <stdint.h>
15#include <time.h>
16
17//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
18// "C" Definitions group 6 - PVR timers
19#ifdef __cplusplus
20extern "C"
21{
22#endif /* __cplusplus */
23
24 //============================================================================
25 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_ definition PVR_TIMER (various)
26 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer
27 /// @brief **PVR timer various different definitions**\n
28 /// This mostly used on @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer "kodi::addon::PVRTimer"
29 /// to define default or not available.
30 ///
31 ///@{
32
33 //============================================================================
34 /// @brief Numeric PVR timer type definitions (@ref kodi::addon::PVRTimer::SetTimerType()
35 /// values).
36 ///
37 /// "Null" value for a numeric timer type.
38 #define PVR_TIMER_TYPE_NONE 0
39 //----------------------------------------------------------------------------
40
41 //============================================================================
42 /// @brief Special @ref kodi::addon::PVRTimer::SetClientIndex() value to indicate
43 /// that a timer has not (yet) a valid client index.
44 ///
45 /// Timer has not (yet) a valid client index.
46 #define PVR_TIMER_NO_CLIENT_INDEX 0
47 //----------------------------------------------------------------------------
48
49 //============================================================================
50 /// @brief Special @ref kodi::addon::PVRTimer::SetParentClientIndex() value to
51 /// indicate that a timer has no parent.
52 ///
53 /// Timer has no parent; it was not scheduled by a repeating timer.
54 #define PVR_TIMER_NO_PARENT PVR_TIMER_NO_CLIENT_INDEX
55 //----------------------------------------------------------------------------
56
57 //============================================================================
58 /// @brief Special @ref kodi::addon::PVRTimer::SetEPGUid() value to indicate
59 /// that a timer has no EPG event uid.
60 ///
61 /// Timer has no EPG event unique identifier.
62 #define PVR_TIMER_NO_EPG_UID EPG_TAG_INVALID_UID
63 //----------------------------------------------------------------------------
64
65 //============================================================================
66 /// @brief Special @ref kodi::addon::PVRTimer::SetClientChannelUid() value to
67 /// indicate "any channel". Useful for some repeating timer types.
68 ///
69 /// denotes "any channel", not a specific one.
70 ///
71 #define PVR_TIMER_ANY_CHANNEL -1
72 //----------------------------------------------------------------------------
73
74 //============================================================================
75 /// @brief Value where set in background to inform that related part not used.
76 ///
77 /// Normally this related parts need not to set by this as it is default.
78 #define PVR_TIMER_VALUE_NOT_AVAILABLE -1
79 //----------------------------------------------------------------------------
80
81 ///@}
82 //----------------------------------------------------------------------------
83
84
85 //============================================================================
86 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_TYPES enum PVR_TIMER_TYPES
87 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer
88 /// @brief **PVR timer type attributes (@ref kodi::addon::PVRTimerType::SetAttributes() values).**\n
89 /// To defines the attributes for a type. These values are bit fields that can be
90 /// used together.
91 ///
92 ///--------------------------------------------------------------------------
93 ///
94 /// **Example:**
95 /// ~~~~~~~~~~~~~{.cpp}
96 /// kodi::addon::PVRTimerType tag;
97 /// tag.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_REPEATING);
98 /// ~~~~~~~~~~~~~
99 ///
100 ///@{
101 typedef enum PVR_TIMER_TYPES
102 {
103 /// @brief __0000 0000 0000 0000 0000 0000 0000 0000__ :\n Empty attribute value.
104 PVR_TIMER_TYPE_ATTRIBUTE_NONE = 0,
105
106 /// @brief __0000 0000 0000 0000 0000 0000 0000 0001__ :\n Defines whether this is a type for
107 /// manual (time-based) or epg-based timers.
108 PVR_TIMER_TYPE_IS_MANUAL = (1 << 0),
109
110 /// @brief __0000 0000 0000 0000 0000 0000 0000 0010__ :\n Defines whether this is a type for
111 /// repeating or one-shot timers.
112 PVR_TIMER_TYPE_IS_REPEATING = (1 << 1),
113
114 /// @brief __0000 0000 0000 0000 0000 0000 0000 0100__ :\n Timers of this type must not be edited
115 /// by Kodi.
116 PVR_TIMER_TYPE_IS_READONLY = (1 << 2),
117
118 /// @brief __0000 0000 0000 0000 0000 0000 0000 1000__ :\n Timers of this type must not be created
119 /// by Kodi. All other operations are allowed, though.
120 PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES = (1 << 3),
121
122 /// @brief __0000 0000 0000 0000 0000 0000 0001 0000__ :\n This type supports enabling/disabling
123 /// of the timer (@ref kodi::addon::PVRTimer::SetState() with
124 /// @ref PVR_TIMER_STATE_SCHEDULED | @ref PVR_TIMER_STATE_DISABLED).
125 PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE = (1 << 4),
126
127 /// @brief __0000 0000 0000 0000 0000 0000 0010 0000__ :\n This type supports channels
128 /// (@ref kodi::addon::PVRTimer::SetClientChannelUid()).
129 PVR_TIMER_TYPE_SUPPORTS_CHANNELS = (1 << 5),
130
131 /// @brief __0000 0000 0000 0000 0000 0000 0100 0000__ :\n This type supports a recording start
132 /// time (@ref kodi::addon::PVRTimer::SetStartTime()).
133 PVR_TIMER_TYPE_SUPPORTS_START_TIME = (1 << 6),
134
135 /// @brief __0000 0000 0000 0000 0000 0000 1000 0000__ :\n This type supports matching epg episode
136 /// title using@ref kodi::addon::PVRTimer::SetEPGSearchString().
137 PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH = (1 << 7),
138
139 /// @brief __0000 0000 0000 0000 0000 0001 0000 0000__ :\n This type supports matching "more" epg
140 /// data (not just episode title) using @ref kodi::addon::PVRTimer::SetEPGSearchString().
141 /// Setting @ref PVR_TIMER_TYPE_SUPPORTS_FULLTEXT_EPG_MATCH implies
142 /// @ref PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH.
143 PVR_TIMER_TYPE_SUPPORTS_FULLTEXT_EPG_MATCH = (1 << 8),
144
145 /// @brief __0000 0000 0000 0000 0000 0010 0000 0000__ :\n This type supports a first day the
146 /// timer gets active (@ref kodi::addon::PVRTimer::SetFirstDay()).
147 PVR_TIMER_TYPE_SUPPORTS_FIRST_DAY = (1 << 9),
148
149 /// @brief __0000 0000 0000 0000 0000 0100 0000 0000__ :\n This type supports weekdays for
150 /// defining the recording schedule (@ref kodi::addon::PVRTimer::SetWeekdays()).
151 PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS = (1 << 10),
152
153 /// @brief __0000 0000 0000 0000 0000 1000 0000 0000__ :\n This type supports the <b>"record only new episodes"</b> feature
154 /// (@ref kodi::addon::PVRTimer::SetPreventDuplicateEpisodes()).
155 PVR_TIMER_TYPE_SUPPORTS_RECORD_ONLY_NEW_EPISODES = (1 << 11),
156
157 /// @brief __0000 0000 0000 0000 0001 0000 0000 0000__ :\n This type supports pre and post record time (@ref kodi::addon::PVRTimer::SetMarginStart(),
158 /// @ref kodi::addon::PVRTimer::SetMarginEnd()).
159 PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN = (1 << 12),
160
161 /// @brief __0000 0000 0000 0000 0010 0000 0000 0000__ :\n This type supports recording priority (@ref kodi::addon::PVRTimer::SetPriority()).
162 PVR_TIMER_TYPE_SUPPORTS_PRIORITY = (1 << 13),
163
164 /// @brief __0000 0000 0000 0000 0100 0000 0000 0000__ :\n This type supports recording lifetime (@ref kodi::addon::PVRTimer::SetLifetime()).
165 PVR_TIMER_TYPE_SUPPORTS_LIFETIME = (1 << 14),
166
167 /// @brief __0000 0000 0000 0000 1000 0000 0000 0000__ :\n This type supports placing recordings in user defined folders
168 /// (@ref kodi::addon::PVRTimer::SetDirectory()).
169 PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS = (1 << 15),
170
171 /// @brief __0000 0000 0000 0001 0000 0000 0000 0000__ :\n This type supports a list of recording groups
172 /// (@ref kodi::addon::PVRTimer::SetRecordingGroup()).
173 PVR_TIMER_TYPE_SUPPORTS_RECORDING_GROUP = (1 << 16),
174
175 /// @brief __0000 0000 0000 0010 0000 0000 0000 0000__ :\n This type supports a recording end time (@ref kodi::addon::PVRTimer::SetEndTime()).
176 PVR_TIMER_TYPE_SUPPORTS_END_TIME = (1 << 17),
177
178 /// @brief __0000 0000 0000 0100 0000 0000 0000 0000__ :\n Enables an 'Any Time' over-ride option for start time
179 /// (using @ref kodi::addon::PVRTimer::SetStartAnyTime()).
180 PVR_TIMER_TYPE_SUPPORTS_START_ANYTIME = (1 << 18),
181
182 /// @brief __0000 0000 0000 1000 0000 0000 0000 0000__ :\n Enables a separate <b>'Any Time'</b> over-ride for end time
183 /// (using @ref kodi::addon::PVRTimer::SetEndAnyTime()).
184 PVR_TIMER_TYPE_SUPPORTS_END_ANYTIME = (1 << 19),
185
186 /// @brief __0000 0000 0001 0000 0000 0000 0000 0000__ :\n This type supports specifying a maximum recordings setting'
187 /// (@ref kodi::addon::PVRTimer::SetMaxRecordings()).
188 PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS = (1 << 20),
189
190 /// @brief __0000 0000 0010 0000 0000 0000 0000 0000__ :\n This type should not appear on any create menus which don't
191 /// provide an associated @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag".
192 PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE = (1 << 21),
193
194 /// @brief __0000 0000 0100 0000 0000 0000 0000 0000__ :\n This type should not appear on any create menus which provide an
195 /// associated @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag".
196 PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE = (1 << 22),
197
198 /// @brief __0000 0000 1000 0000 0000 0000 0000 0000__ :\n This type should not appear on any create menus unless associated
199 /// with an @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag" with
200 /// 'series' attributes.
201 ///
202 /// Following conditions allow this:
203 /// - @ref kodi::addon::PVREPGTag::SetFlags() have flag @ref EPG_TAG_FLAG_IS_SERIES
204 /// - @ref kodi::addon::PVREPGTag::SetSeriesNumber() > 0
205 /// - @ref kodi::addon::PVREPGTag::SetEpisodeNumber() > 0
206 /// - @ref kodi::addon::PVREPGTag::SetEpisodePartNumber() > 0
207 ///
208 /// Implies @ref PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE.
209 PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE = (1 << 23),
210
211 /// @brief __0000 0001 0000 0000 0000 0000 0000 0000__ :\n This type supports 'any channel', for example when defining a timer
212 /// rule that should match any channel instaed of a particular channel.
213 PVR_TIMER_TYPE_SUPPORTS_ANY_CHANNEL = (1 << 24),
214
215 /// @brief __0000 0010 0000 0000 0000 0000 0000 0000__ :\n This type should not appear on any create menus which don't provide
216 /// an associated @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag" with
217 /// a series link.
218 PVR_TIMER_TYPE_REQUIRES_EPG_SERIESLINK_ON_CREATE = (1 << 25),
219
220 /// @brief __0000 0100 0000 0000 0000 0000 0000 0000__ :\n This type allows deletion of an otherwise read-only timer.
221 PVR_TIMER_TYPE_SUPPORTS_READONLY_DELETE = (1 << 26),
222
223 /// @brief __0000 1000 0000 0000 0000 0000 0000 0000__ :\n Timers of this type do trigger a reminder if time is up.
224 PVR_TIMER_TYPE_IS_REMINDER = (1 << 27),
225
226 /// @brief __0001 0000 0000 0000 0000 0000 0000 0000__ :\n This type supports pre record time (@ref kodi::addon::PVRTimer::SetMarginStart()).
227 PVR_TIMER_TYPE_SUPPORTS_START_MARGIN = (1 << 28),
228
229 /// @brief __0010 0000 0000 0000 0000 0000 0000 0000__ :\n This type supports post record time (@ref kodi::addon::PVRTimer::SetMarginEnd()).
230 PVR_TIMER_TYPE_SUPPORTS_END_MARGIN = (1 << 29),
231 } PVR_TIMER_TYPES;
232 ///@}
233 //----------------------------------------------------------------------------
234
235 //============================================================================
236 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVR_WEEKDAY enum PVR_WEEKDAY
237 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer
238 /// @brief **PVR timer weekdays** (@ref kodi::addon::PVRTimer::SetWeekdays() **values**)\n
239 /// Used to select the days of a week you want.
240 ///
241 /// It can be also used to select several days e.g.:
242 /// ~~~~~~~~~~~~~{.cpp}
243 /// ...
244 /// unsigned int day = PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_SATURDAY;
245 /// ...
246 /// ~~~~~~~~~~~~~
247 ///
248 ///@{
249 typedef enum PVR_WEEKDAYS
250 {
251 /// @brief __0000 0000__ : Nothing selected.
252 PVR_WEEKDAY_NONE = 0,
253
254 /// @brief __0000 0001__ : To select Monday.
255 PVR_WEEKDAY_MONDAY = (1 << 0),
256
257 /// @brief __0000 0010__ : To select Tuesday.
258 PVR_WEEKDAY_TUESDAY = (1 << 1),
259
260 /// @brief __0000 0100__ : To select Wednesday.
261 PVR_WEEKDAY_WEDNESDAY = (1 << 2),
262
263 /// @brief __0000 1000__ : To select Thursday.
264 PVR_WEEKDAY_THURSDAY = (1 << 3),
265
266 /// @brief __0001 0000__ : To select Friday.
267 PVR_WEEKDAY_FRIDAY = (1 << 4),
268
269 /// @brief __0010 0000__ : To select Saturday.
270 PVR_WEEKDAY_SATURDAY = (1 << 5),
271
272 /// @brief __0100 0000__ : To select Sunday.
273 PVR_WEEKDAY_SUNDAY = (1 << 6),
274
275 /// @brief __0111 1111__ : To select all days of week.
276 PVR_WEEKDAY_ALLDAYS = PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_TUESDAY | PVR_WEEKDAY_WEDNESDAY |
277 PVR_WEEKDAY_THURSDAY | PVR_WEEKDAY_FRIDAY | PVR_WEEKDAY_SATURDAY |
278 PVR_WEEKDAY_SUNDAY
279 } PVR_WEEKDAY;
280 ///@}
281 //----------------------------------------------------------------------------
282
283 //============================================================================
284 /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_STATE enum PVR_TIMER_STATE
285 /// @ingroup cpp_kodi_addon_pvr_Defs_Timer
286 /// @brief **PVR timer states**\n
287 /// To set within @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer "kodi::addon::PVRTimer"
288 /// the needed state about.
289 ///
290 ///@{
291 typedef enum PVR_TIMER_STATE
292 {
293 /// @brief __0__ : The timer was just created on the backend and is not yet active.
294 ///
295 /// This state must not be used for timers just created on the client side.
296 PVR_TIMER_STATE_NEW = 0,
297
298 /// @brief __1__ : The timer is scheduled for recording.
299 PVR_TIMER_STATE_SCHEDULED = 1,
300
301 /// @brief __2__ : The timer is currently recordings.
302 PVR_TIMER_STATE_RECORDING = 2,
303
304 /// @brief __3__ : The recording completed successfully.
305 PVR_TIMER_STATE_COMPLETED = 3,
306
307 /// @brief __4__ : Recording started, but was aborted.
308 PVR_TIMER_STATE_ABORTED = 4,
309
310 /// @brief __5__ : The timer was scheduled, but was canceled.
311 PVR_TIMER_STATE_CANCELLED = 5,
312
313 /// @brief __6__ : The scheduled timer conflicts with another one, but will be
314 /// recorded.
315 PVR_TIMER_STATE_CONFLICT_OK = 6,
316
317 /// @brief __7__ : The scheduled timer conflicts with another one and won't be
318 /// recorded.
319 PVR_TIMER_STATE_CONFLICT_NOK = 7,
320
321 /// @brief __8__ : The timer is scheduled, but can't be recorded for some reason.
322 PVR_TIMER_STATE_ERROR = 8,
323
324 /// @brief __9__ : The timer was disabled by the user, can be enabled via setting
325 /// the state to @ref PVR_TIMER_STATE_SCHEDULED.
326 PVR_TIMER_STATE_DISABLED = 9,
327 } PVR_TIMER_STATE;
328 ///@}
329 //----------------------------------------------------------------------------
330
331 /*!
332 * @brief "C" PVR add-on timer event.
333 *
334 * Structure used to interface in "C" between Kodi and Addon.
335 *
336 * See @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer "kodi::addon::PVRTimer" for
337 * description of values.
338 */
339 typedef struct PVR_TIMER
340 {
341 unsigned int iClientIndex;
342 unsigned int iParentClientIndex;
343 int iClientChannelUid;
344 time_t startTime;
345 time_t endTime;
346 bool bStartAnyTime;
347 bool bEndAnyTime;
348 enum PVR_TIMER_STATE state;
349 unsigned int iTimerType;
350 char strTitle[PVR_ADDON_NAME_STRING_LENGTH];
351 char strEpgSearchString[PVR_ADDON_NAME_STRING_LENGTH];
352 bool bFullTextEpgSearch;
353 char strDirectory[PVR_ADDON_URL_STRING_LENGTH];
354 char strSummary[PVR_ADDON_DESC_STRING_LENGTH];
355 int iPriority;
356 int iLifetime;
357 int iMaxRecordings;
358 unsigned int iRecordingGroup;
359 time_t firstDay;
360 unsigned int iWeekdays;
361 unsigned int iPreventDuplicateEpisodes;
362 unsigned int iEpgUid;
363 unsigned int iMarginStart;
364 unsigned int iMarginEnd;
365 int iGenreType;
366 int iGenreSubType;
367 char strSeriesLink[PVR_ADDON_URL_STRING_LENGTH];
368 } PVR_TIMER;
369
370 /*!
371 * @brief "C" PVR add-on timer event type.
372 *
373 * Structure used to interface in "C" between Kodi and Addon.
374 *
375 * See @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType "kodi::addon::PVRTimerType" for
376 * description of values.
377 */
378 typedef struct PVR_TIMER_TYPE
379 {
380 unsigned int iId;
381 uint64_t iAttributes;
382 char strDescription[PVR_ADDON_TIMERTYPE_STRING_LENGTH];
383
384 unsigned int iPrioritiesSize;
385 struct PVR_ATTRIBUTE_INT_VALUE priorities[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE];
386 int iPrioritiesDefault;
387
388 unsigned int iLifetimesSize;
389 struct PVR_ATTRIBUTE_INT_VALUE lifetimes[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE];
390 int iLifetimesDefault;
391
392 unsigned int iPreventDuplicateEpisodesSize;
393 struct PVR_ATTRIBUTE_INT_VALUE preventDuplicateEpisodes[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE];
394 unsigned int iPreventDuplicateEpisodesDefault;
395
396 unsigned int iRecordingGroupSize;
397 struct PVR_ATTRIBUTE_INT_VALUE recordingGroup[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE];
398 unsigned int iRecordingGroupDefault;
399
400 unsigned int iMaxRecordingsSize;
401 struct PVR_ATTRIBUTE_INT_VALUE maxRecordings[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL];
402 int iMaxRecordingsDefault;
403 } PVR_TIMER_TYPE;
404
405#ifdef __cplusplus
406}
407#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon_base.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon_base.h
deleted file mode 100644
index 1924d77..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/addon_base.h
+++ /dev/null
@@ -1,252 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 "stdbool.h"
12#include "stdint.h"
13
14#ifndef TARGET_WINDOWS
15#ifndef __cdecl
16#define __cdecl
17#endif
18#ifndef __declspec
19#define __declspec(X)
20#endif
21#endif
22
23#undef ATTRIBUTE_PACKED
24#undef PRAGMA_PACK_BEGIN
25#undef PRAGMA_PACK_END
26
27#if defined(__GNUC__)
28#define ATTRIBUTE_PACKED __attribute__((packed))
29#define PRAGMA_PACK 0
30#define ATTRIBUTE_HIDDEN __attribute__((visibility("hidden")))
31#endif
32
33#if !defined(ATTRIBUTE_PACKED)
34#define ATTRIBUTE_PACKED
35#define PRAGMA_PACK 1
36#endif
37
38#if !defined(ATTRIBUTE_HIDDEN)
39#define ATTRIBUTE_HIDDEN
40#endif
41
42#ifdef _MSC_VER
43#define ATTRIBUTE_FORCEINLINE __forceinline
44#elif defined(__GNUC__)
45#define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__))
46#elif defined(__CLANG__)
47#if __has_attribute(__always_inline__)
48#define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__))
49#else
50#define ATTRIBUTE_FORCEINLINE inline
51#endif
52#else
53#define ATTRIBUTE_FORCEINLINE inline
54#endif
55
56/*
57 * To have a on add-on and kodi itself handled string always on known size!
58 */
59#define ADDON_STANDARD_STRING_LENGTH 1024
60#define ADDON_STANDARD_STRING_LENGTH_SMALL 256
61
62#ifdef __cplusplus
63extern "C"
64{
65#endif /* __cplusplus */
66
67 //============================================================================
68 /// @ingroup cpp_kodi_addon_addonbase
69 /// @brief Return value of functions in @ref cpp_kodi_addon_addonbase "kodi::addon::CAddonBase"
70 /// and associated classes.
71 ///
72 ///@{
73 typedef enum ADDON_STATUS
74 {
75 /// @brief For everything OK and no error
76 ADDON_STATUS_OK,
77
78 /// @brief A needed connection was lost
79 ADDON_STATUS_LOST_CONNECTION,
80
81 /// @brief Addon needs a restart inside Kodi
82 ADDON_STATUS_NEED_RESTART,
83
84 /// @brief Necessary settings are not yet set
85 ADDON_STATUS_NEED_SETTINGS,
86
87 /// @brief Unknown and incomprehensible error
88 ADDON_STATUS_UNKNOWN,
89
90 /// @brief Permanent failure, like failing to resolve methods
91 ADDON_STATUS_PERMANENT_FAILURE,
92
93 /* internal used return error if function becomes not used from child on
94 * addon */
95 ADDON_STATUS_NOT_IMPLEMENTED
96 } ADDON_STATUS;
97 ///@}
98 //----------------------------------------------------------------------------
99
100 //============================================================================
101 /// @defgroup cpp_kodi_Defs_AddonLog enum AddonLog
102 /// @ingroup cpp_kodi_Defs
103 /// @brief **Log file type definitions**\n
104 /// These define the types of log entries given with @ref kodi::Log() to Kodi.
105 ///
106 /// -------------------------------------------------------------------------
107 ///
108 /// **Example:**
109 /// ~~~~~~~~~~~~~{.cpp}
110 /// #include <kodi/General.h>
111 ///
112 /// kodi::Log(ADDON_LOG_ERROR, "%s: There is an error occurred!", __func__);
113 ///
114 /// ~~~~~~~~~~~~~
115 ///
116 ///@{
117 typedef enum AddonLog
118 {
119 /// @brief **0** : To include debug information in the log file.
120 ADDON_LOG_DEBUG = 0,
121
122 /// @brief **1** : To include information messages in the log file.
123 ADDON_LOG_INFO = 1,
124
125 /// @brief **2** : To write warnings in the log file.
126 ADDON_LOG_WARNING = 2,
127
128 /// @brief **3** : To report error messages in the log file.
129 ADDON_LOG_ERROR = 3,
130
131 /// @brief **4** : To notify fatal unrecoverable errors, which can may also indicate
132 /// upcoming crashes.
133 ADDON_LOG_FATAL = 4
134 } AddonLog;
135 ///@}
136 //----------------------------------------------------------------------------
137
138 /*! @brief Standard undefined pointer handle */
139 typedef void* KODI_HANDLE;
140
141 /*!
142 * @brief Handle used to return data from the PVR add-on to CPVRClient
143 */
144 struct ADDON_HANDLE_STRUCT
145 {
146 void* callerAddress; /*!< address of the caller */
147 void* dataAddress; /*!< address to store data in */
148 int dataIdentifier; /*!< parameter to pass back when calling the callback */
149 };
150 typedef struct ADDON_HANDLE_STRUCT* ADDON_HANDLE;
151
152 /*!
153 * @brief Callback function tables from addon to Kodi
154 * Set complete from Kodi!
155 */
156 struct AddonToKodiFuncTable_kodi;
157 struct AddonToKodiFuncTable_kodi_audioengine;
158 struct AddonToKodiFuncTable_kodi_filesystem;
159 struct AddonToKodiFuncTable_kodi_network;
160 struct AddonToKodiFuncTable_kodi_gui;
161 typedef struct AddonToKodiFuncTable_Addon
162 {
163 // Pointer inside Kodi, used on callback functions to give related handle
164 // class, for this ADDON::CAddonDll inside Kodi.
165 KODI_HANDLE kodiBase;
166
167 // Function addresses used for callbacks from addon to Kodi
168 char* (*get_type_version)(void* kodiBase, int type);
169
170 void (*free_string)(void* kodiBase, char* str);
171 void (*free_string_array)(void* kodiBase, char** arr, int numElements);
172 char* (*get_addon_path)(void* kodiBase);
173 char* (*get_base_user_path)(void* kodiBase);
174 void (*addon_log_msg)(void* kodiBase, const int loglevel, const char* msg);
175
176 bool (*get_setting_bool)(void* kodiBase, const char* id, bool* value);
177 bool (*get_setting_int)(void* kodiBase, const char* id, int* value);
178 bool (*get_setting_float)(void* kodiBase, const char* id, float* value);
179 bool (*get_setting_string)(void* kodiBase, const char* id, char** value);
180
181 bool (*set_setting_bool)(void* kodiBase, const char* id, bool value);
182 bool (*set_setting_int)(void* kodiBase, const char* id, int value);
183 bool (*set_setting_float)(void* kodiBase, const char* id, float value);
184 bool (*set_setting_string)(void* kodiBase, const char* id, const char* value);
185
186 void* (*get_interface)(void* kodiBase, const char* name, const char* version);
187
188 struct AddonToKodiFuncTable_kodi* kodi;
189 struct AddonToKodiFuncTable_kodi_audioengine* kodi_audioengine;
190 struct AddonToKodiFuncTable_kodi_filesystem* kodi_filesystem;
191 struct AddonToKodiFuncTable_kodi_gui* kodi_gui;
192 struct AddonToKodiFuncTable_kodi_network* kodi_network;
193
194 // Move up by min version change about
195 bool (*is_setting_using_default)(void* kodiBase, const char* id);
196 } AddonToKodiFuncTable_Addon;
197
198 /*!
199 * @brief Function tables from Kodi to addon
200 */
201 typedef struct KodiToAddonFuncTable_Addon
202 {
203 void (*destroy)();
204 ADDON_STATUS (*get_status)();
205 ADDON_STATUS(*create_instance)
206 (int instanceType,
207 const char* instanceID,
208 KODI_HANDLE instance,
209 const char* version,
210 KODI_HANDLE* addonInstance,
211 KODI_HANDLE parent);
212 void (*destroy_instance)(int instanceType, KODI_HANDLE instance);
213 ADDON_STATUS (*set_setting)(const char* settingName, const void* settingValue);
214 } KodiToAddonFuncTable_Addon;
215
216 /*!
217 * @brief Main structure passed from kodi to addon with basic information needed to
218 * create add-on.
219 */
220 typedef struct AddonGlobalInterface
221 {
222 // String with full path where add-on is installed (without his name on end)
223 // Set from Kodi!
224 const char* libBasePath;
225
226 // Master API version of Kodi itself (ADDON_GLOBAL_VERSION_MAIN)
227 const char* kodi_base_api_version;
228
229 // Pointer of first created instance, used in case this add-on goes with single way
230 // Set from Kodi!
231 KODI_HANDLE firstKodiInstance;
232
233 // Pointer to master base class inside add-on
234 // Set from addon header (kodi::addon::CAddonBase)!
235 KODI_HANDLE addonBase;
236
237 // Pointer to a instance used on single way (together with this class)
238 // Set from addon header (kodi::addon::IAddonInstance)!
239 KODI_HANDLE globalSingleInstance;
240
241 // Callback function tables from addon to Kodi
242 // Set from Kodi!
243 AddonToKodiFuncTable_Addon* toKodi;
244
245 // Function tables from Kodi to addon
246 // Set from addon header!
247 KodiToAddonFuncTable_Addon* toAddon;
248 } AddonGlobalInterface;
249
250#ifdef __cplusplus
251}
252#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/audio_engine.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/audio_engine.h
deleted file mode 100644
index 02e96ac..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/audio_engine.h
+++ /dev/null
@@ -1,308 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 "stdint.h"
12
13#ifdef __cplusplus
14extern "C"
15{
16#endif /* __cplusplus */
17
18 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
19 // "C" Definitions, structures and enumerators of audio engine
20 //{{{
21
22 //============================================================================
23 /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineStreamOptions enum AudioEngineStreamOptions
24 /// @ingroup cpp_kodi_audioengine_Defs
25 /// @brief **Bit options to pass to CAEStream**\n
26 /// A bit field of stream options.
27 ///
28 ///
29 /// ------------------------------------------------------------------------
30 ///
31 /// **Usage example:**
32 /// ~~~~~~~~~~~~~{.cpp}
33 /// // Here only as minimal, "format" must be set to wanted types
34 /// kodi::audioengine::AudioEngineFormat format;
35 /// m_audioengine = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_FORCE_RESAMPLE | AUDIO_STREAM_AUTOSTART);
36 /// ~~~~~~~~~~~~~
37 ///
38 //@{
39 typedef enum AudioEngineStreamOptions
40 {
41 /// force resample even if rates match
42 AUDIO_STREAM_FORCE_RESAMPLE = 1 << 0,
43 /// create the stream paused
44 AUDIO_STREAM_PAUSED = 1 << 1,
45 /// autostart the stream when enough data is buffered
46 AUDIO_STREAM_AUTOSTART = 1 << 2,
47 } AudioEngineStreamOptions;
48 //@}
49 //----------------------------------------------------------------------------
50
51 //============================================================================
52 /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineChannel enum AudioEngineChannel
53 /// @ingroup cpp_kodi_audioengine_Defs
54 /// @brief **The possible channels**\n
55 /// Used to set available or used channels on stream.
56 ///
57 ///
58 /// ------------------------------------------------------------------------
59 ///
60 /// **Usage example:**
61 /// ~~~~~~~~~~~~~{.cpp}
62 /// kodi::audioengine::AudioEngineFormat format;
63 /// format.SetChannelLayout(std::vector<AudioEngineChannel>(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR));
64 /// ~~~~~~~~~~~~~
65 ///
66 //@{
67 enum AudioEngineChannel
68 {
69 /// Used inside to indicate the end of a list and not for addon use directly.
70 AUDIOENGINE_CH_NULL = -1,
71 /// RAW Audio format
72 AUDIOENGINE_CH_RAW,
73 /// Front left
74 AUDIOENGINE_CH_FL,
75 /// Front right
76 AUDIOENGINE_CH_FR,
77 /// Front center
78 AUDIOENGINE_CH_FC,
79 /// LFE / Subwoofer
80 AUDIOENGINE_CH_LFE,
81 /// Back left
82 AUDIOENGINE_CH_BL,
83 /// Back right
84 AUDIOENGINE_CH_BR,
85 /// Front left over center
86 AUDIOENGINE_CH_FLOC,
87 /// Front right over center
88 AUDIOENGINE_CH_FROC,
89 /// Back center
90 AUDIOENGINE_CH_BC,
91 /// Side left
92 AUDIOENGINE_CH_SL,
93 /// Side right
94 AUDIOENGINE_CH_SR,
95 /// Top front left
96 AUDIOENGINE_CH_TFL,
97 /// Top front right
98 AUDIOENGINE_CH_TFR,
99 /// Top front center
100 AUDIOENGINE_CH_TFC,
101 /// Top center
102 AUDIOENGINE_CH_TC,
103 /// Top back left
104 AUDIOENGINE_CH_TBL,
105 /// Top back right
106 AUDIOENGINE_CH_TBR,
107 /// Top back center
108 AUDIOENGINE_CH_TBC,
109 /// Back left over center
110 AUDIOENGINE_CH_BLOC,
111 /// Back right over center
112 AUDIOENGINE_CH_BROC,
113 /// Maximum possible value, to use e.g. as size inside list
114 AUDIOENGINE_CH_MAX
115 };
116 //@}
117 //----------------------------------------------------------------------------
118
119 //============================================================================
120 /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineDataFormat enum AudioEngineDataFormat
121 /// @ingroup cpp_kodi_audioengine_Defs
122 /// @brief **Audio sample formats**\n
123 /// The bit layout of the audio data.
124 ///
125 /// LE = Little Endian, BE = Big Endian, NE = Native Endian
126 ///
127 /// For planar sample formats, each audio channel is in a separate data plane,
128 /// and linesize is the buffer size, in bytes, for a single plane. All data
129 /// planes must be the same size. For packed sample formats, only the first
130 /// data plane is used, and samples for each channel are interleaved. In this
131 /// case, linesize is the buffer size, in bytes, for the 1 plane.
132 ///
133 /// @note This is ordered from the worst to best preferred formats
134 ///
135 ///
136 /// ------------------------------------------------------------------------
137 ///
138 /// **Usage example:**
139 /// ~~~~~~~~~~~~~{.cpp}
140 /// kodi::audioengine::AudioEngineFormat format;
141 /// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP);
142 /// ~~~~~~~~~~~~~
143 ///
144 //@{
145 enum AudioEngineDataFormat
146 {
147 /// To define format as invalid
148 AUDIOENGINE_FMT_INVALID = -1,
149
150 /// Unsigned integer 8 bit
151 AUDIOENGINE_FMT_U8,
152
153 /// Big Endian signed integer 16 bit
154 AUDIOENGINE_FMT_S16BE,
155 /// Little Endian signed integer 16 bit
156 AUDIOENGINE_FMT_S16LE,
157 /// Native Endian signed integer 16 bit
158 AUDIOENGINE_FMT_S16NE,
159
160 /// Big Endian signed integer 32 bit
161 AUDIOENGINE_FMT_S32BE,
162 /// Little Endian signed integer 32 bit
163 AUDIOENGINE_FMT_S32LE,
164 /// Native Endian signed integer 32 bit
165 AUDIOENGINE_FMT_S32NE,
166
167 /// Big Endian signed integer 24 bit (in 4 bytes)
168 AUDIOENGINE_FMT_S24BE4,
169 /// Little Endian signed integer 24 bit (in 4 bytes)
170 AUDIOENGINE_FMT_S24LE4,
171 /// Native Endian signed integer 24 bit (in 4 bytes)
172 AUDIOENGINE_FMT_S24NE4,
173 /// S32 with bits_per_sample < 32
174 AUDIOENGINE_FMT_S24NE4MSB,
175
176 /// Big Endian signed integer 24 bit (3 bytes)
177 AUDIOENGINE_FMT_S24BE3,
178 /// Little Endian signed integer 24 bit (3 bytes)
179 AUDIOENGINE_FMT_S24LE3,
180 /// Native Endian signed integer 24 bit (3 bytes)
181 AUDIOENGINE_FMT_S24NE3,
182
183 /// Double floating point
184 AUDIOENGINE_FMT_DOUBLE,
185 /// Floating point
186 AUDIOENGINE_FMT_FLOAT,
187
188 /// **Bitstream**\n
189 /// RAW Audio format
190 AUDIOENGINE_FMT_RAW,
191
192 /// **Planar format**\n
193 /// Unsigned byte
194 AUDIOENGINE_FMT_U8P,
195 /// **Planar format**\n
196 /// Native Endian signed 16 bit
197 AUDIOENGINE_FMT_S16NEP,
198 /// **Planar format**\n
199 /// Native Endian signed 32 bit
200 AUDIOENGINE_FMT_S32NEP,
201 /// **Planar format**\n
202 /// Native Endian signed integer 24 bit (in 4 bytes)
203 AUDIOENGINE_FMT_S24NE4P,
204 /// **Planar format**\n
205 /// S32 with bits_per_sample < 32
206 AUDIOENGINE_FMT_S24NE4MSBP,
207 /// **Planar format**\n
208 /// Native Endian signed integer 24 bit (in 3 bytes)
209 AUDIOENGINE_FMT_S24NE3P,
210 /// **Planar format**\n
211 /// Double floating point
212 AUDIOENGINE_FMT_DOUBLEP,
213 /// **Planar format**\n
214 /// Floating point
215 AUDIOENGINE_FMT_FLOATP,
216
217 /// Amount of sample formats.
218 AUDIOENGINE_FMT_MAX
219 };
220 //@}
221 //----------------------------------------------------------------------------
222
223 /*!
224 * @brief Internal API structure which are used for data exchange between
225 * Kodi and addon.
226 */
227 struct AUDIO_ENGINE_FORMAT
228 {
229 /*! The stream's data format (eg, AUDIOENGINE_FMT_S16LE) */
230 enum AudioEngineDataFormat m_dataFormat;
231
232 /*! The stream's sample rate (eg, 48000) */
233 unsigned int m_sampleRate;
234
235 /*! The encoded streams sample rate if a bitstream, otherwise undefined */
236 unsigned int m_encodedRate;
237
238 /*! The amount of used speaker channels */
239 unsigned int m_channelCount;
240
241 /*! The stream's channel layout */
242 enum AudioEngineChannel m_channels[AUDIOENGINE_CH_MAX];
243
244 /*! The number of frames per period */
245 unsigned int m_frames;
246
247 /*! The size of one frame in bytes */
248 unsigned int m_frameSize;
249 };
250
251 /* A stream handle pointer, which is only used internally by the addon stream handle */
252 typedef void AEStreamHandle;
253
254 //}}}
255
256 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
257 // "C" Internal interface tables for intercommunications between addon and kodi
258 //{{{
259
260 /*
261 * Function address structure, not need to visible on dev kit doxygen
262 * documentation
263 */
264 typedef struct AddonToKodiFuncTable_kodi_audioengine
265 {
266 AEStreamHandle* (*make_stream)(void* kodiBase,
267 struct AUDIO_ENGINE_FORMAT* format,
268 unsigned int options);
269 void (*free_stream)(void* kodiBase, AEStreamHandle* stream);
270 bool (*get_current_sink_format)(void* kodiBase, struct AUDIO_ENGINE_FORMAT* sink_format);
271
272 // Audio Engine Stream definitions
273 unsigned int (*aestream_get_space)(void* kodiBase, AEStreamHandle* handle);
274 unsigned int (*aestream_add_data)(void* kodiBase,
275 AEStreamHandle* handle,
276 uint8_t* const* data,
277 unsigned int offset,
278 unsigned int frames,
279 double pts,
280 bool hasDownmix,
281 double centerMixLevel);
282 double (*aestream_get_delay)(void* kodiBase, AEStreamHandle* handle);
283 bool (*aestream_is_buffering)(void* kodiBase, AEStreamHandle* handle);
284 double (*aestream_get_cache_time)(void* kodiBase, AEStreamHandle* handle);
285 double (*aestream_get_cache_total)(void* kodiBase, AEStreamHandle* handle);
286 void (*aestream_pause)(void* kodiBase, AEStreamHandle* handle);
287 void (*aestream_resume)(void* kodiBase, AEStreamHandle* handle);
288 void (*aestream_drain)(void* kodiBase, AEStreamHandle* handle, bool wait);
289 bool (*aestream_is_draining)(void* kodiBase, AEStreamHandle* handle);
290 bool (*aestream_is_drained)(void* kodiBase, AEStreamHandle* handle);
291 void (*aestream_flush)(void* kodiBase, AEStreamHandle* handle);
292 float (*aestream_get_volume)(void* kodiBase, AEStreamHandle* handle);
293 void (*aestream_set_volume)(void* kodiBase, AEStreamHandle* handle, float volume);
294 float (*aestream_get_amplification)(void* kodiBase, AEStreamHandle* handle);
295 void (*aestream_set_amplification)(void* kodiBase, AEStreamHandle* handle, float amplify);
296 unsigned int (*aestream_get_frame_size)(void* kodiBase, AEStreamHandle* handle);
297 unsigned int (*aestream_get_channel_count)(void* kodiBase, AEStreamHandle* handle);
298 unsigned int (*aestream_get_sample_rate)(void* kodiBase, AEStreamHandle* handle);
299 enum AudioEngineDataFormat (*aestream_get_data_format)(void* kodiBase, AEStreamHandle* handle);
300 double (*aestream_get_resample_ratio)(void* kodiBase, AEStreamHandle* handle);
301 void (*aestream_set_resample_ratio)(void* kodiBase, AEStreamHandle* handle, double ratio);
302 } AddonToKodiFuncTable_kodi_audioengine;
303
304 //}}}
305
306#ifdef __cplusplus
307}
308#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/filesystem.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/filesystem.h
deleted file mode 100644
index b68a24c..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/filesystem.h
+++ /dev/null
@@ -1,299 +0,0 @@
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 <stdbool.h>
12#include <stdint.h>
13#include <time.h>
14
15#ifdef _WIN32 // windows
16#ifndef _SSIZE_T_DEFINED
17typedef intptr_t ssize_t;
18#define _SSIZE_T_DEFINED
19#endif // !_SSIZE_T_DEFINED
20
21// Prevent conflicts with Windows macros where have this names.
22#ifdef CreateDirectory
23#undef CreateDirectory
24#endif // CreateDirectory
25#ifdef DeleteFile
26#undef DeleteFile
27#endif // DeleteFile
28#endif // _WIN32
29
30#ifdef __cplusplus
31extern "C"
32{
33#endif /* __cplusplus */
34
35 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
36 // "C" Definitions, structures and enumerators of filesystem
37 //{{{
38
39 //============================================================================
40 /// @defgroup cpp_kodi_vfs_Defs_OpenFileFlags enum OpenFileFlags
41 /// @ingroup cpp_kodi_vfs_Defs
42 /// @brief **Flags to define way how file becomes opened**\n
43 /// The values can be used together, e.g. <b>`file.Open("myfile", ADDON_READ_TRUNCATED | ADDON_READ_CHUNKED);`</b>
44 ///
45 /// Used on @ref kodi::vfs::CFile::OpenFile().
46 ///
47 ///@{
48 typedef enum OpenFileFlags
49 {
50 /// @brief **0000 0000 0001** :\n
51 /// Indicate that caller can handle truncated reads, where function
52 /// returns before entire buffer has been filled.
53 ADDON_READ_TRUNCATED = 0x01,
54
55 /// @brief **0000 0000 0010** :\n
56 /// Indicate that that caller support read in the minimum defined
57 /// chunk size, this disables internal cache then.
58 ADDON_READ_CHUNKED = 0x02,
59
60 /// @brief **0000 0000 0100** :\n
61 /// Use cache to access this file.
62 ADDON_READ_CACHED = 0x04,
63
64 /// @brief **0000 0000 1000** :\n
65 /// Open without caching. regardless to file type.
66 ADDON_READ_NO_CACHE = 0x08,
67
68 /// @brief **0000 0001 0000** :\n
69 /// Calcuate bitrate for file while reading.
70 ADDON_READ_BITRATE = 0x10,
71
72 /// @brief **0000 0010 0000** :\n
73 /// Indicate to the caller we will seek between multiple streams in
74 /// the file frequently.
75 ADDON_READ_MULTI_STREAM = 0x20,
76
77 /// @brief **0000 0100 0000** :\n
78 /// indicate to the caller file is audio and/or video (and e.g. may
79 /// grow).
80 ADDON_READ_AUDIO_VIDEO = 0x40,
81
82 /// @brief **0000 1000 0000** :\n
83 /// Indicate that caller will do write operations before reading.
84 ADDON_READ_AFTER_WRITE = 0x80,
85
86 /// @brief **0001 0000 0000** :\n
87 /// Indicate that caller want to reopen a file if its already open.
88 ADDON_READ_REOPEN = 0x100
89 } OpenFileFlags;
90 ///@}
91 //----------------------------------------------------------------------------
92
93 //============================================================================
94 /// @defgroup cpp_kodi_vfs_Defs_CURLOptiontype enum CURLOptiontype
95 /// @ingroup cpp_kodi_vfs_Defs
96 /// @brief **CURL message types**\n
97 /// Used on kodi::vfs::CFile::CURLAddOption().
98 ///
99 //@{
100 typedef enum CURLOptiontype
101 {
102 /// @brief Set a general option.
103 ADDON_CURL_OPTION_OPTION,
104
105 /// @brief Set a protocol option.
106 ///
107 /// The following names for *ADDON_CURL_OPTION_PROTOCOL* are possible:
108 ///
109 /// | Option name | Description
110 /// |------------------------------------:|:--------------------------------
111 /// | <b>`accept-charset`</b> | Set the "accept-charset" header
112 /// | <b>`acceptencoding or encoding`</b> | Set the "accept-encoding" header
113 /// | <b>`active-remote`</b> | Set the "active-remote" header
114 /// | <b>`auth`</b> | Set the authentication method. Possible values: any, anysafe, digest, ntlm
115 /// | <b>`connection-timeout`</b> | Set the connection timeout in seconds
116 /// | <b>`cookie`</b> | Set the "cookie" header
117 /// | <b>`customrequest`</b> | Set a custom HTTP request like DELETE
118 /// | <b>`noshout`</b> | Set to true if kodi detects a stream as shoutcast by mistake.
119 /// | <b>`postdata`</b> | Set the post body (value needs to be base64 encoded). (Implicitly sets the request to POST)
120 /// | <b>`referer`</b> | Set the "referer" header
121 /// | <b>`user-agent`</b> | Set the "user-agent" header
122 /// | <b>`seekable`</b> | Set the stream seekable. 1: enable, 0: disable
123 /// | <b>`sslcipherlist`</b> | Set list of accepted SSL ciphers.
124 ///
125 ADDON_CURL_OPTION_PROTOCOL,
126
127 /// @brief Set User and password
128 ADDON_CURL_OPTION_CREDENTIALS,
129
130 /// @brief Add a Header
131 ADDON_CURL_OPTION_HEADER
132 } CURLOptiontype;
133 //@}
134 //----------------------------------------------------------------------------
135
136 //============================================================================
137 /// @defgroup cpp_kodi_vfs_Defs_FilePropertyTypes enum FilePropertyTypes
138 /// @ingroup cpp_kodi_vfs_Defs
139 /// @brief **File property types**\n
140 /// Mostly to read internet sources.
141 ///
142 /// Used on kodi::vfs::CFile::GetPropertyValue() and kodi::vfs::CFile::GetPropertyValues().
143 ///
144 //@{
145 typedef enum FilePropertyTypes
146 {
147 /// @brief Get protocol response line.
148 ADDON_FILE_PROPERTY_RESPONSE_PROTOCOL,
149 /// @brief Get a response header.
150 ADDON_FILE_PROPERTY_RESPONSE_HEADER,
151 /// @brief Get file content type.
152 ADDON_FILE_PROPERTY_CONTENT_TYPE,
153 /// @brief Get file content charset.
154 ADDON_FILE_PROPERTY_CONTENT_CHARSET,
155 /// @brief Get file mime type.
156 ADDON_FILE_PROPERTY_MIME_TYPE,
157 /// @brief Get file effective URL (last one if redirected).
158 ADDON_FILE_PROPERTY_EFFECTIVE_URL
159 } FilePropertyTypes;
160 //@}
161 //----------------------------------------------------------------------------
162
163 //}}}
164
165 //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
166 // "C" Internal interface tables for intercommunications between addon and kodi
167 //{{{
168
169 struct KODI_HTTP_HEADER
170 {
171 void* handle;
172
173 char* (*get_value)(void* kodiBase, void* handle, const char* param);
174 char** (*get_values)(void* kodiBase, void* handle, const char* param, int* length);
175 char* (*get_header)(void* kodiBase, void* handle);
176 char* (*get_mime_type)(void* kodiBase, void* handle);
177 char* (*get_charset)(void* kodiBase, void* handle);
178 char* (*get_proto_line)(void* kodiBase, void* handle);
179 };
180
181 struct STAT_STRUCTURE
182 {
183 /// ID of device containing file
184 uint32_t deviceId;
185 /// Total size, in bytes
186 uint64_t size;
187 /// Time of last access
188 time_t accessTime;
189 /// Time of last modification
190 time_t modificationTime;
191 /// Time of last status change
192 time_t statusTime;
193 /// The stat url is a directory
194 bool isDirectory;
195 /// The stat url is a symbolic link
196 bool isSymLink;
197 };
198
199 struct VFS_CACHE_STATUS_DATA
200 {
201 uint64_t forward;
202 unsigned int maxrate;
203 unsigned int currate;
204 bool lowspeed;
205 };
206
207 struct VFSProperty
208 {
209 char* name;
210 char* val;
211 };
212
213 struct VFSDirEntry
214 {
215 char* label; //!< item label
216 char* title; //!< item title
217 char* path; //!< item path
218 unsigned int num_props; //!< Number of properties attached to item
219 struct VFSProperty* properties; //!< Properties
220 time_t date_time; //!< file creation date & time
221 bool folder; //!< Item is a folder
222 uint64_t size; //!< Size of file represented by item
223 };
224
225 typedef struct AddonToKodiFuncTable_kodi_filesystem
226 {
227 bool (*can_open_directory)(void* kodiBase, const char* url);
228 bool (*create_directory)(void* kodiBase, const char* path);
229 bool (*remove_directory)(void* kodiBase, const char* path);
230 bool (*directory_exists)(void* kodiBase, const char* path);
231 bool (*get_directory)(void* kodiBase,
232 const char* path,
233 const char* mask,
234 struct VFSDirEntry** items,
235 unsigned int* num_items);
236 void (*free_directory)(void* kodiBase, struct VFSDirEntry* items, unsigned int num_items);
237
238 bool (*file_exists)(void* kodiBase, const char* filename, bool useCache);
239 bool (*stat_file)(void* kodiBase, const char* filename, struct STAT_STRUCTURE* buffer);
240 bool (*delete_file)(void* kodiBase, const char* filename);
241 bool (*rename_file)(void* kodiBase, const char* filename, const char* newFileName);
242 bool (*copy_file)(void* kodiBase, const char* filename, const char* dest);
243
244 char* (*get_file_md5)(void* kodiBase, const char* filename);
245 char* (*get_cache_thumb_name)(void* kodiBase, const char* filename);
246 char* (*make_legal_filename)(void* kodiBase, const char* filename);
247 char* (*make_legal_path)(void* kodiBase, const char* path);
248 char* (*translate_special_protocol)(void* kodiBase, const char* strSource);
249 bool (*is_internet_stream)(void* kodiBase, const char* path, bool strictCheck);
250 bool (*is_on_lan)(void* kodiBase, const char* path);
251 bool (*is_remote)(void* kodiBase, const char* path);
252 bool (*is_local)(void* kodiBase, const char* path);
253 bool (*is_url)(void* kodiBase, const char* path);
254 bool (*get_http_header)(void* kodiBase, const char* url, struct KODI_HTTP_HEADER* headers);
255 bool (*get_mime_type)(void* kodiBase, const char* url, char** content, const char* useragent);
256 bool (*get_content_type)(void* kodiBase,
257 const char* url,
258 char** content,
259 const char* useragent);
260 bool (*get_cookies)(void* kodiBase, const char* url, char** cookies);
261 bool (*http_header_create)(void* kodiBase, struct KODI_HTTP_HEADER* headers);
262 void (*http_header_free)(void* kodiBase, struct KODI_HTTP_HEADER* headers);
263
264 void* (*open_file)(void* kodiBase, const char* filename, unsigned int flags);
265 void* (*open_file_for_write)(void* kodiBase, const char* filename, bool overwrite);
266 ssize_t (*read_file)(void* kodiBase, void* file, void* ptr, size_t size);
267 bool (*read_file_string)(void* kodiBase, void* file, char* szLine, int iLineLength);
268 ssize_t (*write_file)(void* kodiBase, void* file, const void* ptr, size_t size);
269 void (*flush_file)(void* kodiBase, void* file);
270 int64_t (*seek_file)(void* kodiBase, void* file, int64_t position, int whence);
271 int (*truncate_file)(void* kodiBase, void* file, int64_t size);
272 int64_t (*get_file_position)(void* kodiBase, void* file);
273 int64_t (*get_file_length)(void* kodiBase, void* file);
274 double (*get_file_download_speed)(void* kodiBase, void* file);
275 void (*close_file)(void* kodiBase, void* file);
276 int (*get_file_chunk_size)(void* kodiBase, void* file);
277 bool (*io_control_get_seek_possible)(void* kodiBase, void* file);
278 bool (*io_control_get_cache_status)(void* kodiBase,
279 void* file,
280 struct VFS_CACHE_STATUS_DATA* status);
281 bool (*io_control_set_cache_rate)(void* kodiBase, void* file, unsigned int rate);
282 bool (*io_control_set_retry)(void* kodiBase, void* file, bool retry);
283 char** (*get_property_values)(
284 void* kodiBase, void* file, int type, const char* name, int* numValues);
285
286 void* (*curl_create)(void* kodiBase, const char* url);
287 bool (*curl_add_option)(
288 void* kodiBase, void* file, int type, const char* name, const char* value);
289 bool (*curl_open)(void* kodiBase, void* file, unsigned int flags);
290
291 bool (*get_disk_space)(
292 void* kodiBase, const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available);
293 } AddonToKodiFuncTable_kodi_filesystem;
294
295 //}}}
296
297#ifdef __cplusplus
298} /* extern "C" */
299#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/general.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/general.h
deleted file mode 100644
index ede8e94..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/general.h
+++ /dev/null
@@ -1,123 +0,0 @@
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#ifdef __cplusplus
12extern "C"
13{
14#endif /* __cplusplus */
15
16 //============================================================================
17 /// \ingroup cpp_kodi_Defs
18 /// @brief For kodi::CurrentKeyboardLayout used defines
19 ///
20 typedef enum StdKbButtons
21 {
22 /// The quantity of buttons per row on Kodi's standard keyboard
23 STD_KB_BUTTONS_PER_ROW = 20,
24 /// The quantity of rows on Kodi's standard keyboard
25 STD_KB_BUTTONS_MAX_ROWS = 4,
26 /// Keyboard layout type, this for initial standard
27 STD_KB_MODIFIER_KEY_NONE = 0x00,
28 /// Keyboard layout type, this for shift controled layout (uppercase)
29 STD_KB_MODIFIER_KEY_SHIFT = 0x01,
30 /// Keyboard layout type, this to show symbols
31 STD_KB_MODIFIER_KEY_SYMBOL = 0x02
32 } StdKbButtons;
33 //----------------------------------------------------------------------------
34
35 //============================================================================
36 /// \ingroup cpp_kodi_Defs
37 /// @brief For kodi::QueueNotification() used message types
38 ///
39 typedef enum QueueMsg
40 {
41 /// Show info notification message
42 QUEUE_INFO,
43 /// Show warning notification message
44 QUEUE_WARNING,
45 /// Show error notification message
46 QUEUE_ERROR,
47 /// Show with own given image and parts if set on values
48 QUEUE_OWN_STYLE
49 } QueueMsg;
50 //----------------------------------------------------------------------------
51
52 //============================================================================
53 /// \ingroup cpp_kodi_Defs
54 /// @brief Format codes to get string from them.
55 ///
56 /// Used on kodi::GetLanguage().
57 ///
58 typedef enum LangFormats
59 {
60 /// two letter code as defined in ISO 639-1
61 LANG_FMT_ISO_639_1,
62 /// three letter code as defined in ISO 639-2/T or ISO 639-2/B
63 LANG_FMT_ISO_639_2,
64 /// full language name in English
65 LANG_FMT_ENGLISH_NAME
66 } LangFormats;
67 //----------------------------------------------------------------------------
68
69 /*
70 * For interface between add-on and kodi.
71 *
72 * This structure defines the addresses of functions stored inside Kodi which
73 * are then available for the add-on to call
74 *
75 * All function pointers there are used by the C++ interface functions below.
76 * You find the set of them on xbmc/addons/interfaces/General.cpp
77 *
78 * Note: For add-on development itself this is not needed
79 */
80 typedef struct AddonKeyboardKeyTable
81 {
82 char* keys[STD_KB_BUTTONS_MAX_ROWS][STD_KB_BUTTONS_PER_ROW];
83 } AddonKeyboardKeyTable;
84 typedef struct AddonToKodiFuncTable_kodi
85 {
86 char* (*get_addon_info)(void* kodiBase, const char* id);
87 bool (*open_settings_dialog)(void* kodiBase);
88 char* (*unknown_to_utf8)(void* kodiBase, const char* source, bool* ret, bool failOnBadChar);
89 char* (*get_localized_string)(void* kodiBase, long label_id);
90 char* (*get_language)(void* kodiBase, int format, bool region);
91 bool (*queue_notification)(void* kodiBase,
92 int type,
93 const char* header,
94 const char* message,
95 const char* imageFile,
96 unsigned int displayTime,
97 bool withSound,
98 unsigned int messageTime);
99 void (*get_md5)(void* kodiBase, const char* text, char* md5);
100 char* (*get_temp_path)(void* kodiBase);
101 char* (*get_region)(void* kodiBase, const char* id);
102 void (*get_free_mem)(void* kodiBase, long* free, long* total, bool as_bytes);
103 int (*get_global_idle_time)(void* kodiBase);
104 bool (*is_addon_avilable)(void* kodiBase, const char* id, char** version, bool* enabled);
105 void (*kodi_version)(void* kodiBase,
106 char** compile_name,
107 int* major,
108 int* minor,
109 char** revision,
110 char** tag,
111 char** tagversion);
112 char* (*get_current_skin_id)(void* kodiBase);
113 bool (*get_keyboard_layout)(void* kodiBase,
114 char** layout_name,
115 int modifier_key,
116 struct AddonKeyboardKeyTable* layout);
117 bool (*change_keyboard_layout)(void* kodiBase, char** layout_name);
118 } AddonToKodiFuncTable_kodi;
119
120
121#ifdef __cplusplus
122} /* extern "C" */
123#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/network.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/network.h
deleted file mode 100644
index 6c0441f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/c-api/network.h
+++ /dev/null
@@ -1,43 +0,0 @@
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 <stddef.h>
12
13#ifdef __cplusplus
14extern "C"
15{
16#endif /* __cplusplus */
17
18 /*
19 * For interface between add-on and kodi.
20 *
21 * This structure defines the addresses of functions stored inside Kodi which
22 * are then available for the add-on to call
23 *
24 * All function pointers there are used by the C++ interface functions below.
25 * You find the set of them on xbmc/addons/interfaces/General.cpp
26 *
27 * Note: For add-on development itself this is not needed
28 */
29 typedef struct AddonToKodiFuncTable_kodi_network
30 {
31 bool (*wake_on_lan)(void* kodiBase, const char* mac);
32 char* (*get_ip_address)(void* kodiBase);
33 char* (*dns_lookup)(void* kodiBase, const char* url, bool* ret);
34 char* (*url_encode)(void* kodiBase, const char* url);
35 char* (*get_hostname)(void* kodiBase);
36 bool (*is_local_host)(void* kodiBase, const char* hostname);
37 bool (*is_host_on_lan)(void* kodiBase, const char* hostname, bool offLineCheck);
38 char* (*get_user_agent)(void* kodiBase);
39 } AddonToKodiFuncTable_kodi_network;
40
41#ifdef __cplusplus
42} /* extern "C" */
43#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/CMakeLists.txt
deleted file mode 100644
index 834ec00..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
1set(HEADERS General.h
2 ListItem.h
3 Window.h
4 definitions.h
5 renderHelper.h)
6
7if(NOT ENABLE_STATIC_LIBS)
8 core_add_library(addons_kodi-addon-dev-kit_include_kodi_gui)
9endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/General.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/General.h
deleted file mode 100644
index b5a6393..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/General.h
+++ /dev/null
@@ -1,175 +0,0 @@
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 "../AddonBase.h"
12#include "definitions.h"
13
14namespace kodi
15{
16namespace gui
17{
18
19 //============================================================================
20 ///
21 // \defgroup cpp_kodi_gui ::general
22 /// \addtogroup cpp_kodi_gui
23 /// @{
24 /// @brief **Allow use of binary classes and function to use on add-on's**
25 ///
26 /// Permits the use of the required functions of the add-on to Kodi. This class
27 /// also contains some functions to the control.
28 ///
29 /// These are pure functions them no other initialization need.
30 ///
31 /// It has the header \ref kodi/gui/General.h "#include <kodi/gui/General.h>" be included
32 /// to enjoy it.
33 ///
34
35 //==========================================================================
36 ///
37 /// \ingroup cpp_kodi_gui
38 /// @brief Performs a graphical lock of rendering engine
39 ///
40 inline void ATTRIBUTE_HIDDEN Lock()
41 {
42 using namespace ::kodi::addon;
43 CAddonBase::m_interface->toKodi->kodi_gui->general->lock();
44 }
45
46 //--------------------------------------------------------------------------
47
48 //==========================================================================
49 ///
50 /// \ingroup cpp_kodi_gui
51 /// @brief Performs a graphical unlock of previous locked rendering engine
52 ///
53 inline void ATTRIBUTE_HIDDEN Unlock()
54 {
55 using namespace ::kodi::addon;
56 CAddonBase::m_interface->toKodi->kodi_gui->general->unlock();
57 }
58 //--------------------------------------------------------------------------
59
60 //==========================================================================
61 ///
62 /// \ingroup cpp_kodi_gui
63 /// @brief Return the the current screen height with pixel
64 ///
65 inline int ATTRIBUTE_HIDDEN GetScreenHeight()
66 {
67 using namespace ::kodi::addon;
68 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_height(CAddonBase::m_interface->toKodi->kodiBase);
69 }
70 //--------------------------------------------------------------------------
71
72 //==========================================================================
73 ///
74 /// \ingroup cpp_kodi_gui
75 /// @brief Return the the current screen width with pixel
76 ///
77 inline int ATTRIBUTE_HIDDEN GetScreenWidth()
78 {
79 using namespace ::kodi::addon;
80 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_width(CAddonBase::m_interface->toKodi->kodiBase);
81 }
82 //--------------------------------------------------------------------------
83
84 //==========================================================================
85 ///
86 /// \ingroup cpp_kodi_gui
87 /// @brief Return the the current screen rendering resolution
88 ///
89 inline int ATTRIBUTE_HIDDEN GetVideoResolution()
90 {
91 using namespace ::kodi::addon;
92 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_video_resolution(CAddonBase::m_interface->toKodi->kodiBase);
93 }
94 //--------------------------------------------------------------------------
95
96 //==========================================================================
97 ///
98 /// \ingroup cpp_kodi_gui
99 /// @brief Returns the id for the current 'active' dialog as an integer.
100 ///
101 /// @return The currently active dialog Id
102 ///
103 ///
104 ///-------------------------------------------------------------------------
105 ///
106 /// **Example:**
107 /// ~~~~~~~~~~~~~{.cpp}
108 /// ..
109 /// int wid = kodi::gui::GetCurrentWindowDialogId();
110 /// ..
111 /// ~~~~~~~~~~~~~
112 ///
113 inline int ATTRIBUTE_HIDDEN GetCurrentWindowDialogId()
114 {
115 using namespace ::kodi::addon;
116 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_dialog_id(CAddonBase::m_interface->toKodi->kodiBase);
117 }
118 //--------------------------------------------------------------------------
119
120 //==========================================================================
121 ///
122 /// \ingroup cpp_kodi_gui
123 /// @brief Returns the id for the current 'active' window as an integer.
124 ///
125 /// @return The currently active window Id
126 ///
127 ///
128 ///-------------------------------------------------------------------------
129 ///
130 /// **Example:**
131 /// ~~~~~~~~~~~~~{.cpp}
132 /// ..
133 /// int wid = kodi::gui::GetCurrentWindowId();
134 /// ..
135 /// ~~~~~~~~~~~~~
136 ///
137 inline int ATTRIBUTE_HIDDEN GetCurrentWindowId()
138 {
139 using namespace ::kodi::addon;
140 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_id(CAddonBase::m_interface->toKodi->kodiBase);
141 }
142 //--------------------------------------------------------------------------
143
144 //==========================================================================
145 ///
146 /// \ingroup cpp_kodi_gui
147 /// \brief To get hardware specific device context interface
148 ///
149 /// \return The currently active device context
150 ///
151 /// \warning This function is only be supported under Windows, on all other
152 /// OS it return `nullptr`!
153 ///
154 /// \note Returned Windows class pointer is `ID3D11DeviceContext1`.
155 ///
156 ///
157 ///-------------------------------------------------------------------------
158 ///
159 /// **Example:**
160 /// ~~~~~~~~~~~~~{.cpp}
161 /// #include <d3d11_1.h>
162 /// ..
163 /// ID3D11DeviceContext1* context = static_cast<ID3D11DeviceContext1*>(kodi::gui::GetHWContext());
164 /// ..
165 /// ~~~~~~~~~~~~~
166 ///
167 inline void* GetHWContext()
168 {
169 using namespace ::kodi::addon;
170 return CAddonBase::m_interface->toKodi->kodi_gui->general->get_hw_context(CAddonBase::m_interface->toKodi->kodiBase);
171 }
172 //--------------------------------------------------------------------------
173
174} /* namespace gui */
175} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h
deleted file mode 100644
index 1af4863..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h
+++ /dev/null
@@ -1,366 +0,0 @@
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 "../AddonBase.h"
12#include "definitions.h"
13
14#include <memory>
15
16namespace kodi
17{
18namespace gui
19{
20
21 class CWindow;
22
23 class ATTRIBUTE_HIDDEN CAddonGUIControlBase
24 {
25 public:
26 GUIHANDLE GetControlHandle() const { return m_controlHandle; }
27
28 protected:
29 explicit CAddonGUIControlBase(CAddonGUIControlBase* window)
30 : m_controlHandle(nullptr),
31 m_interface(::kodi::addon::CAddonBase::m_interface->toKodi),
32 m_Window(window) {}
33
34 virtual ~CAddonGUIControlBase() = default;
35
36 friend class CWindow;
37
38 GUIHANDLE m_controlHandle;
39 AddonToKodiFuncTable_Addon* m_interface;
40 CAddonGUIControlBase* m_Window;
41
42 private:
43 CAddonGUIControlBase() = delete;
44 CAddonGUIControlBase(const CAddonGUIControlBase&) = delete;
45 CAddonGUIControlBase &operator=(const CAddonGUIControlBase&) = delete;
46 };
47
48 class CListItem;
49 typedef std::shared_ptr<CListItem> ListItemPtr;
50
51 //============================================================================
52 ///
53 /// \defgroup cpp_kodi_gui_CListItem List Item
54 /// \ingroup cpp_kodi_gui
55 /// @brief \cpp_class{ kodi::gui::CListItem }
56 /// **Selectable window list item**
57 ///
58 /// The list item control is used for creating item lists in Kodi
59 ///
60 /// The with \ref ListItem.h "#include <kodi/gui/ListItem.h>" given
61 /// class is used to create a item entry for a list on window and to support it's
62 /// control.
63 ///
64
65 //============================================================================
66 ///
67 /// \defgroup cpp_kodi_gui_CListItem_Defs Definitions, structures and enumerators
68 /// \ingroup cpp_kodi_gui_CListItem
69 /// @brief **Library definition values**
70 ///
71
72 class ATTRIBUTE_HIDDEN CListItem : public CAddonGUIControlBase
73 {
74 public:
75 //==========================================================================
76 ///
77 /// \ingroup cpp_kodi_gui_CListItem
78 /// @brief Class constructor with parameters
79 ///
80 /// @param[in] label Item label
81 /// @param[in] label2 Second Item label (if needed)
82 /// @param[in] iconImage Item icon image (if needed)
83 /// @param[in] path Path to where item is defined
84 ///
85 CListItem(
86 const std::string& label = "",
87 const std::string& label2 = "",
88 const std::string& iconImage = "",
89 const std::string& path = "")
90 : CAddonGUIControlBase(nullptr)
91 {
92 m_controlHandle = m_interface->kodi_gui->listItem->create(m_interface->kodiBase, label.c_str(),
93 label2.c_str(), iconImage.c_str(),
94 path.c_str());
95 }
96
97 /*
98 * Constructor used for parts given by list items from addon window
99 *
100 * Related to call of "ListItemPtr kodi::gui::CWindow::GetListItem(int listPos)"
101 * Not needed for addon development itself
102 */
103 explicit CListItem(GUIHANDLE listItemHandle)
104 : CAddonGUIControlBase(nullptr)
105 {
106 m_controlHandle = listItemHandle;
107 }
108
109 //==========================================================================
110 ///
111 /// \ingroup cpp_kodi_gui_CListItem
112 /// @brief Class destructor
113 ///
114 ~CListItem() override
115 {
116 m_interface->kodi_gui->listItem->destroy(m_interface->kodiBase, m_controlHandle);
117 }
118 //--------------------------------------------------------------------------
119
120 //==========================================================================
121 ///
122 /// \ingroup cpp_kodi_gui_CListItem
123 /// @brief Returns the listitem label.
124 ///
125 /// @return Label of item
126 ///
127 std::string GetLabel()
128 {
129 std::string label;
130 char* ret = m_interface->kodi_gui->listItem->get_label(m_interface->kodiBase, m_controlHandle);
131 if (ret != nullptr)
132 {
133 if (std::strlen(ret))
134 label = ret;
135 m_interface->free_string(m_interface->kodiBase, ret);
136 }
137 return label;
138 }
139 //--------------------------------------------------------------------------
140
141 //==========================================================================
142 ///
143 /// \ingroup cpp_kodi_gui_CListItem
144 /// @brief Sets the listitem label.
145 ///
146 /// @param[in] label string or unicode - text string.
147 ///
148 void SetLabel(const std::string& label)
149 {
150 m_interface->kodi_gui->listItem->set_label(m_interface->kodiBase, m_controlHandle, label.c_str());
151 }
152 //--------------------------------------------------------------------------
153
154 //==========================================================================
155 ///
156 /// \ingroup cpp_kodi_gui_CListItem
157 /// @brief Returns the second listitem label.
158 ///
159 /// @return Second label of item
160 ///
161 std::string GetLabel2()
162 {
163 std::string label;
164 char* ret = m_interface->kodi_gui->listItem->get_label2(m_interface->kodiBase, m_controlHandle);
165 if (ret != nullptr)
166 {
167 if (std::strlen(ret))
168 label = ret;
169 m_interface->free_string(m_interface->kodiBase, ret);
170 }
171 return label;
172 }
173 //--------------------------------------------------------------------------
174
175 //==========================================================================
176 ///
177 /// \ingroup cpp_kodi_gui_CListItem
178 /// @brief Sets the listitem's label2.
179 ///
180 /// @param[in] label string or unicode - text string.
181 ///
182 void SetLabel2(const std::string& label)
183 {
184 m_interface->kodi_gui->listItem->set_label2(m_interface->kodiBase, m_controlHandle, label.c_str());
185 }
186 //--------------------------------------------------------------------------
187
188 //==========================================================================
189 ///
190 /// \ingroup cpp_kodi_gui_CListItem
191 /// @brief Sets the listitem's art
192 ///
193 /// @param[in] type Type of Art to set
194 /// - Some default art values (any string possible):
195 /// | value (type) | Type |
196 /// |:-------------:|:--------------------------------------------------|
197 /// | thumb | string - image filename
198 /// | poster | string - image filename
199 /// | banner | string - image filename
200 /// | fanart | string - image filename
201 /// | clearart | string - image filename
202 /// | clearlogo | string - image filename
203 /// | landscape | string - image filename
204 /// | icon | string - image filename
205 /// @return The url to use for Art
206 ///
207 std::string GetArt(const std::string& type)
208 {
209 std::string strReturn;
210 char* ret = m_interface->kodi_gui->listItem->get_art(m_interface->kodiBase, m_controlHandle, type.c_str());
211 if (ret != nullptr)
212 {
213 if (std::strlen(ret))
214 strReturn = ret;
215 m_interface->free_string(m_interface->kodiBase, ret);
216 }
217 return strReturn;
218 }
219 //--------------------------------------------------------------------------
220
221 //==========================================================================
222 ///
223 /// \ingroup cpp_kodi_gui_CListItem
224 /// @brief Sets the listitem's art
225 ///
226 /// @param[in] type Type of Art to set
227 /// @param[in] url The url to use for Art
228 /// - Some default art values (any string possible):
229 /// | value (type) | Type |
230 /// |:-------------:|:--------------------------------------------------|
231 /// | thumb | string - image filename
232 /// | poster | string - image filename
233 /// | banner | string - image filename
234 /// | fanart | string - image filename
235 /// | clearart | string - image filename
236 /// | clearlogo | string - image filename
237 /// | landscape | string - image filename
238 /// | icon | string - image filename
239 ///
240 void SetArt(const std::string& type, const std::string& url)
241 {
242 m_interface->kodi_gui->listItem->set_art(m_interface->kodiBase, m_controlHandle, type.c_str(), url.c_str());
243 }
244 //--------------------------------------------------------------------------
245
246 //==========================================================================
247 ///
248 /// \ingroup cpp_kodi_gui_CListItem
249 /// @brief Returns the path / filename of this listitem.
250 ///
251 /// @return Path string
252 ///
253 std::string GetPath()
254 {
255 std::string strReturn;
256 char* ret = m_interface->kodi_gui->listItem->get_path(m_interface->kodiBase, m_controlHandle);
257 if (ret != nullptr)
258 {
259 if (std::strlen(ret))
260 strReturn = ret;
261 m_interface->free_string(m_interface->kodiBase, ret);
262 }
263 return strReturn;
264 }
265 //--------------------------------------------------------------------------
266
267 //==========================================================================
268 ///
269 /// \ingroup cpp_kodi_gui_CListItem
270 /// @brief Sets the listitem's path.
271 ///
272 /// @param[in] path string or unicode - path, activated when
273 /// item is clicked.
274 ///
275 /// @note You can use the above as keywords for arguments.
276 ///
277 void SetPath(const std::string& path)
278 {
279 m_interface->kodi_gui->listItem->set_path(m_interface->kodiBase, m_controlHandle, path.c_str());
280 }
281 //--------------------------------------------------------------------------
282
283 //==========================================================================
284 ///
285 /// \ingroup cpp_kodi_gui_CListItem
286 /// @brief Sets a listitem property, similar to an infolabel.
287 ///
288 /// @param[in] key string - property name.
289 /// @param[in] value string or unicode - value of property.
290 ///
291 /// @note Key is NOT case sensitive.
292 /// You can use the above as keywords for arguments and skip certain\n
293 /// optional arguments.\n
294 /// Once you use a keyword, all following arguments require the
295 /// keyword.
296 ///
297 /// Some of these are treated internally by Kodi, such as the
298 /// <b>'StartOffset'</b> property, which is the offset in seconds at which to
299 /// start playback of an item. Others may be used in the skin to add
300 /// extra information, such as <b>'WatchedCount'</b> for tvshow items
301 ///
302 void SetProperty(const std::string& key, const std::string& value)
303 {
304 m_interface->kodi_gui->listItem->set_property(m_interface->kodiBase, m_controlHandle, key.c_str(), value.c_str());
305 }
306 //--------------------------------------------------------------------------
307
308 //==========================================================================
309 ///
310 /// \ingroup cpp_kodi_gui_CListItem
311 /// @brief Returns a listitem property as a string, similar to an infolabel.
312 ///
313 /// @param[in] key string - property name.
314 /// @return string - List item property
315 ///
316 /// @note Key is NOT case sensitive.\n
317 /// You can use the above as keywords for arguments and skip certain
318 /// optional arguments.\n
319 /// Once you use a keyword, all following arguments require the
320 /// keyword.
321 ///
322 std::string GetProperty(const std::string& key)
323 {
324 std::string label;
325 char* ret = m_interface->kodi_gui->listItem->get_property(m_interface->kodiBase, m_controlHandle, key.c_str());
326 if (ret != nullptr)
327 {
328 if (std::strlen(ret))
329 label = ret;
330 m_interface->free_string(m_interface->kodiBase, ret);
331 }
332 return label;
333 }
334 //--------------------------------------------------------------------------
335
336 //==========================================================================
337 ///
338 /// \ingroup cpp_kodi_gui_CListItem
339 /// @brief To control selection of item in list (also multiple selection,
340 /// in list on serveral items possible).
341 ///
342 /// @param[in] selected if true becomes set as selected
343 ///
344 void Select(bool selected)
345 {
346 m_interface->kodi_gui->listItem->select(m_interface->kodiBase, m_controlHandle, selected);
347 }
348 //--------------------------------------------------------------------------
349
350 //==========================================================================
351 ///
352 /// \ingroup cpp_kodi_gui_CListItem
353 /// @brief Returns the listitem's selected status.
354 ///
355 /// @return true if selected, otherwise false
356 ///
357 bool IsSelected()
358 {
359 return m_interface->kodi_gui->listItem->is_selected(m_interface->kodiBase, m_controlHandle);
360 }
361 //--------------------------------------------------------------------------
362
363 };
364
365} /* namespace gui */
366} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h
deleted file mode 100644
index 5011374..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h
+++ /dev/null
@@ -1,909 +0,0 @@
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 "../AddonBase.h"
12#include "ListItem.h"
13
14#ifdef BUILD_KODI_ADDON
15#include "../ActionIDs.h"
16#else
17#include "input/actions/ActionIDs.h"
18#endif
19
20namespace kodi
21{
22namespace gui
23{
24
25 class CListItem;
26
27 //============================================================================
28 ///
29 /// \defgroup cpp_kodi_gui_CWindow Window
30 /// \ingroup cpp_kodi_gui
31 /// @brief \cpp_class{ kodi::gui::CWindow }
32 /// **Main window control class**
33 ///
34 /// The with \ref Window.h "#include <kodi/gui/Window.h>"
35 /// included file brings support to create a window or dialog on Kodi.
36 ///
37 /// --------------------------------------------------------------------------
38 ///
39 /// On functions defined input variable <b><tt>controlId</tt> (GUI control identifier)</b>
40 /// is the on window.xml defined value behind type added with <tt><b>id="..."</b></tt> and
41 /// used to identify for changes there and on callbacks.
42 ///
43 /// ~~~~~~~~~~~~~{.xml}
44 /// <control type="label" id="31">
45 /// <description>Title Label</description>
46 /// ...
47 /// </control>
48 /// <control type="progress" id="32">
49 /// <description>progress control</description>
50 /// ...
51 /// </control>
52 /// ~~~~~~~~~~~~~
53 ///
54 ///
55
56 //============================================================================
57 ///
58 /// \defgroup cpp_kodi_gui_CWindow_Defs Definitions, structures and enumerators
59 /// \ingroup cpp_kodi_gui_CWindow
60 /// @brief <b>Library definition values</b>
61 ///
62
63 class ATTRIBUTE_HIDDEN CWindow : public CAddonGUIControlBase
64 {
65 public:
66 //==========================================================================
67 ///
68 /// \ingroup cpp_kodi_gui_CWindow
69 /// @brief Class constructor with needed values for window / dialog.
70 ///
71 /// Creates a new Window class.
72 ///
73 /// @param[in] xmlFilename XML file for the skin
74 /// @param[in] defaultSkin default skin to use if needed not available
75 /// @param[in] asDialog Use window as dialog if set
76 /// @param[in] isMedia [opt] bool - if False, create a regular window.
77 /// if True, create a mediawindow.
78 /// (default=false)
79 /// @note only usable for windows not for dialogs.
80 ///
81 ///
82 CWindow(const std::string& xmlFilename, const std::string& defaultSkin, bool asDialog, bool isMedia = false)
83 : CAddonGUIControlBase(nullptr)
84 {
85 m_controlHandle = m_interface->kodi_gui->window->create(m_interface->kodiBase, xmlFilename.c_str(),
86 defaultSkin.c_str(), asDialog, isMedia);
87 if (!m_controlHandle)
88 kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow can't create window class from Kodi !!!");
89 m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, this,
90 CBOnInit, CBOnFocus, CBOnClick, CBOnAction,
91 CBGetContextButtons, CBOnContextButton);
92 }
93 //--------------------------------------------------------------------------
94
95 //==========================================================================
96 ///
97 /// \ingroup CWindow
98 /// @brief Class destructor
99 ///
100 ///
101 ///
102 ~CWindow() override
103 {
104 if (m_controlHandle)
105 m_interface->kodi_gui->window->destroy(m_interface->kodiBase, m_controlHandle);
106 }
107 //--------------------------------------------------------------------------
108
109 //==========================================================================
110 ///
111 /// \ingroup cpp_kodi_gui_CWindow
112 /// @brief Show this window.
113 ///
114 /// Shows this window by activating it, calling close() after it wil activate the
115 /// current window again.
116 ///
117 /// @note If your Add-On ends this window will be closed to. To show it forever,
118 /// make a loop at the end of your Add-On or use doModal() instead.
119 ///
120 /// @warning If used must be the class be global present until Kodi becomes
121 /// closed. The creation can be done after before "Show" becomes called, but
122 /// not delete class after them.
123 ///
124 /// @return Return true if call and show is successed,
125 /// if false was something failed to get needed
126 /// skin parts.
127 ///
128 bool Show()
129 {
130 return m_interface->kodi_gui->window->show(m_interface->kodiBase, m_controlHandle);
131 }
132 //--------------------------------------------------------------------------
133
134 //==========================================================================
135 ///
136 /// \ingroup cpp_kodi_gui_CWindow
137 /// @brief Closes this window.
138 ///
139 /// Closes this window by activating the old window.
140 /// @note The window is not deleted with this method.
141 ///
142 void Close()
143 {
144 m_interface->kodi_gui->window->close(m_interface->kodiBase, m_controlHandle);
145 }
146 //--------------------------------------------------------------------------
147
148 //==========================================================================
149 ///
150 /// \ingroup cpp_kodi_gui_CWindow
151 /// @brief Display this window until close() is called.
152 ///
153 void DoModal()
154 {
155 m_interface->kodi_gui->window->do_modal(m_interface->kodiBase, m_controlHandle);
156 }
157 //--------------------------------------------------------------------------
158
159 //==========================================================================
160 ///
161 /// \ingroup cpp_kodi_gui_CWindow
162 /// @brief Gives the control with the supplied focus.
163 ///
164 /// @param[in] iControlId On skin defined id of control
165 /// @return Return true if call and focus is successed,
166 /// if false was something failed to get needed
167 /// skin parts.
168 ///
169 ///
170 bool SetFocusId(int iControlId)
171 {
172 return m_interface->kodi_gui->window->set_focus_id(m_interface->kodiBase, m_controlHandle, iControlId);
173 }
174 //--------------------------------------------------------------------------
175
176 //==========================================================================
177 ///
178 /// \ingroup cpp_kodi_gui_CWindow
179 /// @brief Returns the id of the control which is focused.
180 ///
181 /// @return Focused control id
182 ///
183 ///
184 int GetFocusId()
185 {
186 return m_interface->kodi_gui->window->get_focus_id(m_interface->kodiBase, m_controlHandle);
187 }
188 //--------------------------------------------------------------------------
189
190 //==========================================================================
191 ///
192 /// \ingroup cpp_kodi_gui_CWindow
193 /// @brief To set the used label on given control id
194 ///
195 /// @param[in] controlId Control id where label need to set
196 /// @param[in] label Label to use
197 ///
198 ///
199 void SetControlLabel(int controlId, const std::string& label)
200 {
201 m_interface->kodi_gui->window->set_control_label(m_interface->kodiBase, m_controlHandle, controlId, label.c_str());
202 }
203 //--------------------------------------------------------------------------
204
205 //==========================================================================
206 ///
207 /// \ingroup cpp_kodi_gui_CWindow
208 /// @brief To set the visibility on given control id
209 ///
210 /// @param[in] controlId Control id where visibility is changed
211 /// @param[in] visible Boolean value with `true` for visible, `false` for hidden
212 ///
213 ///
214 void SetControlVisible(int controlId, bool visible)
215 {
216 m_interface->kodi_gui->window->set_control_visible(m_interface->kodiBase, m_controlHandle, controlId, visible);
217 }
218 //--------------------------------------------------------------------------
219
220 //==========================================================================
221 ///
222 /// \ingroup cpp_kodi_gui_CWindow
223 /// @brief To set the selection on given control id
224 ///
225 /// @param[in] controlId Control id where selection is changed
226 /// @param[in] selected Boolean value with `true` for selected, `false` for not
227 ///
228 ///
229 void SetControlSelected(int controlId, bool selected)
230 {
231 m_interface->kodi_gui->window->set_control_selected(m_interface->kodiBase, m_controlHandle, controlId, selected);
232 }
233 //--------------------------------------------------------------------------
234
235 //==========================================================================
236 ///
237 /// \ingroup cpp_kodi_gui_CWindow
238 /// @brief Sets a window property, similar to an infolabel.
239 ///
240 /// @param[in] key string - property name.
241 /// @param[in] value string or unicode - value of property.
242 ///
243 /// @note Key is NOT case sensitive. Setting value to an empty string is
244 /// equivalent to clearProperty(key).\n
245 /// You can use the above as keywords for arguments and skip certain
246 /// optional arguments.\n
247 /// Once you use a keyword, all following arguments require the keyword.
248 ///
249 void SetProperty(const std::string& key, const std::string& value)
250 {
251 m_interface->kodi_gui->window->set_property(m_interface->kodiBase, m_controlHandle, key.c_str(), value.c_str());
252 }
253 //--------------------------------------------------------------------------
254
255 //==========================================================================
256 ///
257 /// \ingroup cpp_kodi_gui_CWindow
258 /// @brief Returns a window property as a string, similar to an infolabel.
259 ///
260 /// @param[in] key string - property name.
261 /// @return The property as strin (if present)
262 ///
263 /// @note Key is NOT case sensitive. Setting value to an empty string is
264 /// equivalent to clearProperty(key).\n
265 /// You can use the above as keywords for arguments and skip certain
266 /// optional arguments.\n
267 /// Once you use a keyword, all following arguments require the keyword.
268 ///
269 ///
270 std::string GetProperty(const std::string& key) const
271 {
272 std::string label;
273 char* ret = m_interface->kodi_gui->window->get_property(m_interface->kodiBase, m_controlHandle, key.c_str());
274 if (ret != nullptr)
275 {
276 if (std::strlen(ret))
277 label = ret;
278 m_interface->free_string(m_interface->kodiBase, ret);
279 }
280 return label;
281 }
282 //--------------------------------------------------------------------------
283
284 //==========================================================================
285 ///
286 /// \ingroup cpp_kodi_gui_CWindow
287 /// @brief Sets a window property with integer value
288 ///
289 /// @param[in] key string - property name.
290 /// @param[in] value integer value to set
291 ///
292 ///
293 void SetPropertyInt(const std::string& key, int value)
294 {
295 m_interface->kodi_gui->window->set_property_int(m_interface->kodiBase, m_controlHandle, key.c_str(), value);
296 }
297 //--------------------------------------------------------------------------
298
299 //==========================================================================
300 ///
301 /// \ingroup cpp_kodi_gui_CWindow
302 /// @brief Returns a window property with integer value
303 ///
304 /// @param[in] key string - property name.
305 /// @return integer value of property
306 ///
307 int GetPropertyInt(const std::string& key) const
308 {
309 return m_interface->kodi_gui->window->get_property_int(m_interface->kodiBase, m_controlHandle, key.c_str());
310 }
311 //--------------------------------------------------------------------------
312
313 //==========================================================================
314 ///
315 /// \ingroup cpp_kodi_gui_CWindow
316 /// @brief Sets a window property with boolean value
317 ///
318 /// @param[in] key string - property name.
319 /// @param[in] value boolean value to set
320 ///
321 ///
322 void SetPropertyBool(const std::string& key, bool value)
323 {
324 m_interface->kodi_gui->window->set_property_bool(m_interface->kodiBase, m_controlHandle, key.c_str(), value);
325 }
326 //--------------------------------------------------------------------------
327
328 //==========================================================================
329 ///
330 /// \ingroup cpp_kodi_gui_CWindow
331 /// @brief Returns a window property with boolean value
332 ///
333 /// @param[in] key string - property name.
334 /// @return boolean value of property
335 ///
336 bool GetPropertyBool(const std::string& key) const
337 {
338 return m_interface->kodi_gui->window->get_property_bool(m_interface->kodiBase, m_controlHandle, key.c_str());
339 }
340 //--------------------------------------------------------------------------
341
342 //==========================================================================
343 ///
344 /// \ingroup cpp_kodi_gui_CWindow
345 /// @brief Sets a window property with double value
346 ///
347 /// @param[in] key string - property name.
348 /// @param[in] value double value to set
349 ///
350 ///
351 void SetPropertyDouble(const std::string& key, double value)
352 {
353 m_interface->kodi_gui->window->set_property_double(m_interface->kodiBase, m_controlHandle, key.c_str(), value);
354 }
355 //--------------------------------------------------------------------------
356
357 //==========================================================================
358 ///
359 /// \ingroup cpp_kodi_gui_CWindow
360 /// @brief Returns a window property with double value
361 ///
362 /// @param[in] key string - property name.
363 /// @return double value of property
364 ///
365 ///
366 double GetPropertyDouble(const std::string& key) const
367 {
368 return m_interface->kodi_gui->window->get_property_double(m_interface->kodiBase, m_controlHandle, key.c_str());
369 }
370 //--------------------------------------------------------------------------
371
372 //==========================================================================
373 ///
374 /// \ingroup cpp_kodi_gui_CWindow
375 /// @brief Remove all present properties from window
376 ///
377 ///
378 ///
379 void ClearProperties()
380 {
381 m_interface->kodi_gui->window->clear_properties(m_interface->kodiBase, m_controlHandle);
382 }
383 //--------------------------------------------------------------------------
384
385 //==========================================================================
386 ///
387 /// \ingroup cpp_kodi_gui_CWindow
388 /// @brief Clears the specific window property.
389 ///
390 /// @param[in] key string - property name.
391 ///
392 /// @note Key is NOT case sensitive. Equivalent to SetProperty(key, "")
393 /// You can use the above as keywords for arguments and skip certain
394 /// optional arguments.
395 /// Once you use a keyword, all following arguments require the
396 /// keyword.
397 ///
398 ///
399 ///-----------------------------------------------------------------------
400 ///
401 /// **Example:**
402 /// ~~~~~~~~~~~~~{.cpp}
403 /// ..
404 /// ClearProperty('Category')
405 /// ..
406 /// ~~~~~~~~~~~~~
407 ///
408 void ClearProperty(const std::string& key)
409 {
410 m_interface->kodi_gui->window->clear_property(m_interface->kodiBase, m_controlHandle, key.c_str());
411 }
412 //--------------------------------------------------------------------------
413
414 //@{
415 //==========================================================================
416 ///
417 /// \ingroup cpp_kodi_gui_CWindow
418 /// @brief Function delete all entries in integrated list.
419 ///
420 ///
421 ///
422 void ClearList()
423 {
424 m_interface->kodi_gui->window->clear_item_list(m_interface->kodiBase, m_controlHandle);
425 }
426 //--------------------------------------------------------------------------
427
428 //==========================================================================
429 ///
430 /// \ingroup cpp_kodi_gui_CWindow
431 /// @brief To add a list item in the on window integrated list.
432 ///
433 /// @param[in] item List item to add
434 /// @param[in] itemPosition [opt] The position for item, default is on end
435 ///
436 ///
437 void AddListItem(ListItemPtr item, int itemPosition = -1)
438 {
439 m_interface->kodi_gui->window->add_list_item(m_interface->kodiBase, m_controlHandle, item->m_controlHandle, itemPosition);
440 }
441 //--------------------------------------------------------------------------
442
443 //==========================================================================
444 ///
445 /// \ingroup cpp_kodi_gui_CWindow
446 /// @brief To add a list item based upon string in the on window integrated list.
447 ///
448 /// @param[in] item List item to add
449 /// @param[in] itemPosition [opt] The position for item, default is on end
450 ///
451 ///
452 void AddListItem(const std::string item, int itemPosition = -1)
453 {
454 m_interface->kodi_gui->window->add_list_item(m_interface->kodiBase, m_controlHandle, std::make_shared<kodi::gui::CListItem>(item)->m_controlHandle, itemPosition);
455 }
456 //--------------------------------------------------------------------------
457
458 //==========================================================================
459 ///
460 /// \ingroup cpp_kodi_gui_CWindow
461 /// @brief Remove list item on position.
462 ///
463 /// @param[in] itemPosition List position to remove
464 ///
465 ///
466 void RemoveListItem(int itemPosition)
467 {
468 m_interface->kodi_gui->window->remove_list_item_from_position(m_interface->kodiBase, m_controlHandle, itemPosition);
469 }
470 //--------------------------------------------------------------------------
471
472 //==========================================================================
473 ///
474 /// \ingroup cpp_kodi_gui_CWindow
475 /// @brief Remove item with given control class from list.
476 ///
477 /// @param[in] item List item control class to remove
478 ///
479 ///
480 void RemoveListItem(ListItemPtr item)
481 {
482 m_interface->kodi_gui->window->remove_list_item(m_interface->kodiBase, m_controlHandle, item->m_controlHandle);
483 }
484 //--------------------------------------------------------------------------
485
486 //==========================================================================
487 ///
488 /// \ingroup cpp_kodi_gui_CWindow
489 /// @brief To get list item control class on wanted position.
490 ///
491 /// @param[in] listPos Position from where control is needed
492 /// @return The list item control class or null if not found
493 ///
494 /// @warning Function returns a new generated **CListItem** class!
495 ///
496 ListItemPtr GetListItem(int listPos)
497 {
498 GUIHANDLE handle = m_interface->kodi_gui->window->get_list_item(m_interface->kodiBase, m_controlHandle, listPos);
499 if (!handle)
500 return ListItemPtr();
501
502 return std::make_shared<kodi::gui::CListItem>(handle);
503 }
504 //--------------------------------------------------------------------------
505
506 //==========================================================================
507 ///
508 /// \ingroup cpp_kodi_gui_CWindow
509 /// @brief To set position of selected part in list.
510 ///
511 /// @param[in] listPos Position to use
512 ///
513 ///
514 void SetCurrentListPosition(int listPos)
515 {
516 m_interface->kodi_gui->window->set_current_list_position(m_interface->kodiBase, m_controlHandle, listPos);
517 }
518 //--------------------------------------------------------------------------
519
520 //==========================================================================
521 ///
522 /// \ingroup cpp_kodi_gui_CWindow
523 /// @brief To get current selected position in list
524 ///
525 /// @return Current list position
526 ///
527 ///
528 int GetCurrentListPosition()
529 {
530 return m_interface->kodi_gui->window->get_current_list_position(m_interface->kodiBase, m_controlHandle);
531 }
532 //--------------------------------------------------------------------------
533
534 //==========================================================================
535 ///
536 /// \ingroup cpp_kodi_gui_CWindow
537 /// @brief To get the amount of entries in the list.
538 ///
539 /// @return Size of in window integrated control class
540 ///
541 ///
542 int GetListSize()
543 {
544 return m_interface->kodi_gui->window->get_list_size(m_interface->kodiBase, m_controlHandle);
545 }
546 //--------------------------------------------------------------------------
547
548 //==========================================================================
549 ///
550 /// \ingroup cpp_kodi_gui_CWindow
551 /// @brief Sets a container property, similar to an infolabel.
552 ///
553 /// @param[in] key string - property name.
554 /// @param[in] value string or unicode - value of property.
555 ///
556 /// @note Key is NOT case sensitive.\n
557 /// You can use the above as keywords for arguments and skip certain
558 /// optional arguments.\n
559 /// Once you use a keyword, all following arguments require the keyword.
560 ///
561 ///
562 void SetContainerProperty(const std::string& key, const std::string& value)
563 {
564 m_interface->kodi_gui->window->set_container_property(m_interface->kodiBase, m_controlHandle, key.c_str(), value.c_str());
565 }
566 //--------------------------------------------------------------------------
567
568 //==========================================================================
569 ///
570 /// \ingroup cpp_kodi_gui_CWindow
571 /// @brief Sets the content type of the container.
572 ///
573 /// @param[in] value string or unicode - content value.
574 ///
575 /// __Available content types__
576 /// | Name | Media |
577 /// |:-----------:|:-----------------------------------------|
578 /// | actors | Videos
579 /// | addons | Addons, Music, Pictures, Programs, Videos
580 /// | albums | Music, Videos
581 /// | artists | Music, Videos
582 /// | countries | Music, Videos
583 /// | directors | Videos
584 /// | files | Music, Videos
585 /// | games | Games
586 /// | genres | Music, Videos
587 /// | images | Pictures
588 /// | mixed | Music, Videos
589 /// | movies | Videos
590 /// | Musicvideos | Music, Videos
591 /// | playlists | Music, Videos
592 /// | seasons | Videos
593 /// | sets | Videos
594 /// | songs | Music
595 /// | studios | Music, Videos
596 /// | tags | Music, Videos
597 /// | tvshows | Videos
598 /// | videos | Videos
599 /// | years | Music, Videos
600 ///
601 ///
602 void SetContainerContent(const std::string& value)
603 {
604 m_interface->kodi_gui->window->set_container_content(m_interface->kodiBase, m_controlHandle, value.c_str());
605 }
606 //--------------------------------------------------------------------------
607
608 //==========================================================================
609 ///
610 /// \ingroup cpp_kodi_gui_CWindow
611 /// @brief Get the id of the currently visible container.
612 ///
613 /// @return currently visible container id
614 ///
615 ///
616 int GetCurrentContainerId()
617 {
618 return m_interface->kodi_gui->window->get_current_container_id(m_interface->kodiBase, m_controlHandle);
619 }
620 //--------------------------------------------------------------------------
621 //@}
622
623 //==========================================================================
624 ///
625 /// \ingroup cpp_kodi_gui_CWindow
626 /// @brief To inform Kodi that it need to render region new.
627 ///
628 ///
629 void MarkDirtyRegion()
630 {
631 return m_interface->kodi_gui->window->mark_dirty_region(m_interface->kodiBase, m_controlHandle);
632 }
633 //--------------------------------------------------------------------------
634
635 //==========================================================================
636 //
637 /// @defgroup cpp_kodi_gui_CWindow_callbacks Callback functions from Kodi to add-on
638 /// \ingroup cpp_kodi_gui_CWindow
639 //@{
640 /// @brief <b>GUI window callback functions.</b>
641 ///
642 /// Functions to handle control callbacks from Kodi
643 ///
644 /// ------------------------------------------------------------------------
645 ///
646 /// @link cpp_kodi_gui_CWindow Go back to normal functions from CWindow@endlink
647 //
648
649 //==========================================================================
650 ///
651 /// \ingroup cpp_kodi_gui_CWindow_callbacks
652 /// @brief OnInit method.
653 ///
654 /// @return Return true if initialize was done successful
655 ///
656 ///
657 virtual bool OnInit() { return false; }
658 //--------------------------------------------------------------------------
659
660 //==========================================================================
661 ///
662 /// \ingroup cpp_kodi_gui_CWindow_callbacks
663 /// @brief OnFocus method.
664 ///
665 /// @param[in] controlId GUI control identifier
666 /// @return Return true if focus condition was handled there or false to handle them by Kodi itself
667 ///
668 ///
669 virtual bool OnFocus(int controlId) { return false; }
670 //--------------------------------------------------------------------------
671
672 //==========================================================================
673 ///
674 /// \ingroup cpp_kodi_gui_CWindow_callbacks
675 /// @brief OnClick method.
676 ///
677 /// @param[in] controlId GUI control identifier
678 /// @return Return true if click was handled there
679 /// or false to handle them by Kodi itself
680 ///
681 ///
682 virtual bool OnClick(int controlId) { return false; }
683 //--------------------------------------------------------------------------
684
685 //==========================================================================
686 ///
687 /// \ingroup cpp_kodi_gui_CWindow_callbacks
688 /// @brief OnAction method.
689 ///
690 /// @param[in] actionId The action id to perform, see
691 /// \ref kodi_key_action_ids to get list of
692 /// them
693 /// @return Return true if action was handled there
694 /// or false to handle them by Kodi itself
695 ///
696 ///
697 /// This method will receive all actions that the main program will send
698 /// to this window.
699 ///
700 /// @note
701 /// - By default, only the \c PREVIOUS_MENU and \c NAV_BACK actions are handled.
702 /// - Overwrite this method to let your code handle all actions.
703 /// - Don't forget to capture \c ACTION_PREVIOUS_MENU or \c ACTION_NAV_BACK, else the user can't close this window.
704 ///
705 ///
706 ///--------------------------------------------------------------------------
707 ///
708 /// **Example:**
709 /// ~~~~~~~~~~~~~{.cpp}
710 /// ..
711 /// /* Window used with parent / child way */
712 /// bool cYOUR_CLASS::OnAction(int actionId)
713 /// {
714 /// switch (action)
715 /// {
716 /// case ACTION_PREVIOUS_MENU:
717 /// case ACTION_NAV_BACK:
718 /// printf("action recieved: previous");
719 /// Close();
720 /// return true;
721 /// case ACTION_SHOW_INFO:
722 /// printf("action recieved: show info");
723 /// break;
724 /// case ACTION_STOP:
725 /// printf("action recieved: stop");
726 /// break;
727 /// case ACTION_PAUSE:
728 /// printf("action recieved: pause");
729 /// break;
730 /// default:
731 /// break;
732 /// }
733 /// return false;
734 /// }
735 /// ..
736 /// ~~~~~~~~~~~~~
737 ///
738 virtual bool OnAction(int actionId, uint32_t buttoncode, wchar_t unicode)
739 {
740 switch (actionId)
741 {
742 case ACTION_PREVIOUS_MENU:
743 case ACTION_NAV_BACK:
744 Close();
745 return true;
746 default:
747 break;
748 }
749 return false;
750 }
751 //--------------------------------------------------------------------------
752
753 //==========================================================================
754 ///
755 /// \ingroup cpp_kodi_gui_CWindow_callbacks
756 /// @brief Get context menu buttons for list entry
757 ///
758 /// @param[in] itemNumber selected list item entry
759 /// @param[in] buttons list where context menus becomes added with his
760 /// identifier and name.
761 ///
762 virtual void GetContextButtons(int itemNumber, std::vector< std::pair<unsigned int, std::string> > &buttons)
763 {
764 }
765 //--------------------------------------------------------------------------
766
767 //==========================================================================
768 ///
769 /// \ingroup cpp_kodi_gui_CWindow_callbacks
770 /// @brief Called after selection in context menu
771 ///
772 /// @param[in] itemNumber selected list item entry
773 /// @param[in] button the pressed button id
774 /// @return true if handled, otherwise false
775 ///
776 virtual bool OnContextButton(int itemNumber, unsigned int button)
777 {
778 return false;
779 }
780 //--------------------------------------------------------------------------
781
782 //==========================================================================
783 ///
784 /// \ingroup cpp_kodi_gui_CWindow_callbacks
785 /// @brief **Set independent callbacks**
786 ///
787 /// If the class is used independent (with "new CWindow") and
788 /// not as parent (with "cCLASS_own : CWindow") from own must be the
789 /// callback from Kodi to add-on overdriven with own functions!
790 ///
791 /// @param[in] cbhdl The pointer to own handle data
792 /// structure / class
793 /// @param[in] CBOnInit Own defined window init function
794 /// @param[in] CBOnFocus Own defined focus function
795 /// @param[in] CBOnClick Own defined click function
796 /// @param[in] CBOnAction Own defined action function
797 /// @param[in] CBGetContextButtons [opt] To get context menu entries for
798 /// lists function
799 /// @param[in] CBOnContextButton [opt] Used context menu entry function
800 ///
801 ///
802 ///--------------------------------------------------------------------------
803 ///
804 /// **Example:**
805 /// ~~~~~~~~~~~~~{.cpp}
806 /// ...
807 ///
808 /// bool OnInit(GUIHANDLE cbhdl)
809 /// {
810 /// ...
811 /// return true;
812 /// }
813 ///
814 /// bool OnFocus(GUIHANDLE cbhdl, int controlId)
815 /// {
816 /// ...
817 /// return true;
818 /// }
819 ///
820 /// bool OnClick(GUIHANDLE cbhdl, int controlId)
821 /// {
822 /// ...
823 /// return true;
824 /// }
825 ///
826 /// bool OnAction(GUIHANDLE cbhdl, int actionId)
827 /// {
828 /// ...
829 /// return true;
830 /// }
831 ///
832 /// ...
833 /// /* Somewhere where you create the window */
834 /// CWindow myWindow = new CWindow;
835 /// myWindow->SetIndependentCallbacks(myWindow, OnInit, OnFocus, OnClick, OnAction);
836 /// ...
837 /// ~~~~~~~~~~~~~
838 ///
839 void SetIndependentCallbacks(
840 GUIHANDLE cbhdl,
841 bool (*CBOnInit) (GUIHANDLE cbhdl),
842 bool (*CBOnFocus) (GUIHANDLE cbhdl, int controlId),
843 bool (*CBOnClick) (GUIHANDLE cbhdl, int controlId),
844 bool (*CBOnAction) (GUIHANDLE cbhdl, int actionId, uint32_t buttoncode, wchar_t unicode),
845 void (*CBGetContextButtons) (GUIHANDLE cbhdl, int itemNumber, gui_context_menu_pair* buttons, unsigned int* size) = nullptr,
846 bool (*CBOnContextButton) (GUIHANDLE cbhdl, int itemNumber, unsigned int button) = nullptr)
847 {
848 if (!cbhdl ||
849 !CBOnInit || !CBOnFocus || !CBOnClick || !CBOnAction)
850 {
851 kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow::%s called with nullptr !!!", __FUNCTION__);
852 return;
853 }
854
855 m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, cbhdl,
856 CBOnInit, CBOnFocus, CBOnClick, CBOnAction,
857 CBGetContextButtons, CBOnContextButton);
858 }
859 //--------------------------------------------------------------------------
860 //@}
861
862 private:
863 static bool CBOnInit(GUIHANDLE cbhdl)
864 {
865 return static_cast<CWindow*>(cbhdl)->OnInit();
866 }
867
868 static bool CBOnFocus(GUIHANDLE cbhdl, int controlId)
869 {
870 return static_cast<CWindow*>(cbhdl)->OnFocus(controlId);
871 }
872
873 static bool CBOnClick(GUIHANDLE cbhdl, int controlId)
874 {
875 return static_cast<CWindow*>(cbhdl)->OnClick(controlId);
876 }
877
878 static bool CBOnAction(GUIHANDLE cbhdl, int actionId, uint32_t buttoncode, wchar_t unicode)
879 {
880 return static_cast<CWindow*>(cbhdl)->OnAction(actionId, buttoncode, unicode);
881 }
882
883 static void CBGetContextButtons(GUIHANDLE cbhdl, int itemNumber, gui_context_menu_pair* buttons, unsigned int* size)
884 {
885 std::vector< std::pair<unsigned int, std::string> > buttonList;
886 static_cast<CWindow*>(cbhdl)->GetContextButtons(itemNumber, buttonList);
887 if (!buttonList.empty())
888 {
889 unsigned int presentSize = static_cast<unsigned int>(buttonList.size());
890 if (presentSize > *size)
891 kodi::Log(ADDON_LOG_WARNING, "GetContextButtons: More as allowed '%i' entries present!", *size);
892 else
893 *size = presentSize;
894 for (unsigned int i = 0; i < *size; ++i)
895 {
896 buttons[i].id = buttonList[i].first;
897 strncpy(buttons[i].name, buttonList[i].second.c_str(), ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH);
898 }
899 }
900 }
901
902 static bool CBOnContextButton(GUIHANDLE cbhdl, int itemNumber, unsigned int button)
903 {
904 return static_cast<CWindow*>(cbhdl)->OnContextButton(itemNumber, button);
905 }
906 };
907
908} /* namespace gui */
909} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Button.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Button.h
deleted file mode 100644
index 081ab06..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Button.h
+++ /dev/null
@@ -1,171 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CButton Control Button
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CButton }
26/// **Standard push button control for window**
27///
28/// The button control is used for creating push buttons in Kodi. You can
29/// choose the position, size, and look of the button, as well as choosing
30/// what action(s) should be performed when pushed.
31///
32/// It has the header \ref Button.h "#include <kodi/gui/controls/Button.h>"
33/// be included to enjoy it.
34///
35/// Here you find the needed skin part for a \ref skin_Button_control "button control"
36///
37/// @note The call of the control is only possible from the corresponding
38/// window as its class and identification number is required.
39///
40class ATTRIBUTE_HIDDEN CButton : public CAddonGUIControlBase
41{
42public:
43 //==========================================================================
44 ///
45 /// @ingroup cpp_kodi_gui_control_CButton
46 /// @brief Construct a new control
47 ///
48 /// @param[in] window related window control class
49 /// @param[in] controlId Used skin xml control id
50 ///
51 CButton(CWindow* window, int controlId) : CAddonGUIControlBase(window)
52 {
53 m_controlHandle = m_interface->kodi_gui->window->get_control_button(
54 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
55 if (!m_controlHandle)
56 kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CButton can't create control class from Kodi !!!");
57 }
58 //--------------------------------------------------------------------------
59
60 //==========================================================================
61 ///
62 /// @ingroup cpp_kodi_gui_control_CButton
63 /// @brief Destructor
64 ///
65 ~CButton() override = default;
66 //--------------------------------------------------------------------------
67
68 //==========================================================================
69 ///
70 /// @ingroup cpp_kodi_gui_control_CButton
71 /// @brief Set the control on window to visible
72 ///
73 /// @param[in] visible If true visible, otherwise hidden
74 ///
75 void SetVisible(bool visible)
76 {
77 m_interface->kodi_gui->control_button->set_visible(m_interface->kodiBase, m_controlHandle,
78 visible);
79 }
80 //--------------------------------------------------------------------------
81
82 //==========================================================================
83 ///
84 /// @ingroup cpp_kodi_gui_control_CButton
85 /// @brief Set's the control's enabled/disabled state
86 ///
87 /// @param[in] enabled If true enabled, otherwise disabled
88 ///
89 void SetEnabled(bool enabled)
90 {
91 m_interface->kodi_gui->control_button->set_enabled(m_interface->kodiBase, m_controlHandle,
92 enabled);
93 }
94 //--------------------------------------------------------------------------
95
96 //==========================================================================
97 ///
98 /// @ingroup cpp_kodi_gui_control_CButton
99 /// @brief To set the text string on button
100 ///
101 /// @param[in] label Text to show
102 ///
103 void SetLabel(const std::string& label)
104 {
105 m_interface->kodi_gui->control_button->set_label(m_interface->kodiBase, m_controlHandle,
106 label.c_str());
107 }
108 //--------------------------------------------------------------------------
109
110 //==========================================================================
111 ///
112 /// @ingroup cpp_kodi_gui_control_CButton
113 /// @brief Get the used text from button
114 ///
115 /// @return Text shown
116 ///
117 std::string GetLabel() const
118 {
119 std::string label;
120 char* ret =
121 m_interface->kodi_gui->control_button->get_label(m_interface->kodiBase, m_controlHandle);
122 if (ret != nullptr)
123 {
124 if (std::strlen(ret))
125 label = ret;
126 m_interface->free_string(m_interface->kodiBase, ret);
127 }
128 return label;
129 }
130 //--------------------------------------------------------------------------
131
132 //==========================================================================
133 ///
134 /// @ingroup cpp_kodi_gui_control_CButton
135 /// @brief If two labels are used for button becomes it set with them
136 ///
137 /// @param[in] label Text for second label
138 ///
139 void SetLabel2(const std::string& label)
140 {
141 m_interface->kodi_gui->control_button->set_label2(m_interface->kodiBase, m_controlHandle,
142 label.c_str());
143 }
144 //--------------------------------------------------------------------------
145
146 //==========================================================================
147 ///
148 /// @ingroup cpp_kodi_gui_control_CButton
149 /// @brief Get the second label if present
150 ///
151 /// @return Second label
152 ///
153 std::string GetLabel2() const
154 {
155 std::string label;
156 char* ret =
157 m_interface->kodi_gui->control_button->get_label2(m_interface->kodiBase, m_controlHandle);
158 if (ret != nullptr)
159 {
160 if (std::strlen(ret))
161 label = ret;
162 m_interface->free_string(m_interface->kodiBase, ret);
163 }
164 return label;
165 }
166 //--------------------------------------------------------------------------
167};
168
169} /* namespace controls */
170} /* namespace gui */
171} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/CMakeLists.txt
deleted file mode 100644
index c7cc1dd..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
1set(HEADERS Button.h
2 Edit.h
3 FadeLabel.h
4 Image.h
5 Label.h
6 Progress.h
7 RadioButton.h
8 Rendering.h
9 SettingsSlider.h
10 Slider.h
11 Spin.h
12 TextBox.h)
13
14if(NOT ENABLE_STATIC_LIBS)
15 core_add_library(addons_kodi-addon-dev-kit_include_kodi_gui_controls)
16endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Edit.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Edit.h
deleted file mode 100644
index 99c01de..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Edit.h
+++ /dev/null
@@ -1,275 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_controls_CEdit Control Edit
24 /// \ingroup cpp_kodi_gui
25 /// @brief \cpp_class{ kodi::gui::controls::CEdit }
26 /// **Editable window text control used as an input control for the osd keyboard
27 /// and other input fields**
28 ///
29 /// The edit control allows a user to input text in Kodi. You can choose the
30 /// font, size, colour, location and header of the text to be displayed.
31 ///
32 /// It has the header \ref Edit.h "#include <kodi/gui/controls/Edit.h>"
33 /// be included to enjoy it.
34 ///
35 /// Here you find the needed skin part for a \ref skin_Edit_control
36 /// "edit control".
37 ///
38 /// @note The call of the control is only possible from the corresponding
39 /// window as its class and identification number is required.
40 ///
41
42 //============================================================================
43 // see gui/definition.h for use of group "cpp_kodi_gui_controls_CEdit_Defs"
44 ///
45 /// \defgroup cpp_kodi_gui_controls_CEdit_Defs Definitions, structures and enumerators
46 /// \ingroup cpp_kodi_gui_controls_CEdit
47 /// @brief **Library definition values**
48 ///
49
50} /* namespace controls */
51} /* namespace gui */
52} /* namespace kodi */
53
54//============================================================================
55///
56/// \ingroup cpp_kodi_gui_controls_CEdit_Defs
57/// @{
58/// @anchor AddonGUIInputType
59/// @brief Text input types used on kodi::gui::controls::CEdit
60enum AddonGUIInputType
61{
62 /// Text inside edit control only readable
63 ADDON_INPUT_TYPE_READONLY = -1,
64 /// Normal text entries
65 ADDON_INPUT_TYPE_TEXT = 0,
66 /// To use on edit control only numeric numbers
67 ADDON_INPUT_TYPE_NUMBER,
68 /// To insert seconds
69 ADDON_INPUT_TYPE_SECONDS,
70 /// To insert time
71 ADDON_INPUT_TYPE_TIME,
72 /// To insert a date
73 ADDON_INPUT_TYPE_DATE,
74 /// Used for write in IP addresses
75 ADDON_INPUT_TYPE_IPADDRESS,
76 /// Text field used as password entry field with not visible text
77 ADDON_INPUT_TYPE_PASSWORD,
78 /// Text field used as password entry field with not visible text but
79 /// returned as MD5 value
80 ADDON_INPUT_TYPE_PASSWORD_MD5,
81 /// Use text field for search purpose
82 ADDON_INPUT_TYPE_SEARCH,
83 /// Text field as filter
84 ADDON_INPUT_TYPE_FILTER,
85 ///
86 ADDON_INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW
87};
88/// @}
89//----------------------------------------------------------------------------
90
91namespace kodi
92{
93namespace gui
94{
95namespace controls
96{
97
98class ATTRIBUTE_HIDDEN CEdit : public CAddonGUIControlBase
99{
100public:
101 //==========================================================================
102 ///
103 /// \ingroup cpp_kodi_gui_controls_CEdit
104 /// @brief Construct a new control
105 ///
106 /// @param[in] window related window control class
107 /// @param[in] controlId Used skin xml control id
108 ///
109 CEdit(CWindow* window, int controlId) : CAddonGUIControlBase(window)
110 {
111 m_controlHandle = m_interface->kodi_gui->window->get_control_edit(
112 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
113 if (!m_controlHandle)
114 kodi::Log(ADDON_LOG_FATAL,
115 "kodi::gui::control::CEdit can't create control class from Kodi !!!");
116 }
117 //--------------------------------------------------------------------------
118
119 //==========================================================================
120 ///
121 /// \ingroup cpp_kodi_gui_controls_CEdit
122 /// @brief Destructor
123 ///
124 ~CEdit() override = default;
125 //--------------------------------------------------------------------------
126
127 //==========================================================================
128 ///
129 /// \ingroup cpp_kodi_gui_controls_CEdit
130 /// @brief Set the control on window to visible
131 ///
132 /// @param[in] visible If true visible, otherwise hidden
133 ///
134 void SetVisible(bool visible)
135 {
136 m_interface->kodi_gui->control_edit->set_visible(m_interface->kodiBase, m_controlHandle,
137 visible);
138 }
139 //--------------------------------------------------------------------------
140
141 //==========================================================================
142 ///
143 /// \ingroup cpp_kodi_gui_controls_CEdit
144 /// @brief Set's the control's enabled/disabled state
145 ///
146 /// @param[in] enabled If true enabled, otherwise disabled
147 ///
148 void SetEnabled(bool enabled)
149 {
150 m_interface->kodi_gui->control_edit->set_enabled(m_interface->kodiBase, m_controlHandle,
151 enabled);
152 }
153 //--------------------------------------------------------------------------
154
155 //==========================================================================
156 ///
157 /// \ingroup cpp_kodi_gui_controls_CEdit
158 /// @brief To set the text string on edit control
159 ///
160 /// @param[in] label Text to show
161 ///
162 void SetLabel(const std::string& label)
163 {
164 m_interface->kodi_gui->control_edit->set_label(m_interface->kodiBase, m_controlHandle,
165 label.c_str());
166 }
167 //--------------------------------------------------------------------------
168
169 //==========================================================================
170 ///
171 /// \ingroup cpp_kodi_gui_controls_CEdit
172 /// @brief Returns the text heading for this edit control.
173 ///
174 /// @return Heading text
175 ///
176 std::string GetLabel() const
177 {
178 std::string label;
179 char* ret =
180 m_interface->kodi_gui->control_edit->get_label(m_interface->kodiBase, m_controlHandle);
181 if (ret != nullptr)
182 {
183 if (std::strlen(ret))
184 label = ret;
185 m_interface->free_string(m_interface->kodiBase, ret);
186 }
187 return label;
188 }
189 //--------------------------------------------------------------------------
190
191 //==========================================================================
192 ///
193 /// \ingroup cpp_kodi_gui_controls_CEdit
194 /// @brief Set's text heading for this edit control.
195 ///
196 /// @param[in] text string or unicode - text string.
197 ///
198 void SetText(const std::string& text)
199 {
200 m_interface->kodi_gui->control_edit->set_text(m_interface->kodiBase, m_controlHandle,
201 text.c_str());
202 }
203 //--------------------------------------------------------------------------
204
205 //==========================================================================
206 ///
207 /// \ingroup cpp_kodi_gui_controls_CEdit
208 /// @brief Returns the text value for this edit control.
209 ///
210 /// @return Text value of control
211 ///
212 std::string GetText() const
213 {
214 std::string text;
215 char* ret =
216 m_interface->kodi_gui->control_edit->get_text(m_interface->kodiBase, m_controlHandle);
217 if (ret != nullptr)
218 {
219 if (std::strlen(ret))
220 text = ret;
221 m_interface->free_string(m_interface->kodiBase, ret);
222 }
223 return text;
224 }
225 //--------------------------------------------------------------------------
226
227 //==========================================================================
228 ///
229 /// \ingroup cpp_kodi_gui_controls_CEdit
230 /// @brief Set the cursor position on text.
231 ///
232 /// @param[in] iPosition The position to set
233 ///
234 void SetCursorPosition(unsigned int iPosition)
235 {
236 m_interface->kodi_gui->control_edit->set_cursor_position(m_interface->kodiBase, m_controlHandle,
237 iPosition);
238 }
239 //--------------------------------------------------------------------------
240
241 //==========================================================================
242 ///
243 /// \ingroup cpp_kodi_gui_controls_CEdit
244 /// @brief To get current cursor position on text field
245 ///
246 /// @return The current cursor position
247 ///
248 unsigned int GetCursorPosition()
249 {
250 return m_interface->kodi_gui->control_edit->get_cursor_position(m_interface->kodiBase,
251 m_controlHandle);
252 }
253 //--------------------------------------------------------------------------
254
255 //==========================================================================
256 ///
257 /// \ingroup cpp_kodi_gui_controls_CEdit
258 /// @brief To set field input type which are defined on \ref AddonGUIInputType
259 ///
260 /// @param[in] type The \ref AddonGUIInputType "Add-on input type"
261 /// to use
262 /// @param[in] heading The heading text for related keyboard
263 /// dialog
264 ///
265 void SetInputType(AddonGUIInputType type, const std::string& heading)
266 {
267 m_interface->kodi_gui->control_edit->set_input_type(m_interface->kodiBase, m_controlHandle,
268 static_cast<int>(type), heading.c_str());
269 }
270 //--------------------------------------------------------------------------
271};
272
273} /* namespace controls */
274} /* namespace gui */
275} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/FadeLabel.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/FadeLabel.h
deleted file mode 100644
index 02c843f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/FadeLabel.h
+++ /dev/null
@@ -1,153 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CFadeLabel Control Fade Label
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CFadeLabel }
26/// **Window control used to show multiple pieces of text in the same position,
27/// by fading from one to the other**
28///
29/// The fade label control is used for displaying multiple pieces of text in
30/// the same space in Kodi. You can choose the font, size, colour, location
31/// and contents of the text to be displayed. The first piece of information
32/// to display fades in over 50 frames, then scrolls off to the left. Once it
33/// is finished scrolling off screen, the second piece of information fades
34/// in and the process repeats. A fade label control is not supported in a
35/// list container.
36///
37/// It has the header \ref FadeLabel.h "#include <kodi/gui/controls/FadeLabel.h>"
38/// be included to enjoy it.
39///
40/// Here you find the needed skin part for a \ref Fade_Label_Control "fade label control"
41///
42/// @note The call of the control is only possible from the corresponding
43/// window as its class and identification number is required.
44///
45class ATTRIBUTE_HIDDEN CFadeLabel : public CAddonGUIControlBase
46{
47public:
48 //==========================================================================
49 ///
50 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
51 /// @brief Construct a new control.
52 ///
53 /// @param[in] window related window control class
54 /// @param[in] controlId Used skin xml control id
55 ///
56 CFadeLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window)
57 {
58 m_controlHandle = m_interface->kodi_gui->window->get_control_fade_label(
59 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
60 if (!m_controlHandle)
61 kodi::Log(ADDON_LOG_FATAL,
62 "kodi::gui::controls::CFadeLabel can't create control class from Kodi !!!");
63 }
64 //--------------------------------------------------------------------------
65
66 //==========================================================================
67 ///
68 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
69 /// @brief Destructor.
70 ///
71 ~CFadeLabel() override = default;
72 //--------------------------------------------------------------------------
73
74 //==========================================================================
75 ///
76 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
77 /// @brief Set the control on window to visible.
78 ///
79 /// @param[in] visible If true visible, otherwise hidden
80 ///
81 void SetVisible(bool visible)
82 {
83 m_interface->kodi_gui->control_fade_label->set_visible(m_interface->kodiBase, m_controlHandle,
84 visible);
85 }
86 //--------------------------------------------------------------------------
87
88 //==========================================================================
89 ///
90 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
91 /// @brief To add additional text string on fade label.
92 ///
93 /// @param[in] label Text to show
94 ///
95 void AddLabel(const std::string& label)
96 {
97 m_interface->kodi_gui->control_fade_label->add_label(m_interface->kodiBase, m_controlHandle,
98 label.c_str());
99 }
100 //--------------------------------------------------------------------------
101
102 //==========================================================================
103 ///
104 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
105 /// @brief Get the used text from button
106 ///
107 /// @return Text shown
108 ///
109 std::string GetLabel() const
110 {
111 std::string label;
112 char* ret = m_interface->kodi_gui->control_fade_label->get_label(m_interface->kodiBase,
113 m_controlHandle);
114 if (ret != nullptr)
115 {
116 if (std::strlen(ret))
117 label = ret;
118 m_interface->free_string(m_interface->kodiBase, ret);
119 }
120 return label;
121 }
122 //--------------------------------------------------------------------------
123
124 //==========================================================================
125 ///
126 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
127 /// @brief To enable or disable scrolling on fade label
128 ///
129 /// @param[in] scroll To enable scrolling set to true, otherwise is
130 /// disabled
131 ///
132 void SetScrolling(bool scroll)
133 {
134 m_interface->kodi_gui->control_fade_label->set_scrolling(m_interface->kodiBase, m_controlHandle,
135 scroll);
136 }
137 //--------------------------------------------------------------------------
138
139 //==========================================================================
140 ///
141 /// \ingroup cpp_kodi_gui_controls_CFadeLabel
142 /// @brief To reset al inserted labels.
143 ///
144 void Reset()
145 {
146 m_interface->kodi_gui->control_fade_label->reset(m_interface->kodiBase, m_controlHandle);
147 }
148 //--------------------------------------------------------------------------
149};
150
151} /* namespace controls */
152} /* namespace gui */
153} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Image.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Image.h
deleted file mode 100644
index b4d092f..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Image.h
+++ /dev/null
@@ -1,116 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CImage Control Image
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CImage }
26/// **Window control used to show an image.**
27///
28/// The image control is used for displaying images in Kodi. You can choose
29/// the position, size, transparency and contents of the image to be displayed.
30///
31/// It has the header \ref Image.h "#include <kodi/gui/controls/Image.h>"
32/// be included to enjoy it.
33///
34/// Here you find the needed skin part for a \ref Image_Control "image control"
35///
36/// @note The call of the control is only possible from the corresponding
37/// window as its class and identification number is required.
38///
39class ATTRIBUTE_HIDDEN CImage : public CAddonGUIControlBase
40{
41public:
42 //==========================================================================
43 ///
44 /// \ingroup cpp_kodi_gui_controls_CImage
45 /// @brief Construct a new control
46 ///
47 /// @param[in] window related window control class
48 /// @param[in] controlId Used skin xml control id
49 ///
50 CImage(CWindow* window, int controlId) : CAddonGUIControlBase(window)
51 {
52 m_controlHandle = m_interface->kodi_gui->window->get_control_image(
53 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
54 if (!m_controlHandle)
55 kodi::Log(ADDON_LOG_FATAL,
56 "kodi::gui::controls::CImage can't create control class from Kodi !!!");
57 }
58 //--------------------------------------------------------------------------
59
60 //==========================================================================
61 ///
62 /// \ingroup cpp_kodi_gui_controls_CImage
63 /// @brief Destructor
64 ///
65 ~CImage() override = default;
66 //--------------------------------------------------------------------------
67
68 //==========================================================================
69 ///
70 /// \ingroup cpp_kodi_gui_controls_CImage
71 /// @brief Set the control on window to visible
72 ///
73 /// @param[in] visible If true visible, otherwise hidden
74 ///
75 void SetVisible(bool visible)
76 {
77 m_interface->kodi_gui->control_image->set_visible(m_interface->kodiBase, m_controlHandle,
78 visible);
79 }
80 //--------------------------------------------------------------------------
81
82 //==========================================================================
83 ///
84 /// \ingroup cpp_kodi_gui_controls_CImage
85 /// @brief To set the filename used on image control.
86 ///
87 /// @param[in] filename Image file to use
88 /// @param[in] useCache To define storage of image, default is
89 /// in cache, if false becomes it loaded
90 /// always on changes again
91 ///
92 void SetFileName(const std::string& filename, bool useCache = true)
93 {
94 m_interface->kodi_gui->control_image->set_filename(m_interface->kodiBase, m_controlHandle,
95 filename.c_str(), useCache);
96 }
97 //--------------------------------------------------------------------------
98
99 //==========================================================================
100 ///
101 /// \ingroup cpp_kodi_gui_controls_CImage
102 /// @brief To set set the diffuse color on image.
103 ///
104 /// @param[in] colorDiffuse Color to use for diffuse
105 ///
106 void SetColorDiffuse(uint32_t colorDiffuse)
107 {
108 m_interface->kodi_gui->control_image->set_color_diffuse(m_interface->kodiBase, m_controlHandle,
109 colorDiffuse);
110 }
111 //--------------------------------------------------------------------------
112};
113
114} /* namespace controls */
115} /* namespace gui */
116} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Label.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Label.h
deleted file mode 100644
index 82604bd..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Label.h
+++ /dev/null
@@ -1,121 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CLabel Control Label
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CLabel }
26/// **Window control used to show some lines of text.**
27///
28/// The label control is used for displaying text in Kodi. You can choose
29/// the font, size, colour, location and contents of the text to be displayed.
30///
31/// It has the header \ref Label.h "#include <kodi/gui/controls/Label.h>"
32/// be included to enjoy it.
33///
34/// Here you find the needed skin part for a \ref Label_Control "label control"
35///
36/// @note The call of the control is only possible from the corresponding
37/// window as its class and identification number is required.
38///
39class ATTRIBUTE_HIDDEN CLabel : public CAddonGUIControlBase
40{
41public:
42 //==========================================================================
43 ///
44 /// \ingroup cpp_kodi_gui_controls_CLabel
45 /// @brief Construct a new control
46 ///
47 /// @param[in] window related window control class
48 /// @param[in] controlId Used skin xml control id
49 ///
50 CLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window)
51 {
52 m_controlHandle = m_interface->kodi_gui->window->get_control_label(
53 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
54 if (!m_controlHandle)
55 kodi::Log(ADDON_LOG_FATAL,
56 "kodi::gui::controls::CLabel can't create control class from Kodi !!!");
57 }
58 //--------------------------------------------------------------------------
59
60 //==========================================================================
61 ///
62 /// \ingroup cpp_kodi_gui_controls_CLabel
63 /// @brief Destructor
64 ///
65 ~CLabel() override = default;
66 //--------------------------------------------------------------------------
67
68 //==========================================================================
69 ///
70 /// \ingroup cpp_kodi_gui_controls_CLabel
71 /// @brief Set the control on window to visible
72 ///
73 /// @param[in] visible If true visible, otherwise hidden
74 ///
75 void SetVisible(bool visible)
76 {
77 m_interface->kodi_gui->control_label->set_visible(m_interface->kodiBase, m_controlHandle,
78 visible);
79 }
80 //--------------------------------------------------------------------------
81
82 //==========================================================================
83 ///
84 /// \ingroup cpp_kodi_gui_controls_CLabel
85 /// @brief To set the text string on label
86 ///
87 /// @param[in] text Text to show
88 ///
89 void SetLabel(const std::string& text)
90 {
91 m_interface->kodi_gui->control_label->set_label(m_interface->kodiBase, m_controlHandle,
92 text.c_str());
93 }
94 //--------------------------------------------------------------------------
95
96 //==========================================================================
97 ///
98 /// \ingroup cpp_kodi_gui_controls_CLabel
99 /// @brief Get the used text from control
100 ///
101 /// @return Used text on label control
102 ///
103 std::string GetLabel() const
104 {
105 std::string label;
106 char* ret =
107 m_interface->kodi_gui->control_label->get_label(m_interface->kodiBase, m_controlHandle);
108 if (ret != nullptr)
109 {
110 if (std::strlen(ret))
111 label = ret;
112 m_interface->free_string(m_interface->kodiBase, ret);
113 }
114 return label;
115 }
116 //--------------------------------------------------------------------------
117};
118
119} /* namespace controls */
120} /* namespace gui */
121} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Progress.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Progress.h
deleted file mode 100644
index 8cb582b..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Progress.h
+++ /dev/null
@@ -1,114 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CProgress Control Progress
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CProgress }
26/// **Window control to show the progress of a particular operation**
27///
28/// The progress control is used to show the progress of an item that may take
29/// a long time, or to show how far through a movie you are. You can choose
30/// the position, size, and look of the progress control.
31///
32/// It has the header \ref Progress.h "#include <kodi/gui/controls/Progress.h>"
33/// be included to enjoy it.
34///
35/// Here you find the needed skin part for a \ref Progress_Control "progress control"
36///
37/// @note The call of the control is only possible from the corresponding
38/// window as its class and identification number is required.
39///
40class ATTRIBUTE_HIDDEN CProgress : public CAddonGUIControlBase
41{
42public:
43 //==========================================================================
44 ///
45 /// \ingroup cpp_kodi_gui_controls_CProgress
46 /// @brief Construct a new control
47 ///
48 /// @param[in] window related window control class
49 /// @param[in] controlId Used skin xml control id
50 ///
51 CProgress(CWindow* window, int controlId) : CAddonGUIControlBase(window)
52 {
53 m_controlHandle = m_interface->kodi_gui->window->get_control_progress(
54 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
55 if (!m_controlHandle)
56 kodi::Log(ADDON_LOG_FATAL,
57 "kodi::gui::controls::CProgress can't create control class from Kodi !!!");
58 }
59 //--------------------------------------------------------------------------
60
61 //==========================================================================
62 ///
63 /// \ingroup cpp_kodi_gui_controls_CProgress
64 /// @brief Destructor
65 ///
66 ~CProgress() override = default;
67 //--------------------------------------------------------------------------
68
69 //==========================================================================
70 ///
71 /// \ingroup cpp_kodi_gui_controls_CProgress
72 /// @brief Set the control on window to visible
73 ///
74 /// @param[in] visible If true visible, otherwise hidden
75 ///
76 void SetVisible(bool visible)
77 {
78 m_interface->kodi_gui->control_progress->set_visible(m_interface->kodiBase, m_controlHandle,
79 visible);
80 }
81 //--------------------------------------------------------------------------
82
83 //==========================================================================
84 ///
85 /// \ingroup cpp_kodi_gui_controls_CProgress
86 /// @brief To set Percent position of control
87 ///
88 /// @param[in] percent The percent position to use
89 ///
90 void SetPercentage(float percent)
91 {
92 m_interface->kodi_gui->control_progress->set_percentage(m_interface->kodiBase, m_controlHandle,
93 percent);
94 }
95 //--------------------------------------------------------------------------
96
97 //==========================================================================
98 ///
99 /// \ingroup cpp_kodi_gui_controls_CProgress
100 /// @brief Get the active percent position of progress bar
101 ///
102 /// @return Progress position as percent
103 ///
104 float GetPercentage() const
105 {
106 return m_interface->kodi_gui->control_progress->get_percentage(m_interface->kodiBase,
107 m_controlHandle);
108 }
109 //--------------------------------------------------------------------------
110};
111
112} /* namespace controls */
113} /* namespace gui */
114} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/RadioButton.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/RadioButton.h
deleted file mode 100644
index 305195d..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/RadioButton.h
+++ /dev/null
@@ -1,167 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CRadioButton Control Radio Button
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CRadioButton }
26/// **Window control for a radio button (as used for on/off settings)**
27///
28/// The radio button control is used for creating push button on/off settings
29/// in Kodi. You can choose the position, size, and look of the button. When
30/// the user clicks on the radio button, the state will change, toggling the
31/// extra textures (textureradioon and textureradiooff). Used for settings
32/// controls.
33///
34/// It has the header \ref RadioButton.h "#include <kodi/gui/controls/RadioButton.h>"
35/// be included to enjoy it.
36///
37/// Here you find the needed skin part for a \ref Radio_button_control "radio button control"
38///
39/// @note The call of the control is only possible from the corresponding
40/// window as its class and identification number is required.
41///
42class ATTRIBUTE_HIDDEN CRadioButton : public CAddonGUIControlBase
43{
44public:
45 //==========================================================================
46 ///
47 /// \ingroup cpp_kodi_gui_controls_CRadioButton
48 /// @brief Construct a new control
49 ///
50 /// @param[in] window related window control class
51 /// @param[in] controlId Used skin xml control id
52 ///
53 CRadioButton(CWindow* window, int controlId) : CAddonGUIControlBase(window)
54 {
55 m_controlHandle = m_interface->kodi_gui->window->get_control_radio_button(
56 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
57 if (!m_controlHandle)
58 kodi::Log(ADDON_LOG_FATAL,
59 "kodi::gui::controls::CRadioButton can't create control class from Kodi !!!");
60 }
61 //--------------------------------------------------------------------------
62
63 //==========================================================================
64 ///
65 /// \ingroup cpp_kodi_gui_controls_CRadioButton
66 /// @brief Destructor
67 ///
68 ~CRadioButton() override = default;
69 //--------------------------------------------------------------------------
70
71 //==========================================================================
72 ///
73 /// \ingroup cpp_kodi_gui_controls_CRadioButton
74 /// @brief Set the control on window to visible
75 ///
76 /// @param[in] visible If true visible, otherwise hidden
77 ///
78 void SetVisible(bool visible)
79 {
80 m_interface->kodi_gui->control_radio_button->set_visible(m_interface->kodiBase, m_controlHandle,
81 visible);
82 }
83 //--------------------------------------------------------------------------
84
85 //==========================================================================
86 ///
87 /// \ingroup cpp_kodi_gui_controls_CRadioButton
88 /// @brief Set's the control's enabled/disabled state
89 ///
90 /// @param[in] enabled If true enabled, otherwise disabled
91 ///
92 void SetEnabled(bool enabled)
93 {
94 m_interface->kodi_gui->control_radio_button->set_enabled(m_interface->kodiBase, m_controlHandle,
95 enabled);
96 }
97 //--------------------------------------------------------------------------
98
99 //==========================================================================
100 ///
101 /// \ingroup cpp_kodi_gui_controls_CRadioButton
102 /// @brief To set the text string on radio button
103 ///
104 /// @param[in] label Text to show
105 ///
106 void SetLabel(const std::string& label)
107 {
108 m_interface->kodi_gui->control_radio_button->set_label(m_interface->kodiBase, m_controlHandle,
109 label.c_str());
110 }
111 //--------------------------------------------------------------------------
112
113 //==========================================================================
114 ///
115 /// \ingroup cpp_kodi_gui_controls_CRadioButton
116 /// @brief Get the used text from control
117 ///
118 /// @return Text shown
119 ///
120 std::string GetLabel() const
121 {
122 std::string label;
123 char* ret = m_interface->kodi_gui->control_radio_button->get_label(m_interface->kodiBase,
124 m_controlHandle);
125 if (ret != nullptr)
126 {
127 if (std::strlen(ret))
128 label = ret;
129 m_interface->free_string(m_interface->kodiBase, ret);
130 }
131 return label;
132 }
133 //--------------------------------------------------------------------------
134
135 //==========================================================================
136 ///
137 /// \ingroup cpp_kodi_gui_controls_CRadioButton
138 /// @brief To set radio button condition to on or off
139 ///
140 /// @param[in] selected true set radio button to selection on, otherwise
141 /// off
142 ///
143 void SetSelected(bool selected)
144 {
145 m_interface->kodi_gui->control_radio_button->set_selected(m_interface->kodiBase,
146 m_controlHandle, selected);
147 }
148 //--------------------------------------------------------------------------
149
150 //==========================================================================
151 ///
152 /// \ingroup cpp_kodi_gui_controls_CRadioButton
153 /// @brief Get the current selected condition of radio button
154 ///
155 /// @return Selected condition
156 ///
157 bool IsSelected() const
158 {
159 return m_interface->kodi_gui->control_radio_button->is_selected(m_interface->kodiBase,
160 m_controlHandle);
161 }
162 //--------------------------------------------------------------------------
163};
164
165} /* namespace controls */
166} /* namespace gui */
167} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Rendering.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Rendering.h
deleted file mode 100644
index 7cc9b24..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Rendering.h
+++ /dev/null
@@ -1,205 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13#include "../renderHelper.h"
14
15namespace kodi
16{
17namespace gui
18{
19namespace controls
20{
21
22//============================================================================
23///
24/// \defgroup cpp_kodi_gui_controls_CRendering Control Rendering
25/// \ingroup cpp_kodi_gui
26/// @brief \cpp_class{ kodi::gui::controls::CRendering }
27/// **Window control for rendering own parts**
28///
29/// This rendering control is used when own parts are needed. You have the
30/// control over them to render direct OpenGL or DirectX content to the
31/// screen set by the size of them.
32///
33/// Alternative can be the virtual functions from t his been ignored if the
34/// callbacks are defined by the \ref CRendering_SetIndependentCallbacks function and
35/// class is used as single and not as a parent class.
36///
37/// It has the header \ref Rendering.h "#include <kodi/gui/controls/Rendering.h>"
38/// be included to enjoy it.
39///
40/// Here you find the needed skin part for a \ref Addon_Rendering_control "rendering control"
41///
42/// @note The call of the control is only possible from the corresponding
43/// window as its class and identification number is required.
44///
45
46//============================================================================
47///
48/// \defgroup cpp_kodi_gui_controls_CRendering_Defs Definitions, structures and enumerators
49/// \ingroup cpp_kodi_gui_controls_CRendering
50/// @brief **Library definition values**
51///
52
53class ATTRIBUTE_HIDDEN CRendering : public CAddonGUIControlBase
54{
55public:
56 //==========================================================================
57 ///
58 /// \ingroup cpp_kodi_gui_controls_CRendering
59 /// @brief Construct a new control
60 ///
61 /// @param[in] window related window control class
62 /// @param[in] controlId Used skin xml control id
63 ///
64 CRendering(CWindow* window, int controlId) : CAddonGUIControlBase(window)
65 {
66 m_controlHandle = m_interface->kodi_gui->window->get_control_render_addon(
67 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
68 if (m_controlHandle)
69 m_interface->kodi_gui->control_rendering->set_callbacks(m_interface->kodiBase,
70 m_controlHandle, this, OnCreateCB,
71 OnRenderCB, OnStopCB, OnDirtyCB);
72 else
73 kodi::Log(ADDON_LOG_FATAL, "kodi::gui::controls::%s can't create control class from Kodi !!!",
74 __FUNCTION__);
75 }
76 //--------------------------------------------------------------------------
77
78 //==========================================================================
79 ///
80 /// \ingroup cpp_kodi_gui_controls_CRendering
81 /// @brief Destructor
82 ///
83 ~CRendering() override
84 {
85 m_interface->kodi_gui->control_rendering->destroy(m_interface->kodiBase, m_controlHandle);
86 }
87 //--------------------------------------------------------------------------
88
89 //==========================================================================
90 ///
91 /// \ingroup cpp_kodi_gui_controls_CRendering
92 /// @brief To create rendering control on Add-on
93 ///
94 /// Function creates the needed rendering control for Kodi which becomes
95 /// handled and processed from Add-on
96 ///
97 /// @note This is callback function from Kodi to Add-on and not to use
98 /// for calls from add-on to this function.
99 ///
100 /// @param[in] x Horizontal position
101 /// @param[in] y Vertical position
102 /// @param[in] w Width of control
103 /// @param[in] h Height of control
104 /// @param[in] device The device to use. For OpenGL is empty
105 /// on Direct X is the needed device send.
106 /// @return Add-on needs to return true if successed,
107 /// otherwise false.
108 ///
109 virtual bool Create(int x, int y, int w, int h, void* device) { return false; }
110 //--------------------------------------------------------------------------
111
112 //==========================================================================
113 ///
114 /// \ingroup cpp_kodi_gui_controls_CRendering
115 /// @brief Render process call from Kodi
116 ///
117 /// @note This is callback function from Kodi to Add-on and not to use
118 /// for calls from add-on to this function.
119 ///
120 virtual void Render() {}
121 //--------------------------------------------------------------------------
122
123 //==========================================================================
124 ///
125 /// \ingroup cpp_kodi_gui_controls_CRendering
126 /// @brief Call from Kodi to stop rendering process
127 ///
128 /// @note This is callback function from Kodi to Add-on and not to use
129 /// for calls from add-on to this function.
130 ///
131 virtual void Stop() {}
132 //--------------------------------------------------------------------------
133
134 //==========================================================================
135 ///
136 /// \ingroup cpp_kodi_gui_controls_CRendering
137 /// @brief Call from Kodi where add-on becomes asked about dirty rendering
138 /// region.
139 ///
140 /// @note This is callback function from Kodi to Add-on and not to use
141 /// for calls from add-on to this function.
142 ///
143 virtual bool Dirty() { return false; }
144 //--------------------------------------------------------------------------
145
146 //==========================================================================
147 ///
148 /// \ingroup cpp_kodi_gui_controls_CRendering
149 /// \anchor CRendering_SetIndependentCallbacks
150 /// @brief If the class is used independent (with "new CRendering")
151 /// and not as parent (with "cCLASS_own : CRendering") from own must
152 /// be the callback from Kodi to add-on overdriven with own functions!
153 ///
154 void SetIndependentCallbacks(
155 GUIHANDLE cbhdl,
156 bool (*CBCreate)(GUIHANDLE cbhdl, int x, int y, int w, int h, void* device),
157 void (*CBRender)(GUIHANDLE cbhdl),
158 void (*CBStop)(GUIHANDLE cbhdl),
159 bool (*CBDirty)(GUIHANDLE cbhdl))
160 {
161 if (!cbhdl || !CBCreate || !CBRender || !CBStop || !CBDirty)
162 {
163 kodi::Log(ADDON_LOG_ERROR, "kodi::gui::controls::%s called with nullptr !!!", __FUNCTION__);
164 return;
165 }
166
167 m_interface->kodi_gui->control_rendering->set_callbacks(
168 m_interface->kodiBase, m_controlHandle, cbhdl, CBCreate, CBRender, CBStop, CBDirty);
169 }
170 //--------------------------------------------------------------------------
171
172private:
173 /*
174 * Defined callback functions from Kodi to add-on, for use in parent / child system
175 * (is private)!
176 */
177 static bool OnCreateCB(void* cbhdl, int x, int y, int w, int h, void* device)
178 {
179 static_cast<CRendering*>(cbhdl)->m_renderHelper = kodi::gui::GetRenderHelper();
180 return static_cast<CRendering*>(cbhdl)->Create(x, y, w, h, device);
181 }
182
183 static void OnRenderCB(void* cbhdl)
184 {
185 if (!static_cast<CRendering*>(cbhdl)->m_renderHelper)
186 return;
187 static_cast<CRendering*>(cbhdl)->m_renderHelper->Begin();
188 static_cast<CRendering*>(cbhdl)->Render();
189 static_cast<CRendering*>(cbhdl)->m_renderHelper->End();
190 }
191
192 static void OnStopCB(void* cbhdl)
193 {
194 static_cast<CRendering*>(cbhdl)->Stop();
195 static_cast<CRendering*>(cbhdl)->m_renderHelper = nullptr;
196 }
197
198 static bool OnDirtyCB(void* cbhdl) { return static_cast<CRendering*>(cbhdl)->Dirty(); }
199
200 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
201};
202
203} /* namespace controls */
204} /* namespace gui */
205} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/SettingsSlider.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/SettingsSlider.h
deleted file mode 100644
index 76a02aa..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/SettingsSlider.h
+++ /dev/null
@@ -1,326 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CSettingsSlider Control Settings Slider
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CSettingsSlider }
26/// **Window control for moveable slider with text name**
27///
28/// The settings slider control is used in the settings screens for when an
29/// option is best specified on a sliding scale. You can choose the position,
30/// size, and look of the slider control. It is basically a cross between the
31/// button control and a slider control. It has a label and focus and non
32/// focus textures, as well as a slider control on the right.
33///
34/// It has the header \ref SettingsSlider.h "#include <kodi/gui/controls/SettingsSlider.h>"
35/// be included to enjoy it.
36///
37/// Here you find the needed skin part for a \ref Settings_Slider_Control "settings slider control"
38///
39/// @note The call of the control is only possible from the corresponding
40/// window as its class and identification number is required.
41///
42class ATTRIBUTE_HIDDEN CSettingsSlider : public CAddonGUIControlBase
43{
44public:
45 //==========================================================================
46 ///
47 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
48 /// @brief Construct a new control
49 ///
50 /// @param[in] window related window control class
51 /// @param[in] controlId Used skin xml control id
52 ///
53 CSettingsSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window)
54 {
55 m_controlHandle = m_interface->kodi_gui->window->get_control_settings_slider(
56 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
57 if (!m_controlHandle)
58 kodi::Log(ADDON_LOG_FATAL,
59 "kodi::gui::controls::CSettingsSlider can't create control class from Kodi !!!");
60 }
61 //--------------------------------------------------------------------------
62
63 //==========================================================================
64 ///
65 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
66 /// @brief Destructor
67 ///
68 ~CSettingsSlider() override = default;
69 //--------------------------------------------------------------------------
70
71 //==========================================================================
72 ///
73 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
74 /// @brief Set the control on window to visible
75 ///
76 /// @param[in] visible If true visible, otherwise hidden
77 ///
78 void SetVisible(bool visible)
79 {
80 m_interface->kodi_gui->control_settings_slider->set_visible(m_interface->kodiBase,
81 m_controlHandle, visible);
82 }
83 //--------------------------------------------------------------------------
84
85 //==========================================================================
86 ///
87 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
88 /// @brief Set's the control's enabled/disabled state
89 ///
90 /// @param[in] enabled If true enabled, otherwise disabled
91 ///
92 void SetEnabled(bool enabled)
93 {
94 m_interface->kodi_gui->control_settings_slider->set_enabled(m_interface->kodiBase,
95 m_controlHandle, enabled);
96 }
97 //--------------------------------------------------------------------------
98
99 //==========================================================================
100 ///
101 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
102 /// @brief To set the text string on settings slider
103 ///
104 /// @param[in] text Text to show
105 ///
106 void SetText(const std::string& text)
107 {
108 m_interface->kodi_gui->control_settings_slider->set_text(m_interface->kodiBase, m_controlHandle,
109 text.c_str());
110 }
111 //--------------------------------------------------------------------------
112
113 //==========================================================================
114 ///
115 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
116 /// @brief To reset slider on defaults
117 ///
118 void Reset()
119 {
120 m_interface->kodi_gui->control_settings_slider->reset(m_interface->kodiBase, m_controlHandle);
121 }
122 //--------------------------------------------------------------------------
123
124 //==========================================================================
125 ///
126 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
127 /// @brief To set the the range as integer of slider, e.g. -10 is the slider
128 /// start and e.g. +10 is the from here defined position where it reach the
129 /// end.
130 ///
131 /// Ad default is the range from 0 to 100.
132 ///
133 /// The integer interval is as default 1 and can be changed with
134 /// @ref SetIntInterval.
135 ///
136 /// @param[in] start Integer start value
137 /// @param[in] end Integer end value
138 ///
139 /// @note Percent, floating point or integer are alone possible. Combining
140 /// these different values can be not together and can, therefore, only
141 /// one each can be used.
142 ///
143 void SetIntRange(int start, int end)
144 {
145 m_interface->kodi_gui->control_settings_slider->set_int_range(m_interface->kodiBase,
146 m_controlHandle, start, end);
147 }
148 //--------------------------------------------------------------------------
149
150 //==========================================================================
151 ///
152 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
153 /// @brief Set the slider position with the given integer value. The Range
154 /// must be defined with a call from \ref SetIntRange before.
155 ///
156 /// @param[in] value Position in range to set with integer
157 ///
158 /// @note Percent, floating point or integer are alone possible. Combining
159 /// these different values ​​can be not together and can, therefore, only
160 /// one each can be used.
161 ///
162 void SetIntValue(int value)
163 {
164 m_interface->kodi_gui->control_settings_slider->set_int_value(m_interface->kodiBase,
165 m_controlHandle, value);
166 }
167 //--------------------------------------------------------------------------
168
169 //==========================================================================
170 ///
171 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
172 /// @brief To get the current position as integer value.
173 ///
174 /// @return The position as integer
175 ///
176 /// @note Percent, floating point or integer are alone possible. Combining
177 /// these different values ​​can be not together and can, therefore, only
178 /// one each can be used.
179 ///
180 int GetIntValue() const
181 {
182 return m_interface->kodi_gui->control_settings_slider->get_int_value(m_interface->kodiBase,
183 m_controlHandle);
184 }
185 //--------------------------------------------------------------------------
186
187 //==========================================================================
188 ///
189 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
190 /// @brief To set the interval steps of slider, as default is it 1. If it
191 /// becomes changed with this function will a step of the user with the
192 /// value fixed here be executed.
193 ///
194 /// @param[in] interval Intervall step to set.
195 ///
196 /// @note Percent, floating point or integer are alone possible. Combining
197 /// these different values ​​can be not together and can, therefore, only
198 /// one each can be used.
199 ///
200 void SetIntInterval(int interval)
201 {
202 m_interface->kodi_gui->control_settings_slider->set_int_interval(m_interface->kodiBase,
203 m_controlHandle, interval);
204 }
205 //--------------------------------------------------------------------------
206
207 //==========================================================================
208 ///
209 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
210 /// @brief Sets the percent of the slider.
211 ///
212 /// @param[in] percent float - Percent value of slide
213 ///
214 /// @note Percent, floating point or integer are alone possible. Combining
215 /// these different values ​​can be not together and can, therefore, only
216 /// one each can be used.
217 ///
218 void SetPercentage(float percent)
219 {
220 m_interface->kodi_gui->control_settings_slider->set_percentage(m_interface->kodiBase,
221 m_controlHandle, percent);
222 }
223 //--------------------------------------------------------------------------
224
225 //==========================================================================
226 ///
227 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
228 /// @brief Returns a float of the percent of the slider.
229 ///
230 /// @return float - Percent of slider
231 ///
232 /// @note Percent, floating point or integer are alone possible. Combining
233 /// these different values ​​can be not together and can, therefore, only
234 /// one each can be used.
235 ///
236 float GetPercentage() const
237 {
238 return m_interface->kodi_gui->control_settings_slider->get_percentage(m_interface->kodiBase,
239 m_controlHandle);
240 }
241 //--------------------------------------------------------------------------
242
243 //==========================================================================
244 ///
245 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
246 /// @brief To set the the range as float of slider, e.g. -25.0 is the slider
247 /// start and e.g. +25.0 is the from here defined position where it reach
248 /// the end.
249 ///
250 /// As default is the range 0.0 to 1.0.
251 ///
252 /// The float interval is as default 0.1 and can be changed with
253 /// @ref SetFloatInterval.
254 ///
255 /// @param[in] start Integer start value
256 /// @param[in] end Integer end value
257 ///
258 /// @note Percent, floating point or integer are alone possible. Combining
259 /// these different values ​​ can be not together and can, therefore, only
260 /// one each can be used.
261 ///
262 void SetFloatRange(float start, float end)
263 {
264 m_interface->kodi_gui->control_settings_slider->set_float_range(m_interface->kodiBase,
265 m_controlHandle, start, end);
266 }
267 //--------------------------------------------------------------------------
268
269 //==========================================================================
270 ///
271 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
272 /// @brief Set the slider position with the given float value. The Range
273 /// can be defined with a call from \ref SetIntRange before, as default it
274 /// is 0.0 to 1.0.
275 ///
276 /// @param[in] value Position in range to set with float
277 ///
278 /// @note Percent, floating point or integer are alone possible. Combining
279 /// these different values ​​can be not together and can, therefore, only
280 /// one each can be used.
281 ///
282 void SetFloatValue(float value)
283 {
284 m_interface->kodi_gui->control_settings_slider->set_float_value(m_interface->kodiBase,
285 m_controlHandle, value);
286 }
287 //--------------------------------------------------------------------------
288
289 //==========================================================================
290 ///
291 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
292 /// @brief To get the current position as float value.
293 ///
294 /// @return The position as float
295 ///
296 float GetFloatValue() const
297 {
298 return m_interface->kodi_gui->control_settings_slider->get_float_value(m_interface->kodiBase,
299 m_controlHandle);
300 }
301 //--------------------------------------------------------------------------
302
303 //==========================================================================
304 ///
305 /// \ingroup cpp_kodi_gui_controls_CSettingsSlider
306 /// @brief To set the interval steps of slider, as default is it 0.1 If it
307 /// becomes changed with this function will a step of the user with the
308 /// value fixed here be executed.
309 ///
310 /// @param[in] interval Intervall step to set.
311 ///
312 /// @note Percent, floating point or integer are alone possible. Combining
313 /// these different values ​​can be not together and can, therefore, only
314 /// one each can be used.
315 ///
316 void SetFloatInterval(float interval)
317 {
318 m_interface->kodi_gui->control_settings_slider->set_float_interval(m_interface->kodiBase,
319 m_controlHandle, interval);
320 }
321 //--------------------------------------------------------------------------
322};
323
324} /* namespace controls */
325} /* namespace gui */
326} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Slider.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Slider.h
deleted file mode 100644
index 715cc7d..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Slider.h
+++ /dev/null
@@ -1,339 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CSlider Control Slider
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CSlider }
26/// **Window control for moveable slider**
27///
28/// The slider control is used for things where a sliding bar best represents
29/// the operation at hand (such as a volume control or seek control). You can
30/// choose the position, size, and look of the slider control.
31///
32/// It has the header \ref Slider.h "#include <kodi/gui/controls/Slider.h>"
33/// be included to enjoy it.
34///
35/// Here you find the needed skin part for a \ref Slider_Control "slider control"
36///
37/// @note The call of the control is only possible from the corresponding
38/// window as its class and identification number is required.
39///
40class ATTRIBUTE_HIDDEN CSlider : public CAddonGUIControlBase
41{
42public:
43 //==========================================================================
44 ///
45 /// \ingroup cpp_kodi_gui_controls_CSlider
46 /// @brief Construct a new control
47 ///
48 /// @param[in] window related window control class
49 /// @param[in] controlId Used skin xml control id
50 ///
51 CSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window)
52 {
53 m_controlHandle = m_interface->kodi_gui->window->get_control_slider(
54 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
55 if (!m_controlHandle)
56 kodi::Log(ADDON_LOG_FATAL,
57 "kodi::gui::controls::CSlider can't create control class from Kodi !!!");
58 }
59 //--------------------------------------------------------------------------
60
61 //==========================================================================
62 ///
63 /// \ingroup cpp_kodi_gui_controls_CSlider
64 /// @brief Destructor
65 ///
66 ~CSlider() override = default;
67 //--------------------------------------------------------------------------
68
69 //==========================================================================
70 ///
71 /// \ingroup cpp_kodi_gui_controls_CSlider
72 /// @brief Set the control on window to visible
73 ///
74 /// @param[in] visible If true visible, otherwise hidden
75 ///
76 void SetVisible(bool visible)
77 {
78 m_interface->kodi_gui->control_slider->set_visible(m_interface->kodiBase, m_controlHandle,
79 visible);
80 }
81 //--------------------------------------------------------------------------
82
83 //==========================================================================
84 ///
85 /// \ingroup cpp_kodi_gui_controls_CSlider
86 /// @brief Set's the control's enabled/disabled state
87 ///
88 /// @param[in] enabled If true enabled, otherwise disabled
89 ///
90 void SetEnabled(bool enabled)
91 {
92 m_interface->kodi_gui->control_slider->set_enabled(m_interface->kodiBase, m_controlHandle,
93 enabled);
94 }
95 //--------------------------------------------------------------------------
96
97 //==========================================================================
98 ///
99 /// \ingroup cpp_kodi_gui_controls_CSlider
100 /// @brief To reset slider on defaults
101 ///
102 void Reset()
103 {
104 m_interface->kodi_gui->control_slider->reset(m_interface->kodiBase, m_controlHandle);
105 }
106 //--------------------------------------------------------------------------
107
108 //==========================================================================
109 ///
110 /// \ingroup cpp_kodi_gui_controls_CSlider
111 /// @brief With GetDescription becomes a string value of position returned.
112 ///
113 /// @return Text string about current slider position
114 ///
115 /// The following are the text definition returned from this:
116 /// | Value | Without range selection | With range selection |
117 /// |:---------:|:------------------------|:-------------------------------|
118 /// | float | <c>%2.2f</c> | <c>[%2.2f, %2.2f]</c> |
119 /// | integer | <c>%i</c> | <c>[%i, %i]</c> |
120 /// | percent | <c>%i%%</c> | <c>[%i%%, %i%%]</c> |
121 ///
122 std::string GetDescription() const
123 {
124 std::string text;
125 char* ret = m_interface->kodi_gui->control_slider->get_description(m_interface->kodiBase,
126 m_controlHandle);
127 if (ret != nullptr)
128 {
129 if (std::strlen(ret))
130 text = ret;
131 m_interface->free_string(m_interface->kodiBase, ret);
132 }
133 return text;
134 }
135 //--------------------------------------------------------------------------
136
137 //==========================================================================
138 ///
139 /// \ingroup cpp_kodi_gui_controls_CSlider
140 /// @brief To set the the range as integer of slider, e.g. -10 is the slider
141 /// start and e.g. +10 is the from here defined position where it reach the
142 /// end.
143 ///
144 /// Ad default is the range from 0 to 100.
145 ///
146 /// The integer interval is as default 1 and can be changed with
147 /// @ref SetIntInterval.
148 ///
149 /// @param[in] start Integer start value
150 /// @param[in] end Integer end value
151 ///
152 /// @note Percent, floating point or integer are alone possible. Combining
153 /// these different values can be not together and can, therefore, only one
154 /// each can be used.
155 ///
156 void SetIntRange(int start, int end)
157 {
158 m_interface->kodi_gui->control_slider->set_int_range(m_interface->kodiBase, m_controlHandle,
159 start, end);
160 }
161 //--------------------------------------------------------------------------
162
163 //==========================================================================
164 ///
165 /// \ingroup CSlider
166 /// @brief Set the slider position with the given integer value. The Range
167 /// must be defined with a call from \ref SetIntRange before.
168 ///
169 /// @param[in] value Position in range to set with integer
170 ///
171 /// @note Percent, floating point or integer are alone possible. Combining
172 /// these different values can be not together and can, therefore, only one
173 /// each can be used.
174 ///
175 void SetIntValue(int value)
176 {
177 m_interface->kodi_gui->control_slider->set_int_value(m_interface->kodiBase, m_controlHandle,
178 value);
179 }
180 //--------------------------------------------------------------------------
181
182 //==========================================================================
183 ///
184 /// \ingroup cpp_kodi_gui_controls_CSlider
185 /// @brief To get the current position as integer value.
186 ///
187 /// @return The position as integer
188 ///
189 /// @note Percent, floating point or integer are alone possible. Combining
190 /// these different values can be not together and can, therefore, only
191 /// one each can be used.
192 ///
193 int GetIntValue() const
194 {
195 return m_interface->kodi_gui->control_slider->get_int_value(m_interface->kodiBase,
196 m_controlHandle);
197 }
198 //--------------------------------------------------------------------------
199
200 //==========================================================================
201 ///
202 /// \ingroup cpp_kodi_gui_controls_CSlider
203 /// @brief To set the interval steps of slider, as default is it 1. If it
204 /// becomes changed with this function will a step of the user with the
205 /// value fixed here be executed.
206 ///
207 /// @param[in] interval Intervall step to set.
208 ///
209 /// @note Percent, floating point or integer are alone possible. Combining
210 /// these different values can be not together and can, therefore, only one
211 /// each can be used.
212 ///
213 void SetIntInterval(int interval)
214 {
215 m_interface->kodi_gui->control_slider->set_int_interval(m_interface->kodiBase, m_controlHandle,
216 interval);
217 }
218 //--------------------------------------------------------------------------
219
220 //==========================================================================
221 ///
222 /// \ingroup cpp_kodi_gui_controls_CSlider
223 /// @brief Sets the percent of the slider.
224 ///
225 /// @param[in] percent float - Percent value of slide
226 ///
227 /// @note Percent, floating point or integer are alone possible. Combining
228 /// these different values can be not together and can, therefore, only one
229 /// each can be used.
230 ///
231 void SetPercentage(float percent)
232 {
233 m_interface->kodi_gui->control_slider->set_percentage(m_interface->kodiBase, m_controlHandle,
234 percent);
235 }
236 //--------------------------------------------------------------------------
237
238 //==========================================================================
239 ///
240 /// \ingroup cpp_kodi_gui_controls_CSlider
241 /// @brief Returns a float of the percent of the slider.
242 ///
243 /// @return float - Percent of slider
244 ///
245 /// @note Percent, floating point or integer are alone possible. Combining
246 /// these different values can be not together and can, therefore, only one
247 /// each can be used.
248 ///
249 float GetPercentage() const
250 {
251 return m_interface->kodi_gui->control_slider->get_percentage(m_interface->kodiBase,
252 m_controlHandle);
253 }
254 //--------------------------------------------------------------------------
255
256 //==========================================================================
257 ///
258 /// \ingroup cpp_kodi_gui_controls_CSlider
259 /// @brief To set the the range as float of slider, e.g. -25.0 is the slider
260 /// start and e.g. +25.0 is the from here defined position where it reach
261 /// the end.
262 ///
263 /// As default is the range 0.0 to 1.0.
264 ///
265 /// The float interval is as default 0.1 and can be changed with
266 /// @ref SetFloatInterval.
267 ///
268 /// @param[in] start Integer start value
269 /// @param[in] end Integer end value
270 ///
271 /// @note Percent, floating point or integer are alone possible. Combining
272 /// these different values can be not together and can, therefore, only
273 /// one each can be used.
274 ///
275 void SetFloatRange(float start, float end)
276 {
277 m_interface->kodi_gui->control_slider->set_float_range(m_interface->kodiBase, m_controlHandle,
278 start, end);
279 }
280 //--------------------------------------------------------------------------
281
282 //==========================================================================
283 ///
284 /// \ingroup cpp_kodi_gui_controls_CSlider
285 /// @brief Set the slider position with the given float value. The Range
286 /// can be defined with a call from \ref SetIntRange before, as default it
287 /// is 0.0 to 1.0.
288 ///
289 /// @param[in] value Position in range to set with float
290 ///
291 /// @note Percent, floating point or integer are alone possible. Combining
292 /// these different values can be not together and can, therefore, only one
293 /// each can be used.
294 ///
295 void SetFloatValue(float value)
296 {
297 m_interface->kodi_gui->control_slider->set_float_value(m_interface->kodiBase, m_controlHandle,
298 value);
299 }
300 //--------------------------------------------------------------------------
301
302 //==========================================================================
303 ///
304 /// \ingroup cpp_kodi_gui_controls_CSlider
305 /// @brief To get the current position as float value.
306 ///
307 /// @return The position as float
308 ///
309 float GetFloatValue() const
310 {
311 return m_interface->kodi_gui->control_slider->get_float_value(m_interface->kodiBase,
312 m_controlHandle);
313 }
314 //--------------------------------------------------------------------------
315
316 //==========================================================================
317 ///
318 /// \ingroup cpp_kodi_gui_controls_CSlider
319 /// @brief To set the interval steps of slider, as default is it 0.1 If it
320 /// becomes changed with this function will a step of the user with the
321 /// value fixed here be executed.
322 ///
323 /// @param[in] interval Intervall step to set.
324 ///
325 /// @note Percent, floating point or integer are alone possible. Combining
326 /// these different values can be not together and can, therefore, only
327 /// one each can be used.
328 ///
329 void SetFloatInterval(float interval)
330 {
331 m_interface->kodi_gui->control_slider->set_float_interval(m_interface->kodiBase,
332 m_controlHandle, interval);
333 }
334 //--------------------------------------------------------------------------
335};
336
337} /* namespace controls */
338} /* namespace gui */
339} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Spin.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Spin.h
deleted file mode 100644
index db8d491..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/Spin.h
+++ /dev/null
@@ -1,365 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_controls_CSpin Control Spin
24 /// \ingroup cpp_kodi_gui
25 /// @brief \cpp_class{ kodi::gui::controls::CSpin }
26 /// **Window control used for cycling up/down controls**
27 ///
28 /// The settings spin control is used in the settings screens for when a list
29 /// of options can be chosen from using up/down arrows. You can choose the
30 /// position, size, and look of the spin control. It is basically a cross
31 /// between the button control and a spin control. It has a label and focus
32 /// and non focus textures, as well as a spin control on the right.
33 ///
34 /// It has the header \ref Spin.h "#include <kodi/gui/controls/Spin.h>"
35 /// be included to enjoy it.
36 ///
37 /// Here you find the needed skin part for a \ref Spin_Control "spin control"
38 ///
39 /// @note The call of the control is only possible from the corresponding
40 /// window as its class and identification number is required.
41 ///
42
43
44 //============================================================================
45 ///
46 /// \ingroup cpp_kodi_gui_controls_CSpin
47 /// @anchor AddonGUISpinControlType
48 /// @brief The values here defines the used value format for steps on
49 /// spin control.
50 ///
51 typedef enum AddonGUISpinControlType
52 {
53 /// One spin step interpreted as integer
54 ADDON_SPIN_CONTROL_TYPE_INT = 1,
55 /// One spin step interpreted as floating point value
56 ADDON_SPIN_CONTROL_TYPE_FLOAT = 2,
57 /// One spin step interpreted as text string
58 ADDON_SPIN_CONTROL_TYPE_TEXT = 3,
59 /// One spin step interpreted as a page change value
60 ADDON_SPIN_CONTROL_TYPE_PAGE = 4
61 } AddonGUISpinControlType;
62 //----------------------------------------------------------------------------
63
64 class ATTRIBUTE_HIDDEN CSpin : public CAddonGUIControlBase
65 {
66 public:
67 //==========================================================================
68 ///
69 /// \ingroup cpp_kodi_gui_controls_CSpin
70 /// @brief Construct a new control
71 ///
72 /// @param[in] window related window control class
73 /// @param[in] controlId Used skin xml control id
74 ///
75 CSpin(CWindow* window, int controlId)
76 : CAddonGUIControlBase(window)
77 {
78 m_controlHandle = m_interface->kodi_gui->window->get_control_spin(m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
79 if (!m_controlHandle)
80 kodi::Log(ADDON_LOG_FATAL, "kodi::gui::controls::CSpin can't create control class from Kodi !!!");
81 }
82 //--------------------------------------------------------------------------
83
84 //==========================================================================
85 ///
86 /// \ingroup cpp_kodi_gui_controls_CSpin
87 /// @brief Destructor
88 ///
89 ~CSpin() override = default;
90 //--------------------------------------------------------------------------
91
92 //==========================================================================
93 ///
94 /// \ingroup cpp_kodi_gui_controls_CSpin
95 /// @brief Set the control on window to visible
96 ///
97 /// @param[in] visible If true visible, otherwise hidden
98 ///
99 void SetVisible(bool visible)
100 {
101 m_interface->kodi_gui->control_spin->set_visible(m_interface->kodiBase, m_controlHandle, visible);
102 }
103 //--------------------------------------------------------------------------
104
105 //==========================================================================
106 ///
107 /// \ingroup cpp_kodi_gui_controls_CSpin
108 /// @brief Set's the control's enabled/disabled state
109 ///
110 /// @param[in] enabled If true enabled, otherwise disabled
111 ///
112 void SetEnabled(bool enabled)
113 {
114 m_interface->kodi_gui->control_spin->set_enabled(m_interface->kodiBase, m_controlHandle, enabled);
115 }
116 //--------------------------------------------------------------------------
117
118 //==========================================================================
119 ///
120 /// \ingroup cpp_kodi_gui_controls_CSpin
121 /// @brief To set the text string on spin control
122 ///
123 /// @param[in] text Text to show as name for spin
124 ///
125 void SetText(const std::string& text)
126 {
127 m_interface->kodi_gui->control_spin->set_text(m_interface->kodiBase, m_controlHandle, text.c_str());
128 }
129 //--------------------------------------------------------------------------
130
131 //==========================================================================
132 ///
133 /// \ingroup cpp_kodi_gui_controls_CSpin
134 /// @brief To reset spin control to defaults
135 ///
136 void Reset()
137 {
138 m_interface->kodi_gui->control_spin->reset(m_interface->kodiBase, m_controlHandle);
139 }
140 //--------------------------------------------------------------------------
141
142 //==========================================================================
143 ///
144 /// \ingroup cpp_kodi_gui_controls_CSpin
145 /// @brief To set the with SpinControlType defined types of spin.
146 ///
147 /// @param[in] type The type to use
148 ///
149 /// @note See description of \ref AddonGUISpinControlType for available types.
150 ///
151 void SetType(AddonGUISpinControlType type)
152 {
153 m_interface->kodi_gui->control_spin->set_type(m_interface->kodiBase, m_controlHandle, (int)type);
154 }
155 //--------------------------------------------------------------------------
156
157 //==========================================================================
158 ///
159 /// \ingroup cpp_kodi_gui_controls_CSpin
160 /// @brief To add a label entry in spin defined with a value as string.
161 ///
162 /// Format must be set to ADDON_SPIN_CONTROL_TYPE_TEXT to use this function.
163 ///
164 /// @param[in] label Label string to view on skin
165 /// @param[in] value String value to use for selection
166 /// of them.
167 ///
168 void AddLabel(const std::string& label, const std::string& value)
169 {
170 m_interface->kodi_gui->control_spin->add_string_label(m_interface->kodiBase, m_controlHandle, label.c_str(), value.c_str());
171 }
172 //--------------------------------------------------------------------------
173
174 //==========================================================================
175 ///
176 /// \ingroup cpp_kodi_gui_controls_CSpin
177 /// @brief To add a label entry in spin defined with a value as integer.
178 ///
179 /// Format must be set to ADDON_SPIN_CONTROL_TYPE_INT to use this function.
180 ///
181 /// @param[in] label Label string to view on skin
182 /// @param[in] value Integer value to use for selection
183 /// of them.
184 ///
185 void AddLabel(const std::string& label, int value)
186 {
187 m_interface->kodi_gui->control_spin->add_int_label(m_interface->kodiBase, m_controlHandle, label.c_str(), value);
188 }
189 //--------------------------------------------------------------------------
190
191 //==========================================================================
192 ///
193 /// \ingroup cpp_kodi_gui_controls_CSpin
194 /// @brief To change the spin to position with them string as value.
195 ///
196 /// Format must be set to ADDON_SPIN_CONTROL_TYPE_TEXT to use this function.
197 ///
198 /// @param[in] value String value to change to
199 ///
200 void SetStringValue(const std::string& value)
201 {
202 m_interface->kodi_gui->control_spin->set_string_value(m_interface->kodiBase, m_controlHandle, value.c_str());
203 }
204 //--------------------------------------------------------------------------
205
206 //==========================================================================
207 ///
208 /// \ingroup cpp_kodi_gui_controls_CSpin
209 /// @brief To get the current spin control position with text string value.
210 ///
211 /// Format must be set to ADDON_SPIN_CONTROL_TYPE_TEXT to use this function.
212 ///
213 /// @return Currently selected string value
214 ///
215 std::string GetStringValue() const
216 {
217 std::string value;
218 char* ret = m_interface->kodi_gui->control_spin->get_string_value(m_interface->kodiBase, m_controlHandle);
219 if (ret != nullptr)
220 {
221 if (std::strlen(ret))
222 value = ret;
223 m_interface->free_string(m_interface->kodiBase, ret);
224 }
225 return value;
226 }
227 //--------------------------------------------------------------------------
228
229 //==========================================================================
230 ///
231 /// \ingroup cpp_kodi_gui_controls_CSpin
232 /// @brief To set the the range as integer of slider, e.g. -10 is the slider
233 /// start and e.g. +10 is the from here defined position where it reach the
234 /// end.
235 ///
236 /// Ad default is the range from 0 to 100.
237 ///
238 /// @param[in] start Integer start value
239 /// @param[in] end Integer end value
240 ///
241 /// @note Percent, floating point or integer are alone possible. Combining
242 /// these different values can be not together and can, therefore, only
243 /// one each can be used and must be defined with \ref SetType before.
244 ///
245 void SetIntRange(int start, int end)
246 {
247 m_interface->kodi_gui->control_spin->set_int_range(m_interface->kodiBase, m_controlHandle, start, end);
248 }
249 //--------------------------------------------------------------------------
250
251 //==========================================================================
252 ///
253 /// \ingroup cpp_kodi_gui_controls_CSpin
254 /// @brief Set the slider position with the given integer value. The Range
255 /// must be defined with a call from \ref SetIntRange before.
256 ///
257 /// @param[in] value Position in range to set with integer
258 ///
259 /// @note Percent, floating point or integer are alone possible. Combining
260 /// these different values can be not together and can, therefore, only
261 /// one each can be used and must be defined with \ref SetType before.
262 ///
263 void SetIntValue(int value)
264 {
265 m_interface->kodi_gui->control_spin->set_int_value(m_interface->kodiBase, m_controlHandle, value);
266 }
267 //--------------------------------------------------------------------------
268
269 //==========================================================================
270 ///
271 /// \ingroup cpp_kodi_gui_controls_CSpin
272 /// @brief To get the current position as integer value.
273 ///
274 /// @return The position as integer
275 ///
276 /// @note Percent, floating point or integer are alone possible. Combining
277 /// these different values can be not together and can, therefore, only
278 /// one each can be used and must be defined with \ref SetType before.
279 ///
280 int GetIntValue() const
281 {
282 return m_interface->kodi_gui->control_spin->get_int_value(m_interface->kodiBase, m_controlHandle);
283 }
284 //--------------------------------------------------------------------------
285
286 //==========================================================================
287 ///
288 /// \ingroup cpp_kodi_gui_controls_CSpin
289 /// @brief To set the the range as float of spin, e.g. -25.0 is the spin
290 /// start and e.g. +25.0 is the from here defined position where it reach
291 /// the end.
292 ///
293 /// As default is the range 0.0 to 1.0.
294 ///
295 /// The float interval is as default 0.1 and can be changed with
296 /// @ref SetFloatInterval.
297 ///
298 /// @param[in] start Integer start value
299 /// @param[in] end Integer end value
300 ///
301 /// @note Percent, floating point or integer are alone possible. Combining
302 /// these different values can be not together and can, therefore, only
303 /// one each can be used and must be defined with \ref SetType before.
304 ///
305 void SetFloatRange(float start, float end)
306 {
307 m_interface->kodi_gui->control_spin->set_float_range(m_interface->kodiBase, m_controlHandle, start, end);
308 }
309 //--------------------------------------------------------------------------
310
311 //==========================================================================
312 ///
313 /// \ingroup cpp_kodi_gui_controls_CSpin
314 /// @brief Set the spin position with the given float value. The Range
315 /// can be defined with a call from \ref SetIntRange before, as default it
316 /// is 0.0 to 1.0.
317 ///
318 /// @param[in] value Position in range to set with float
319 ///
320 /// @note Percent, floating point or integer are alone possible. Combining
321 /// these different values can be not together and can, therefore, only
322 /// one each can be used and must be defined with \ref SetType before.
323 ///
324 void SetFloatValue(float value)
325 {
326 m_interface->kodi_gui->control_spin->set_float_value(m_interface->kodiBase, m_controlHandle, value);
327 }
328 //--------------------------------------------------------------------------
329
330 //==========================================================================
331 ///
332 /// \ingroup cpp_kodi_gui_controls_CSpin
333 /// @brief To get the current position as float value.
334 ///
335 /// @return The position as float
336 ///
337 float GetFloatValue() const
338 {
339 return m_interface->kodi_gui->control_spin->get_float_value(m_interface->kodiBase, m_controlHandle);
340 }
341 //--------------------------------------------------------------------------
342
343 //==========================================================================
344 ///
345 /// \ingroup cpp_kodi_gui_controls_CSpin
346 /// @brief To set the interval steps of spin, as default is it 0.1 If it
347 /// becomes changed with this function will a step of the user with the
348 /// value fixed here be executed.
349 ///
350 /// @param[in] interval Intervall step to set.
351 ///
352 /// @note Percent, floating point or integer are alone possible. Combining
353 /// these different values can be not together and can, therefore, only
354 /// one each can be used and must be defined with \ref SetType before.
355 ///
356 void SetFloatInterval(float interval)
357 {
358 m_interface->kodi_gui->control_spin->set_float_interval(m_interface->kodiBase, m_controlHandle, interval);
359 }
360 //--------------------------------------------------------------------------
361 };
362
363} /* namespace controls */
364} /* namespace gui */
365} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/TextBox.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/TextBox.h
deleted file mode 100644
index b4e8ae0..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/controls/TextBox.h
+++ /dev/null
@@ -1,168 +0,0 @@
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 "../../AddonBase.h"
12#include "../Window.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace controls
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_controls_CTextBox Control Text Box
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::controls::CTextBox }
26/// **Used to show a multi-page piece of text**
27///
28/// The text box control can be used to display descriptions, help texts or
29/// other larger texts. It corresponds to the representation which is also to
30/// be seen on the CDialogTextViewer.
31///
32/// It has the header \ref TextBox.h "#include <kodi/gui/controls/TextBox.h>"
33/// be included to enjoy it.
34///
35/// Here you find the needed skin part for a \ref Text_Box "textbox control".
36///
37/// @note The call of the control is only possible from the corresponding
38/// window as its class and identification number is required.
39///
40class ATTRIBUTE_HIDDEN CTextBox : public CAddonGUIControlBase
41{
42public:
43 //==========================================================================
44 ///
45 /// \ingroup cpp_kodi_gui_controls_CTextBox
46 /// @brief Construct a new control
47 ///
48 /// @param[in] window related window control class
49 /// @param[in] controlId Used skin xml control id
50 ///
51 CTextBox(CWindow* window, int controlId) : CAddonGUIControlBase(window)
52 {
53 m_controlHandle = m_interface->kodi_gui->window->get_control_text_box(
54 m_interface->kodiBase, m_Window->GetControlHandle(), controlId);
55 if (!m_controlHandle)
56 kodi::Log(ADDON_LOG_FATAL,
57 "kodi::gui::controls::CTextBox can't create control class from Kodi !!!");
58 }
59 //--------------------------------------------------------------------------
60
61 //==========================================================================
62 ///
63 /// \ingroup cpp_kodi_gui_controls_CTextBox
64 /// @brief Destructor
65 ///
66 ~CTextBox() override = default;
67 //--------------------------------------------------------------------------
68
69 //==========================================================================
70 ///
71 /// \ingroup cpp_kodi_gui_controls_CTextBox
72 /// @brief Set the control on window to visible
73 ///
74 /// @param[in] visible If true visible, otherwise hidden
75 ///
76 void SetVisible(bool visible)
77 {
78 m_interface->kodi_gui->control_text_box->set_visible(m_interface->kodiBase, m_controlHandle,
79 visible);
80 }
81 //--------------------------------------------------------------------------
82
83 //==========================================================================
84 ///
85 /// \ingroup cpp_kodi_gui_controls_CTextBox
86 /// @brief To reset box an remove all the text
87 ///
88 void Reset() { m_interface->kodi_gui->control_text_box->reset(m_controlHandle, m_controlHandle); }
89 //--------------------------------------------------------------------------
90
91 //==========================================================================
92 ///
93 /// \ingroup cpp_kodi_gui_controls_CTextBox
94 /// @brief To set the text on box
95 ///
96 /// @param[in] text Text to show
97 ///
98 void SetText(const std::string& text)
99 {
100 m_interface->kodi_gui->control_text_box->set_text(m_interface->kodiBase, m_controlHandle,
101 text.c_str());
102 }
103 //--------------------------------------------------------------------------
104
105 //==========================================================================
106 ///
107 /// \ingroup cpp_kodi_gui_controls_CTextBox
108 /// @brief Get the used text from control
109 ///
110 /// @return Text shown
111 ///
112 std::string GetText() const
113 {
114 std::string text;
115 char* ret =
116 m_interface->kodi_gui->control_text_box->get_text(m_interface->kodiBase, m_controlHandle);
117 if (ret != nullptr)
118 {
119 if (std::strlen(ret))
120 text = ret;
121 m_interface->free_string(m_interface->kodiBase, ret);
122 }
123 return text;
124 }
125 //--------------------------------------------------------------------------
126
127 //==========================================================================
128 ///
129 /// \ingroup cpp_kodi_gui_controls_CTextBox
130 /// @brief To scroll text on other position
131 ///
132 /// @param[in] position The line position to scroll to
133 ///
134 void Scroll(unsigned int position)
135 {
136 m_interface->kodi_gui->control_text_box->scroll(m_interface->kodiBase, m_controlHandle,
137 position);
138 }
139 //--------------------------------------------------------------------------
140
141 //==========================================================================
142 ///
143 /// \ingroup cpp_kodi_gui_controls_CTextBox
144 /// @brief To set automatic scrolling of textbox
145 ///
146 /// Specifies the timing and conditions of any autoscrolling this textbox
147 /// should have. Times are in milliseconds. The content is delayed for the
148 /// given delay, then scrolls at a rate of one line per time interval until
149 /// the end. If the repeat tag is present, it then delays for the repeat
150 /// time, fades out over 1 second, and repeats. It does not wrap or reset
151 /// to the top at the end of the scroll.
152 ///
153 /// @param[in] delay Content delay
154 /// @param[in] time One line per time interval
155 /// @param[in] repeat Delays with given time, fades out over 1
156 /// second, and repeats
157 ///
158 void SetAutoScrolling(int delay, int time, int repeat)
159 {
160 m_interface->kodi_gui->control_text_box->set_auto_scrolling(
161 m_interface->kodiBase, m_controlHandle, delay, time, repeat);
162 }
163 //--------------------------------------------------------------------------
164};
165
166} /* namespace controls */
167} /* namespace gui */
168} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h
deleted file mode 100644
index 4eb64c7..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h
+++ /dev/null
@@ -1,433 +0,0 @@
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 <string>
12#include <time.h>
13
14/*
15 * Internal Structures to have "C"-Style data transfer
16 */
17extern "C"
18{
19
20typedef struct AddonToKodiFuncTable_kodi_gui_general
21{
22 void (*lock)();
23 void (*unlock)();
24 int (*get_screen_height)(void* kodiBase);
25 int (*get_screen_width)(void* kodiBase);
26 int (*get_video_resolution)(void* kodiBase);
27 int (*get_current_window_dialog_id)(void* kodiBase);
28 int (*get_current_window_id)(void* kodiBase);
29 void* (*get_hw_context)(void* kodiBase);
30} AddonToKodiFuncTable_kodi_gui_general;
31
32typedef struct AddonToKodiFuncTable_kodi_gui_control_button
33{
34 void (*set_visible)(void* kodiBase, void* handle, bool visible);
35 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
36 void (*set_label)(void* kodiBase, void* handle, const char* label);
37 char* (*get_label)(void* kodiBase, void* handle);
38 void (*set_label2)(void* kodiBase, void* handle, const char *label);
39 char* (*get_label2)(void* kodiBase, void* handle);
40} AddonToKodiFuncTable_kodi_gui_control_button;
41
42typedef struct AddonToKodiFuncTable_kodi_gui_control_edit
43{
44 void (*set_visible)(void* kodiBase, void* handle, bool visible);
45 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
46 void (*set_label)(void* kodiBase, void* handle, const char* label);
47 char* (*get_label)(void* kodiBase, void* handle);
48 void (*set_text)(void* kodiBase, void* handle, const char* text);
49 char* (*get_text)(void* kodiBase, void* handle);
50 void (*set_cursor_position)(void* kodiBase, void* handle, unsigned int position);
51 unsigned int (*get_cursor_position)(void* kodiBase, void* handle);
52 void (*set_input_type)(void* kodiBase, void* handle, int type, const char* heading);
53} AddonToKodiFuncTable_kodi_gui_control_edit;
54
55typedef struct AddonToKodiFuncTable_kodi_gui_control_fade_label
56{
57 void (*set_visible)(void* kodiBase, void* handle, bool visible);
58 void (*add_label)(void* kodiBase, void* handle, const char* text);
59 char* (*get_label)(void* kodiBase, void* handle);
60 void (*set_scrolling)(void* kodiBase, void* handle, bool scroll);
61 void (*reset)(void* kodiBase, void* handle);
62} AddonToKodiFuncTable_kodi_gui_control_fade_label;
63
64typedef struct AddonToKodiFuncTable_kodi_gui_control_image
65{
66 void (*set_visible)(void* kodiBase, void* handle, bool visible);
67 void (*set_filename)(void* kodiBase, void* handle, const char* filename, bool use_cache);
68 void (*set_color_diffuse)(void* kodiBase, void* handle, uint32_t color_diffuse);
69} AddonToKodiFuncTable_kodi_gui_control_image;
70
71typedef struct AddonToKodiFuncTable_kodi_gui_control_label
72{
73 void (*set_visible)(void* kodiBase, void* handle, bool visible);
74 void (*set_label)(void* kodiBase, void* handle, const char* text);
75 char* (*get_label)(void* kodiBase, void* handle);
76} AddonToKodiFuncTable_kodi_gui_control_label;
77
78typedef struct AddonToKodiFuncTable_kodi_gui_control_progress
79{
80 void (*set_visible)(void* kodiBase, void* handle, bool visible);
81 void (*set_percentage)(void* kodiBase, void* handle, float percent);
82 float (*get_percentage)(void* kodiBase, void* handle);
83} AddonToKodiFuncTable_kodi_gui_control_progress;
84
85typedef struct AddonToKodiFuncTable_kodi_gui_control_radio_button
86{
87 void (*set_visible)(void* kodiBase, void* handle, bool visible);
88 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
89 void (*set_label)(void* kodiBase, void* handle, const char* text);
90 char* (*get_label)(void* kodiBase, void* handle);
91 void (*set_selected)(void* kodiBase, void* handle, bool selected);
92 bool (*is_selected)(void* kodiBase, void* handle);
93} AddonToKodiFuncTable_kodi_gui_control_radio_button;
94
95typedef struct AddonToKodiFuncTable_kodi_gui_control_rendering
96{
97 void (*set_callbacks)(void* kodiBase, void* handle, void* clienthandle,
98 bool (*createCB)(void*,int,int,int,int,void*),
99 void (*renderCB)(void*),
100 void (*stopCB)(void*),
101 bool (*dirtyCB)(void*));
102 void (*destroy)(void *kodiBase, void* handle);
103} AddonToKodiFuncTable_kodi_gui_control_rendering;
104
105typedef struct AddonToKodiFuncTable_kodi_gui_control_settings_slider
106{
107 void (*set_visible)(void* kodiBase, void* handle, bool visible);
108 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
109 void (*set_text)(void* kodiBase, void* handle, const char* label);
110 void (*reset)(void* kodiBase, void* handle);
111 void (*set_int_range)(void* kodiBase, void* handle, int start, int end);
112 void (*set_int_value)(void* kodiBase, void* handle, int value);
113 int (*get_int_value)(void* kodiBase, void* handle);
114 void (*set_int_interval)(void* kodiBase, void* handle, int interval);
115 void (*set_percentage)(void* kodiBase, void* handle, float percent);
116 float (*get_percentage)(void* kodiBase, void* handle);
117 void (*set_float_range)(void* kodiBase, void* handle, float start, float end);
118 void (*set_float_value)(void* kodiBase, void* handle, float value);
119 float (*get_float_value)(void* kodiBase, void* handle);
120 void (*set_float_interval)(void* kodiBase, void* handle, float interval);
121} AddonToKodiFuncTable_kodi_gui_control_settings_slider;
122
123typedef struct AddonToKodiFuncTable_kodi_gui_control_slider
124{
125 void (*set_visible)(void* kodiBase, void* handle, bool visible);
126 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
127 void (*reset)(void* kodiBase, void* handle);
128 char* (*get_description)(void* kodiBase, void* handle);
129 void (*set_int_range)(void* kodiBase, void* handle, int start, int end);
130 void (*set_int_value)(void* kodiBase, void* handle, int value);
131 int (*get_int_value)(void* kodiBase, void* handle);
132 void (*set_int_interval)(void* kodiBase, void* handle, int interval);
133 void (*set_percentage)(void* kodiBase, void* handle, float percent);
134 float (*get_percentage)(void* kodiBase, void* handle);
135 void (*set_float_range)(void* kodiBase, void* handle, float start, float end);
136 void (*set_float_value)(void* kodiBase, void* handle, float value);
137 float (*get_float_value)(void* kodiBase, void* handle);
138 void (*set_float_interval)(void* kodiBase, void* handle, float interval);
139} AddonToKodiFuncTable_kodi_gui_control_slider;
140
141typedef struct AddonToKodiFuncTable_kodi_gui_control_spin
142{
143 void (*set_visible)(void* kodiBase, void* handle, bool visible);
144 void (*set_enabled)(void* kodiBase, void* handle, bool enabled);
145 void (*set_text)(void* kodiBase, void* handle, const char* text);
146 void (*reset)(void* kodiBase, void* handle);
147 void (*set_type)(void* kodiBase, void* handle, int type);
148 void (*add_string_label)(void* kodiBase, void* handle, const char* label, const char* value);
149 void (*set_string_value)(void* kodiBase, void* handle, const char* value);
150 char* (*get_string_value)(void* kodiBase, void* handle);
151 void (*add_int_label)(void* kodiBase, void* handle, const char* label, int value);
152 void (*set_int_range)(void* kodiBase, void* handle, int start, int end);
153 void (*set_int_value)(void* kodiBase, void* handle, int value);
154 int (*get_int_value)(void* kodiBase, void* handle);
155 void (*set_float_range)(void* kodiBase, void* handle, float start, float end);
156 void (*set_float_value)(void* kodiBase, void* handle, float value);
157 float (*get_float_value)(void* kodiBase, void* handle);
158 void (*set_float_interval)(void* kodiBase, void* handle, float interval);
159} AddonToKodiFuncTable_kodi_gui_control_spin;
160
161typedef struct AddonToKodiFuncTable_kodi_gui_control_text_box
162{
163 void (*set_visible)(void* kodiBase, void* handle, bool visible);
164 void (*reset)(void* kodiBase, void* handle);
165 void (*set_text)(void* kodiBase, void* handle, const char* text);
166 char* (*get_text)(void* kodiBase, void* handle);
167 void (*scroll)(void* kodiBase, void* handle, unsigned int scroll);
168 void (*set_auto_scrolling)(void* kodiBase, void* handle, int delay, int time, int repeat);
169} AddonToKodiFuncTable_kodi_gui_control_text_box;
170
171typedef struct AddonToKodiFuncTable_kodi_gui_dialogContextMenu
172{
173 int (*open)(void* kodiBase, const char *heading, const char *entries[], unsigned int size);
174} AddonToKodiFuncTable_kodi_gui_dialogContextMenu;
175
176typedef struct AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress
177{
178 void* (*new_dialog)(void* kodiBase, const char *title);
179 void (*delete_dialog)(void* kodiBase, void* handle);
180 char* (*get_title)(void* kodiBase, void* handle);
181 void (*set_title)(void* kodiBase, void* handle, const char *title);
182 char* (*get_text)(void* kodiBase, void* handle);
183 void (*set_text)(void* kodiBase, void* handle, const char *text);
184 bool (*is_finished)(void* kodiBase, void* handle);
185 void (*mark_finished)(void* kodiBase, void* handle);
186 float (*get_percentage)(void* kodiBase, void* handle);
187 void (*set_percentage)(void* kodiBase, void* handle, float percentage);
188 void (*set_progress)(void* kodiBase, void* handle, int currentItem, int itemCount);
189} AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress;
190
191typedef struct AddonToKodiFuncTable_kodi_gui_dialogFileBrowser
192{
193 bool (*show_and_get_directory)(void* kodiBase, const char* shares, const char* heading, const char* path_in, char** path_out, bool writeOnly);
194 bool (*show_and_get_file)(void* kodiBase, const char* shares, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories);
195 bool (*show_and_get_file_from_dir)(void* kodiBase, const char* directory, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories, bool singleList);
196 bool (*show_and_get_file_list)(void* kodiBase, const char* shares, const char* mask, const char* heading, char*** file_list, unsigned int* entries, bool use_thumbs, bool use_file_directories);
197 bool (*show_and_get_source)(void* kodiBase, const char* path_in, char** path_out, bool allow_network_shares, const char* additional_share, const char* type);
198 bool (*show_and_get_image)(void* kodiBase, const char* shares, const char* heading, const char* path_in, char** path_out);
199 bool (*show_and_get_image_list)(void* kodiBase, const char* shares, const char* heading, char*** file_list, unsigned int* entries);
200 void (*clear_file_list)(void* kodiBase, char*** file_list, unsigned int entries);
201} AddonToKodiFuncTable_kodi_gui_dialogFileBrowser;
202
203// typedef void (*char_callback_t) (CGUIKeyboard *ref, const std::string &typedString);
204
205typedef struct AddonToKodiFuncTable_kodi_gui_dialogKeyboard
206{
207 bool (*show_and_get_input_with_head)(void* kodiBase, const char* text_in, char** text_out, const char* heading, bool allow_empty_result, bool hiddenInput, unsigned int auto_close_ms);
208 bool (*show_and_get_input)(void* kodiBase, const char* text_in, char** text_out, bool allow_empty_result, unsigned int auto_close_ms);
209 bool (*show_and_get_new_password_with_head)(void* kodiBase, const char* password_in, char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms);
210 bool (*show_and_get_new_password)(void* kodiBase, const char* password_in, char** password_out, unsigned int auto_close_ms);
211 bool (*show_and_verify_new_password_with_head)(void* kodiBase, char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms);
212 bool (*show_and_verify_new_password)(void* kodiBase, char** password_out, unsigned int auto_close_ms);
213 int (*show_and_verify_password)(void* kodiBase, const char* password_in, char** password_out, const char* heading, int retries, unsigned int auto_close_ms);
214 bool (*show_and_get_filter)(void* kodiBase, const char* text_in, char** text_out, bool searching, unsigned int auto_close_ms);
215 bool (*send_text_to_active_keyboard)(void* kodiBase, const char* text, bool close_keyboard);
216 bool (*is_keyboard_activated)(void* kodiBase);
217} AddonToKodiFuncTable_kodi_gui_dialogKeyboard;
218
219typedef struct AddonToKodiFuncTable_kodi_gui_dialogNumeric
220{
221 bool (*show_and_verify_new_password)(void* kodiBase, char** password);
222 int (*show_and_verify_password)(void* kodiBase, const char* password, const char *heading, int retries);
223 bool (*show_and_verify_input)(void* kodiBase, const char* verify_in, char** verify_out, const char* heading, bool verify_input);
224 bool (*show_and_get_time)(void* kodiBase, tm *time, const char *heading);
225 bool (*show_and_get_date)(void* kodiBase, tm *date, const char *heading);
226 bool (*show_and_get_ip_address)(void* kodiBase, const char* ip_address_in, char** ip_address_out, const char *heading);
227 bool (*show_and_get_number)(void* kodiBase, const char* input_in, char** input_out, const char *heading, unsigned int auto_close_ms);
228 bool (*show_and_get_seconds)(void* kodiBase, const char* time_in, char** time_out, const char *heading);
229} AddonToKodiFuncTable_kodi_gui_dialogNumeric;
230
231typedef struct AddonToKodiFuncTable_kodi_gui_dialogOK
232{
233 void (*show_and_get_input_single_text)(void* kodiBase, const char *heading, const char *text);
234 void (*show_and_get_input_line_text)(void* kodiBase, const char *heading, const char *line0, const char *line1, const char *line2);
235} AddonToKodiFuncTable_kodi_gui_dialogOK;
236
237typedef struct AddonToKodiFuncTable_kodi_gui_dialogProgress
238{
239 void* (*new_dialog)(void* kodiBase);
240 void (*delete_dialog)(void* kodiBase, void* handle);
241 void (*open)(void* kodiBase, void* handle);
242 void (*set_heading)(void* kodiBase, void* handle, const char* heading);
243 void (*set_line)(void* kodiBase, void* handle, unsigned int lineNo, const char* line);
244 void (*set_can_cancel)(void* kodiBase, void* handle, bool canCancel);
245 bool (*is_canceled)(void* kodiBase, void* handle);
246 void (*set_percentage)(void* kodiBase, void* handle, int percentage);
247 int (*get_percentage)(void* kodiBase, void* handle);
248 void (*show_progress_bar)(void* kodiBase, void* handle, bool pnOff);
249 void (*set_progress_max)(void* kodiBase, void* handle, int max);
250 void (*set_progress_advance)(void* kodiBase, void* handle, int nSteps);
251 bool (*abort)(void* kodiBase, void* handle);
252} AddonToKodiFuncTable_kodi_gui_dialogProgress;
253
254typedef struct AddonToKodiFuncTable_kodi_gui_dialogSelect
255{
256 int (*open)(void* kodiBase, const char *heading, const char *entries[], unsigned int size, int selected, unsigned int autoclose);
257 bool (*open_multi_select)(void* kodiBase, const char* heading, const char* entryIDs[], const char* entryNames[],
258 bool entriesSelected[], unsigned int size, unsigned int autoclose);
259} AddonToKodiFuncTable_kodi_gui_dialogSelect;
260
261typedef struct AddonToKodiFuncTable_kodi_gui_dialogTextViewer
262{
263 void (*open)(void* kodiBase, const char *heading, const char *text);
264} AddonToKodiFuncTable_kodi_gui_dialogTextViewer;
265
266typedef struct AddonToKodiFuncTable_kodi_gui_dialogYesNo
267{
268 bool (*show_and_get_input_single_text)(void* kodiBase, const char *heading, const char *text, bool *canceled, const char *noLabel, const char *yesLabel);
269 bool (*show_and_get_input_line_text)(void* kodiBase, const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel);
270 bool (*show_and_get_input_line_button_text)(void* kodiBase, const char *heading, const char *line0, const char *line1, const char *line2, bool *canceled, const char *noLabel, const char *yesLabel);
271} AddonToKodiFuncTable_kodi_gui_dialogYesNo;
272
273typedef struct AddonToKodiFuncTable_kodi_gui_listItem
274{
275 void* (*create)(void* kodiBase, const char* label, const char* label2, const char* icon_image, const char* path);
276 void (*destroy)(void* kodiBase, void* handle);
277 char* (*get_label)(void* kodiBase, void* handle);
278 void (*set_label)(void* kodiBase, void* handle, const char* label);
279 char* (*get_label2)(void* kodiBase, void* handle);
280 void (*set_label2)(void* kodiBase, void* handle, const char* label);
281 char* (*get_art)(void* kodiBase, void* handle, const char* type);
282 void (*set_art)(void* kodiBase, void* handle, const char* type, const char* image);
283 char* (*get_path)(void* kodiBase, void* handle);
284 void (*set_path)(void* kodiBase, void* handle, const char* path);
285 char* (*get_property)(void* kodiBase, void* handle, const char* key);
286 void (*set_property)(void* kodiBase, void* handle, const char* key, const char* value);
287 void (*select)(void* kodiBase, void* handle, bool select);
288 bool (*is_selected)(void* kodiBase, void* handle);
289} AddonToKodiFuncTable_kodi_gui_listItem;
290
291#define ADDON_MAX_CONTEXT_ENTRIES 20
292#define ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH 80
293typedef struct gui_context_menu_pair
294{
295 unsigned int id;
296 char name[ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH];
297} gui_context_menu_pair;
298
299typedef struct AddonToKodiFuncTable_kodi_gui_window
300{
301 /* Window creation functions */
302 void* (*create)(void* kodiBase, const char* xml_filename, const char* default_skin, bool as_dialog, bool is_media);
303 void (*destroy)(void* kodiBase, void* handle);
304 void (*set_callbacks)(void* kodiBase, void* handle, void* clienthandle,
305 bool (*CBInit)(void*),
306 bool (*CBFocus)(void*, int),
307 bool (*CBClick)(void*, int),
308 bool (*CBOnAction)(void*, int, uint32_t, wchar_t),
309 void (*CBGetContextButtons)(void*, int, gui_context_menu_pair*, unsigned int*),
310 bool (*CBOnContextButton)(void*, int, unsigned int));
311 bool (*show)(void* kodiBase, void* handle);
312 bool (*close)(void* kodiBase, void* handle);
313 bool (*do_modal)(void* kodiBase, void* handle);
314
315 /* Window control functions */
316 bool (*set_focus_id)(void* kodiBase, void* handle, int control_id);
317 int (*get_focus_id)(void* kodiBase, void* handle);
318 void (*set_control_label)(void* kodiBase, void* handle, int control_id, const char* label);
319 void (*set_control_visible)(void* kodiBase, void* handle, int control_id, bool visible);
320 void (*set_control_selected)(void* kodiBase, void* handle, int control_id, bool selected);
321
322 /* Window property functions */
323 void (*set_property)(void* kodiBase, void* handle, const char* key, const char* value);
324 void (*set_property_int)(void* kodiBase, void* handle, const char* key, int value);
325 void (*set_property_bool)(void* kodiBase, void* handle, const char* key, bool value);
326 void (*set_property_double)(void* kodiBase, void* handle, const char* key, double value);
327 char* (*get_property)(void* kodiBase, void* handle, const char* key);
328 int (*get_property_int)(void* kodiBase, void* handle, const char* key);
329 bool (*get_property_bool)(void* kodiBase, void* handle, const char* key);
330 double (*get_property_double)(void* kodiBase, void* handle, const char* key);
331 void (*clear_properties)(void* kodiBase, void* handle);
332 void (*clear_property)(void* kodiBase, void* handle, const char* key);
333
334 /* List item functions */
335 void (*clear_item_list)(void* kodiBase, void* handle);
336 void (*add_list_item)(void* kodiBase, void* handle, void* item, int list_position);
337 void (*remove_list_item_from_position)(void* kodiBase, void* handle, int list_position);
338 void (*remove_list_item)(void* kodiBase, void* handle, void* item);
339 void* (*get_list_item)(void* kodiBase, void* handle, int list_position);
340 void (*set_current_list_position)(void* kodiBase, void* handle, int list_position);
341 int (*get_current_list_position)(void* kodiBase, void* handle);
342 int (*get_list_size)(void* kodiBase, void* handle);
343 void (*set_container_property)(void* kodiBase, void* handle, const char* key, const char* value);
344 void (*set_container_content)(void* kodiBase, void* handle, const char* value);
345 int (*get_current_container_id)(void* kodiBase, void* handle);
346
347 /* Various functions */
348 void (*mark_dirty_region)(void* kodiBase, void* handle);
349
350 /* GUI control access functions */
351 void* (*get_control_button)(void* kodiBase, void* handle, int control_id);
352 void* (*get_control_edit)(void* kodiBase, void* handle, int control_id);
353 void* (*get_control_fade_label)(void* kodiBase, void* handle, int control_id);
354 void* (*get_control_image)(void* kodiBase, void* handle, int control_id);
355 void* (*get_control_label)(void* kodiBase, void* handle, int control_id);
356 void* (*get_control_progress)(void* kodiBase, void* handle, int control_id);
357 void* (*get_control_radio_button)(void* kodiBase, void* handle, int control_id);
358 void* (*get_control_render_addon)(void* kodiBase, void* handle, int control_id);
359 void* (*get_control_settings_slider)(void* kodiBase, void* handle, int control_id);
360 void* (*get_control_slider)(void* kodiBase, void* handle, int control_id);
361 void* (*get_control_spin)(void* kodiBase, void* handle, int control_id);
362 void* (*get_control_text_box)(void* kodiBase, void* handle, int control_id);
363 void* (*get_control_dummy1)(void* kodiBase, void* handle, int control_id);
364 void* (*get_control_dummy2)(void* kodiBase, void* handle, int control_id);
365 void* (*get_control_dummy3)(void* kodiBase, void* handle, int control_id);
366 void* (*get_control_dummy4)(void* kodiBase, void* handle, int control_id);
367 void* (*get_control_dummy5)(void* kodiBase, void* handle, int control_id);
368 void* (*get_control_dummy6)(void* kodiBase, void* handle, int control_id);
369 void* (*get_control_dummy7)(void* kodiBase, void* handle, int control_id);
370 void* (*get_control_dummy8)(void* kodiBase, void* handle, int control_id);
371 void* (*get_control_dummy9)(void* kodiBase, void* handle, int control_id);
372 void* (*get_control_dummy10)(void* kodiBase, void* handle, int control_id); /* This and above used to add new get_control_* functions */
373} AddonToKodiFuncTable_kodi_gui_window;
374
375typedef struct AddonToKodiFuncTable_kodi_gui
376{
377 AddonToKodiFuncTable_kodi_gui_general* general;
378 AddonToKodiFuncTable_kodi_gui_control_button* control_button;
379 AddonToKodiFuncTable_kodi_gui_control_edit* control_edit;
380 AddonToKodiFuncTable_kodi_gui_control_fade_label* control_fade_label;
381 AddonToKodiFuncTable_kodi_gui_control_label* control_label;
382 AddonToKodiFuncTable_kodi_gui_control_image* control_image;
383 AddonToKodiFuncTable_kodi_gui_control_progress* control_progress;
384 AddonToKodiFuncTable_kodi_gui_control_radio_button* control_radio_button;
385 AddonToKodiFuncTable_kodi_gui_control_rendering* control_rendering;
386 AddonToKodiFuncTable_kodi_gui_control_settings_slider* control_settings_slider;
387 AddonToKodiFuncTable_kodi_gui_control_slider* control_slider;
388 AddonToKodiFuncTable_kodi_gui_control_spin* control_spin;
389 AddonToKodiFuncTable_kodi_gui_control_text_box* control_text_box;
390 void* control_dummy1;
391 void* control_dummy2;
392 void* control_dummy3;
393 void* control_dummy4;
394 void* control_dummy5;
395 void* control_dummy6;
396 void* control_dummy7;
397 void* control_dummy8;
398 void* control_dummy9;
399 void* control_dummy10; /* This and above used to add new controls */
400 AddonToKodiFuncTable_kodi_gui_dialogContextMenu* dialogContextMenu;
401 AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress* dialogExtendedProgress;
402 AddonToKodiFuncTable_kodi_gui_dialogFileBrowser* dialogFileBrowser;
403 AddonToKodiFuncTable_kodi_gui_dialogKeyboard* dialogKeyboard;
404 AddonToKodiFuncTable_kodi_gui_dialogNumeric* dialogNumeric;
405 AddonToKodiFuncTable_kodi_gui_dialogOK* dialogOK;
406 AddonToKodiFuncTable_kodi_gui_dialogProgress* dialogProgress;
407 AddonToKodiFuncTable_kodi_gui_dialogSelect* dialogSelect;
408 AddonToKodiFuncTable_kodi_gui_dialogTextViewer* dialogTextViewer;
409 AddonToKodiFuncTable_kodi_gui_dialogYesNo* dialogYesNo;
410 void* dialog_dummy1;
411 void* dialog_dummy2;
412 void* dialog_dummy3;
413 void* dialog_dummy4;
414 void* dialog_dummy5;
415 void* dialog_dummy6;
416 void* dialog_dummy7;
417 void* dialog_dummy8;
418 void* dialog_dummy9;
419 void* dialog_dummy10; /* This and above used to add new dialogs */
420 AddonToKodiFuncTable_kodi_gui_listItem* listItem;
421 AddonToKodiFuncTable_kodi_gui_window* window;
422} AddonToKodiFuncTable_kodi_gui;
423
424} /* extern "C" */
425
426//============================================================================
427///
428/// \ingroup cpp_kodi_gui_CControlRendering_Defs cpp_kodi_gui_CWindow_Defs
429/// @{
430/// @brief Handle to use as independent pointer for GUI
431typedef void* GUIHANDLE;
432/// @}
433//----------------------------------------------------------------------------
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt
deleted file mode 100644
index 7227343..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
1set(HEADERS ContextMenu.h
2 ExtendedProgress.h
3 FileBrowser.h
4 Keyboard.h
5 Numeric.h
6 OK.h
7 Progress.h
8 Select.h
9 TextViewer.h
10 YesNo.h)
11
12if(NOT ENABLE_STATIC_LIBS)
13 core_add_library(addons_kodi-addon-dev-kit_include_kodi_gui_dialogs)
14endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h
deleted file mode 100644
index d545030..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h
+++ /dev/null
@@ -1,185 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_ContextMenu Dialog Context Menu
24 /// \ingroup cpp_kodi_gui
25 /// @brief \cpp_namespace{ kodi::gui::dialogs::ContextMenu }
26 /// **Context menu dialog**
27 ///
28 /// The function listed below permits the call of a dialogue as context menu to
29 /// select of an entry as a key
30 ///
31 /// It has the header \ref ContextMenu.h "#include <kodi/gui/dialogs/ContextMenu.h>"
32 /// be included to enjoy it.
33 ///
34 ///
35 namespace ContextMenu
36 {
37 //==========================================================================
38 ///
39 /// \ingroup cpp_kodi_gui_dialogs_ContextMenu
40 /// @brief Show a context menu dialog about given parts.
41 ///
42 /// @param[in] heading Dialog heading name
43 /// @param[in] entries String list about entries
44 /// @return The selected entry, if return <tt>-1</tt> was nothing selected or canceled
45 ///
46 ///
47 ///-------------------------------------------------------------------------
48 ///
49 /// **Example:**
50 /// ~~~~~~~~~~~~~{.cpp}
51 /// #include <kodi/gui/dialogs/ContextMenu.h>
52 ///
53 /// const std::vector<std::string> entries
54 /// {
55 /// "Test 1",
56 /// "Test 2",
57 /// "Test 3",
58 /// "Test 4",
59 /// "Test 5"
60 /// };
61 ///
62 /// int selected = kodi::gui::dialogs::ContextMenu::Show("Test selection", entries);
63 /// if (selected < 0)
64 /// fprintf(stderr, "Item selection canceled\n");
65 /// else
66 /// fprintf(stderr, "Selected item is: %i\n", selected);
67 /// ~~~~~~~~~~~~~
68 ///
69 inline int ATTRIBUTE_HIDDEN Show(const std::string& heading,
70 const std::vector<std::string>& entries)
71 {
72 using namespace ::kodi::addon;
73 unsigned int size = static_cast<unsigned int>(entries.size());
74 const char** cEntries = static_cast<const char**>(malloc(size * sizeof(const char**)));
75 for (unsigned int i = 0; i < size; ++i)
76 {
77 cEntries[i] = entries[i].c_str();
78 }
79 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open(
80 CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size);
81 free(cEntries);
82 return ret;
83 }
84 //--------------------------------------------------------------------------
85
86 //==========================================================================
87 ///
88 /// \ingroup cpp_kodi_gui_dialogs_ContextMenu
89 /// @brief Show a context menu dialog about given parts.
90 ///
91 /// @param[in] heading Dialog heading name
92 /// @param[in] entries String list about entries
93 /// @return The selected entry, if return <tt>-1</tt> was nothing selected or canceled
94 ///
95 ///
96 ///-------------------------------------------------------------------------
97 ///
98 /// **Example:**
99 /// ~~~~~~~~~~~~~{.cpp}
100 /// #include <kodi/gui/dialogs/ContextMenu.h>
101 ///
102 /// const std::vector<std::pair<std::string, std::string>> entries
103 /// {
104 /// { "ID 1", "Test 1" },
105 /// { "ID 2", "Test 2" },
106 /// { "ID 3", "Test 3" },
107 /// { "ID 4", "Test 4" },
108 /// { "ID 5", "Test 5" }
109 /// };
110 ///
111 /// int selected = kodi::gui::dialogs::ContextMenu::Show("Test selection", entries);
112 /// if (selected < 0)
113 /// fprintf(stderr, "Item selection canceled\n");
114 /// else
115 /// fprintf(stderr, "Selected item is: %i\n", selected);
116 /// ~~~~~~~~~~~~~
117 ///
118 inline int ATTRIBUTE_HIDDEN Show(
119 const std::string& heading, const std::vector<std::pair<std::string, std::string>>& entries)
120 {
121 using namespace ::kodi::addon;
122 unsigned int size = static_cast<unsigned int>(entries.size());
123 const char** cEntries = static_cast<const char**>(malloc(size*sizeof(const char**)));
124 for (unsigned int i = 0; i < size; ++i)
125 {
126 cEntries[i] = entries[i].second.c_str();
127 }
128 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size);
129 free(cEntries);
130 return ret;
131 }
132 //--------------------------------------------------------------------------
133
134 //==========================================================================
135 ///
136 /// \ingroup cpp_kodi_gui_dialogs_ContextMenu
137 /// @brief Show a context menu dialog about given parts.
138 ///
139 /// @param[in] heading Dialog heading name
140 /// @param[in] entries String list about entries
141 /// @return The selected entry, if return <tt>-1</tt> was nothing selected or canceled
142 ///
143 ///
144 ///-------------------------------------------------------------------------
145 ///
146 /// **Example:**
147 /// ~~~~~~~~~~~~~{.cpp}
148 /// #include <kodi/gui/dialogs/ContextMenu.h>
149 ///
150 /// const std::vector<std::pair<int, std::string>> entries
151 /// {
152 /// { 1, "Test 1" },
153 /// { 2, "Test 2" },
154 /// { 3, "Test 3" },
155 /// { 4, "Test 4" },
156 /// { 5, "Test 5" }
157 /// };
158 ///
159 /// int selected = kodi::gui::dialogs::ContextMenu::Show("Test selection", entries);
160 /// if (selected < 0)
161 /// fprintf(stderr, "Item selection canceled\n");
162 /// else
163 /// fprintf(stderr, "Selected item is: %i\n", selected);
164 /// ~~~~~~~~~~~~~
165 ///
166 inline int ATTRIBUTE_HIDDEN Show(const std::string& heading,
167 const std::vector<std::pair<int, std::string>>& entries)
168 {
169 using namespace ::kodi::addon;
170 unsigned int size = static_cast<unsigned int>(entries.size());
171 const char** cEntries = static_cast<const char**>(malloc(size*sizeof(const char**)));
172 for (unsigned int i = 0; i < size; ++i)
173 {
174 cEntries[i] = entries[i].second.c_str();
175 }
176 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size);
177 free(cEntries);
178 return ret;
179 }
180 //--------------------------------------------------------------------------
181 };
182
183} /* namespace dialogs */
184} /* namespace gui */
185} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h
deleted file mode 100644
index 5a49b70..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h
+++ /dev/null
@@ -1,250 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_dialogs_CExtendedProgress Dialog Extended Progress
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::dialogs::ExtendedProgress }
26/// **Progress dialog shown for background work**
27///
28/// The with \ref ExtendedProgress.h "#include <kodi/gui/dialogs/ExtendedProgress.h>"
29/// given class are basically used to create Kodi's extended progress.
30///
31///
32/// --------------------------------------------------------------------------
33///
34/// **Example:**
35/// ~~~~~~~~~~~~~{.cpp}
36/// #include <kodi/gui/dialogs/ExtendedProgress.h>
37///
38/// kodi::gui::dialogs::CExtendedProgress *ext_progress = new kodi::gui::dialogs::CExtendedProgress("Test Extended progress");
39/// ext_progress->SetText("Test progress");
40/// for (unsigned int i = 0; i < 50; i += 10)
41/// {
42/// ext_progress->SetProgress(i, 100);
43/// sleep(1);
44/// }
45///
46/// ext_progress->SetTitle("Test Extended progress - Second round");
47/// ext_progress->SetText("Test progress - Step 2");
48///
49/// for (unsigned int i = 50; i < 100; i += 10)
50/// {
51/// ext_progress->SetProgress(i, 100);
52/// sleep(1);
53/// }
54/// delete ext_progress;
55/// ~~~~~~~~~~~~~
56///
57class ATTRIBUTE_HIDDEN CExtendedProgress
58{
59public:
60 //==========================================================================
61 ///
62 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
63 /// Construct a new dialog
64 ///
65 /// @param[in] title Title string
66 ///
67 explicit CExtendedProgress(const std::string& title = "")
68 {
69 using namespace ::kodi::addon;
70 m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->new_dialog(
71 CAddonBase::m_interface->toKodi->kodiBase, title.c_str());
72 if (!m_DialogHandle)
73 kodi::Log(ADDON_LOG_FATAL,
74 "kodi::gui::CDialogExtendedProgress can't create window class from Kodi !!!");
75 }
76 //--------------------------------------------------------------------------
77
78 //==========================================================================
79 ///
80 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
81 /// Destructor
82 ///
83 ~CExtendedProgress()
84 {
85 using namespace ::kodi::addon;
86 if (m_DialogHandle)
87 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->delete_dialog(
88 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
89 }
90 //--------------------------------------------------------------------------
91
92 //==========================================================================
93 ///
94 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
95 /// @brief Get the used title
96 ///
97 /// @return Title string
98 ///
99 std::string Title() const
100 {
101 using namespace ::kodi::addon;
102 std::string text;
103 char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_title(
104 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
105 if (strMsg != nullptr)
106 {
107 if (std::strlen(strMsg))
108 text = strMsg;
109 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
110 strMsg);
111 }
112 return text;
113 }
114 //--------------------------------------------------------------------------
115
116 //==========================================================================
117 ///
118 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
119 /// @brief To set the title of dialog
120 ///
121 /// @param[in] title Title string
122 ///
123 void SetTitle(const std::string& title)
124 {
125 using namespace ::kodi::addon;
126 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_title(
127 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, title.c_str());
128 }
129 //--------------------------------------------------------------------------
130
131 //==========================================================================
132 ///
133 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
134 /// @brief Get the used text information string
135 ///
136 /// @return Text string
137 ///
138 std::string Text() const
139 {
140 using namespace ::kodi::addon;
141 std::string text;
142 char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_text(
143 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
144 if (strMsg != nullptr)
145 {
146 if (std::strlen(strMsg))
147 text = strMsg;
148 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
149 strMsg);
150 }
151 return text;
152 }
153 //--------------------------------------------------------------------------
154
155 //==========================================================================
156 ///
157 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
158 /// @brief To set the used text information string
159 ///
160 /// @param[in] text information text to set
161 ///
162 void SetText(const std::string& text)
163 {
164 using namespace ::kodi::addon;
165 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_text(
166 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, text.c_str());
167 }
168 //--------------------------------------------------------------------------
169
170 //==========================================================================
171 ///
172 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
173 /// @brief To ask dialog is finished
174 ///
175 /// @return True if on end
176 ///
177 bool IsFinished() const
178 {
179 using namespace ::kodi::addon;
180 return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->is_finished(
181 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
182 }
183 //--------------------------------------------------------------------------
184
185 //==========================================================================
186 ///
187 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
188 /// @brief Mark progress finished
189 ///
190 void MarkFinished()
191 {
192 using namespace ::kodi::addon;
193 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->mark_finished(
194 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
195 }
196 //--------------------------------------------------------------------------
197
198 //==========================================================================
199 ///
200 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
201 /// @brief Get the current progress position as percent
202 ///
203 /// @return Position
204 ///
205 float Percentage() const
206 {
207 using namespace ::kodi::addon;
208 return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_percentage(
209 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
210 }
211 //--------------------------------------------------------------------------
212
213 //==========================================================================
214 ///
215 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
216 /// @brief To set the current progress position as percent
217 ///
218 /// @param[in] percentage Position to use from 0.0 to 100.0
219 ///
220 void SetPercentage(float percentage)
221 {
222 using namespace ::kodi::addon;
223 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_percentage(
224 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage);
225 }
226 //--------------------------------------------------------------------------
227
228 //==========================================================================
229 ///
230 /// \ingroup cpp_kodi_gui_dialogs_CExtendedProgress
231 /// @brief To set progress position with predefined places
232 ///
233 /// @param[in] currentItem Place position to use
234 /// @param[in] itemCount Amount of used places
235 ///
236 void SetProgress(int currentItem, int itemCount)
237 {
238 using namespace ::kodi::addon;
239 CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_progress(
240 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, currentItem, itemCount);
241 }
242 //--------------------------------------------------------------------------
243
244private:
245 void* m_DialogHandle;
246};
247
248} /* namespace dialogs */
249} /* namespace gui */
250} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/FileBrowser.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/FileBrowser.h
deleted file mode 100644
index 90da063..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/FileBrowser.h
+++ /dev/null
@@ -1,310 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_FileBrowser Dialog File Browser
24 /// \ingroup cpp_kodi_gui
25 /// @brief \cpp_namespace{ kodi::gui::dialogs::FileBrowser }
26 /// **File browser dialog**
27 ///
28 /// The functions listed below of the class "FileBrowser" offer
29 /// the possibility to select to a file by the user of the add-on.
30 ///
31 /// It allows all the options that are possible in Kodi itself and offers all
32 /// support file types.
33 ///
34 /// It has the header \ref FileBrowser.h "#include <kodi/gui/dialogs/FileBrowser.h>"
35 /// be included to enjoy it.
36 ///
37 namespace FileBrowser
38 {
39 //==========================================================================
40 ///
41 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
42 /// @brief Directory selection dialog
43 ///
44 /// @param[in] shares With Shares becomes the available start folders
45 /// be set.
46 /// @param[in] heading Dialog header name
47 /// @param[in,out] path As in the path to start and return value about
48 /// selected directory
49 /// @param[in] writeOnly If set only writeable folders are shown.
50 /// @return False if selection becomes canceled.
51 ///
52 /// **Example:**
53 /// ~~~~~~~~~~~~~{.cpp}
54 /// #include <kodi/gui/dialogs/FileBrowser.h>
55 ///
56 /// /*
57 /// * Example show directory selection dialog with on 'share' (first value)
58 /// * defined directory types.
59 /// *
60 /// * If this becomes leaved empty and 'directory' is empty goes it to the
61 /// * base path of the hard disk.
62 /// *
63 /// * Also can be with path written to 'directory' before the dialog forced
64 /// * to a start place.
65 /// */
66 /// std::string directory;
67 /// bool ret = kodi::gui::dialogs::FileBrowser::ShowAndGetDirectory("local|network|removable",
68 /// "Test directory selection",
69 /// directory,
70 /// false);
71 /// fprintf(stderr, "Selected directory is : %s and was %s\n", directory.c_str(), ret ? "OK" : "Canceled");
72 /// ~~~~~~~~~~~~~
73 ///
74 inline bool ATTRIBUTE_HIDDEN ShowAndGetDirectory(const std::string& shares,
75 const std::string& heading,
76 std::string& path,
77 bool writeOnly = false)
78 {
79 using namespace ::kodi::addon;
80 char* retString = nullptr;
81 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_directory(
82 CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), path.c_str(),
83 &retString, writeOnly);
84 if (retString != nullptr)
85 {
86 if (std::strlen(retString))
87 path = retString;
88 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
89 retString);
90 }
91 return ret;
92 }
93 //--------------------------------------------------------------------------
94
95 //==========================================================================
96 ///
97 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
98 /// @brief File selection dialog
99 ///
100 /// @param[in] shares With Shares becomes the available start
101 /// folders be set.
102 /// @param[in] mask The mask to filter visible files, e.g.
103 /// ".m3u|.pls|.b4s|.wpl".
104 /// @param[in] heading Dialog header name
105 /// @param[in,out] path As in the path to start and Return value
106 /// about selected file
107 /// @param[in] useThumbs If set show thumbs if possible on dialog.
108 /// @param[in] useFileDirectories If set also packages (e.g. *.zip) are
109 /// handled as directories.
110 /// @return False if selection becomes canceled.
111 ///
112 inline bool ATTRIBUTE_HIDDEN ShowAndGetFile(const std::string& shares,
113 const std::string& mask,
114 const std::string& heading,
115 std::string& path,
116 bool useThumbs = false,
117 bool useFileDirectories = false)
118 {
119 using namespace ::kodi::addon;
120 char* retString = nullptr;
121 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file(CAddonBase::m_interface->toKodi->kodiBase,
122 shares.c_str(), mask.c_str(), heading.c_str(), path.c_str(), &retString,
123 useThumbs, useFileDirectories);
124 if (retString != nullptr)
125 {
126 if (std::strlen(retString))
127 path = retString;
128 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
129 }
130 return ret;
131 }
132 //--------------------------------------------------------------------------
133
134 //==========================================================================
135 ///
136 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
137 /// @brief File selection from a directory
138 ///
139 /// @param[in] directory The directory name where the dialog
140 /// start, possible are normal names and
141 /// kodi's special names.
142 /// @param[in] mask The mask to filter visible files, e.g.
143 /// ".m3u|.pls|.b4s|.wpl".
144 /// @param[in] heading Dialog header name
145 /// @param[in,out] path As in the path to start and Return value
146 /// about selected file
147 /// @param[in] useThumbs If set show thumbs if possible on dialog.
148 /// @param[in] useFileDirectories If set also packages (e.g. *.zip) are
149 /// handled as directories.
150 /// @param[in] singleList
151 /// @return False if selection becomes canceled.
152 ///
153 inline bool ATTRIBUTE_HIDDEN ShowAndGetFileFromDir(const std::string& directory,
154 const std::string& mask,
155 const std::string& heading,
156 std::string& path,
157 bool useThumbs = false,
158 bool useFileDirectories = false,
159 bool singleList = false)
160 {
161 using namespace ::kodi::addon;
162 char* retString = nullptr;
163 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_from_dir(CAddonBase::m_interface->toKodi->kodiBase,
164 directory.c_str(), mask.c_str(), heading.c_str(),
165 path.c_str(), &retString, useThumbs,
166 useFileDirectories, singleList);
167 if (retString != nullptr)
168 {
169 if (std::strlen(retString))
170 path = retString;
171 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
172 }
173 return ret;
174 }
175 //--------------------------------------------------------------------------
176
177 //==========================================================================
178 ///
179 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
180 /// @brief File selection dialog to get several in to a list
181 ///
182 /// @param[in] shares With Shares becomes the available start
183 /// folders be set.
184 /// @param[in] mask The mask to filter visible files, e.g.
185 /// ".m3u|.pls|.b4s|.wpl".
186 /// @param[in] heading Dialog header name
187 /// @param[out] fileList Return value about selected files
188 /// @param[in] useThumbs If set show thumbs if possible on dialog.
189 /// @param[in] useFileDirectories If set also packages (e.g. *.zip) are
190 /// handled as directories.
191 /// @return False if selection becomes canceled.
192 ///
193 inline bool ATTRIBUTE_HIDDEN ShowAndGetFileList(const std::string& shares,
194 const std::string& mask,
195 const std::string& heading,
196 std::vector<std::string>& fileList,
197 bool useThumbs = false,
198 bool useFileDirectories = false)
199 {
200 using namespace ::kodi::addon;
201 char** list = nullptr;
202 unsigned int listSize = 0;
203 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_list(CAddonBase::m_interface->toKodi->kodiBase,
204 shares.c_str(), mask.c_str(), heading.c_str(), &list, &listSize,
205 useThumbs, useFileDirectories);
206 if (ret)
207 {
208 for (unsigned int i = 0; i < listSize; ++i)
209 fileList.emplace_back(list[i]);
210 CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list(CAddonBase::m_interface->toKodi->kodiBase, &list, listSize);
211 }
212 return ret;
213 }
214 //--------------------------------------------------------------------------
215
216 //==========================================================================
217 ///
218 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
219 /// @brief Source selection dialog
220 ///
221 /// @param[in,out] path As in the path to start and Return value
222 /// about selected source
223 /// @param[in] allowNetworkShares Allow also access to network
224 /// @param[in] additionalShare With additionalShare becomes the available
225 /// start folders be set (optional).
226 /// @param[in] type
227 /// @return False if selection becomes canceled.
228 ///
229 inline bool ATTRIBUTE_HIDDEN ShowAndGetSource(std::string& path,
230 bool allowNetworkShares,
231 const std::string& additionalShare = "",
232 const std::string& type = "")
233 {
234 using namespace ::kodi::addon;
235 char* retString = nullptr;
236 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_source(CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), &retString,
237 allowNetworkShares, additionalShare.c_str(), type.c_str());
238 if (retString != nullptr)
239 {
240 if (std::strlen(retString))
241 path = retString;
242 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
243 }
244 return ret;
245 }
246 //--------------------------------------------------------------------------
247
248 //==========================================================================
249 ///
250 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
251 /// @brief Image selection dialog
252 ///
253 /// @param[in] shares With Shares becomes the available start folders be
254 /// set.
255 /// @param[in] heading Dialog header name
256 /// @param[out] path Return value about selected image
257 /// @return False if selection becomes canceled.
258 ///
259 inline bool ATTRIBUTE_HIDDEN ShowAndGetImage(const std::string& shares,
260 const std::string& heading,
261 std::string& path)
262 {
263 using namespace ::kodi::addon;
264 char* retString = nullptr;
265 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image(CAddonBase::m_interface->toKodi->kodiBase,
266 shares.c_str(), heading.c_str(), path.c_str(), &retString);
267 if (retString != nullptr)
268 {
269 if (std::strlen(retString))
270 path = retString;
271 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
272 }
273 return ret;
274 }
275 //--------------------------------------------------------------------------
276
277 //==========================================================================
278 ///
279 /// \ingroup cpp_kodi_gui_dialogs_FileBrowser
280 /// @brief Image selection dialog to get several in to a list
281 ///
282 /// @param[in] shares With Shares becomes the available start folders
283 /// be set.
284 /// @param[in] heading Dialog header name
285 /// @param[out] file_list Return value about selected images
286 /// @return False if selection becomes canceled.
287 ///
288 inline bool ATTRIBUTE_HIDDEN ShowAndGetImageList(const std::string& shares,
289 const std::string& heading,
290 std::vector<std::string>& file_list)
291 {
292 using namespace ::kodi::addon;
293 char** list = nullptr;
294 unsigned int listSize = 0;
295 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image_list(CAddonBase::m_interface->toKodi->kodiBase,
296 shares.c_str(), heading.c_str(), &list, &listSize);
297 if (ret)
298 {
299 for (unsigned int i = 0; i < listSize; ++i)
300 file_list.emplace_back(list[i]);
301 CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list(CAddonBase::m_interface->toKodi->kodiBase, &list, listSize);
302 }
303 return ret;
304 }
305 //--------------------------------------------------------------------------
306 };
307
308} /* namespace dialogs */
309} /* namespace gui */
310} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h
deleted file mode 100644
index 843bdfa..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h
+++ /dev/null
@@ -1,422 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_Keyboard Dialog Keyboard
24 /// \ingroup cpp_kodi_gui
25 /// @brief \cpp_namespace{ kodi::gui::dialogs::Keyboard }
26 /// **Keyboard dialogs**
27 ///
28 /// The functions listed below have to be permitted by the user for the
29 /// representation of a keyboard around an input.
30 ///
31 /// The class supports several kinds, from an easy text choice up to the
32 /// passport Word production and their confirmation for add-on.
33 ///
34 /// It has the header \ref Keyboard.h "#include <kodi/gui/dialogs/Keyboard.h>"
35 /// be included to enjoy it.
36 ///
37 namespace Keyboard
38 {
39 //==========================================================================
40 ///
41 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
42 /// @brief Show keyboard with initial value `text` and replace with result
43 /// string.
44 ///
45 /// @param[in,out] text Overwritten with user input if return=true.
46 /// @param[in] heading String shown on dialog title.
47 /// @param[in] allowEmptyResult Whether a blank password is valid or not.
48 /// @param[in] hiddenInput The inserted input is not shown as text.
49 /// @param[in] autoCloseMs To close the dialog after a specified
50 /// time, in milliseconds, default is 0 which
51 /// keeps the dialog open indefinitely.
52 /// @return true if successful display and user input.
53 /// false if unsuccessful display, no user
54 /// input, or canceled editing.
55 ///
56 ///
57 ///-------------------------------------------------------------------------
58 ///
59 /// **Example:**
60 /// ~~~~~~~~~~~~~{.cpp}
61 /// #include <kodi/gui/dialogs/Keyboard.h>
62 ///
63 /// /*
64 /// * The example shows the display of keyboard call dialog at Kodi from the add-on.
65 /// * Below all values are set, however, can last two (hidden input = false and autoCloseMs = 0)
66 /// * to be released if not needed.
67 /// */
68 /// std::string text = "Please change me to them want you want"; /*< It can be leaved empty or a
69 /// entry text added */
70 /// bool bRet = ::kodi::gui::dialogs::Keyboard::ShowAndGetInput(text,
71 /// "Demonstration text entry",
72 /// true,
73 /// false,
74 /// 0);
75 /// fprintf(stderr, "Written keyboard input is : '%s' and was %s\n",
76 /// text.c_str(), bRet ? "OK" : "Canceled");
77 /// ~~~~~~~~~~~~~
78 ///
79 inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text,
80 const std::string& heading,
81 bool allowEmptyResult,
82 bool hiddenInput = false,
83 unsigned int autoCloseMs = 0)
84 {
85 using namespace ::kodi::addon;
86 char* retString = nullptr;
87 bool ret =
88 CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input_with_head(
89 CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, heading.c_str(),
90 allowEmptyResult, hiddenInput, autoCloseMs);
91 if (retString != nullptr)
92 {
93 text = retString;
94 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase,
95 retString);
96 }
97 return ret;
98 }
99 //--------------------------------------------------------------------------
100
101 //==========================================================================
102 ///
103 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
104 /// @brief The example shows the display of keyboard call dialog at Kodi
105 /// from the add-on.
106 ///
107 /// @param[out] text Overwritten with user input if return=true.
108 /// @param[in] allowEmptyResult If set to true keyboard can also exited
109 /// without entered text.
110 /// @param[in] autoCloseMs To close the dialog after a specified time,
111 /// in milliseconds, default is 0 which keeps
112 /// the dialog open indefinitely.
113 /// @return true if successful display and user input.
114 /// false if unsuccessful display, no user
115 /// input, or canceled editing.
116 ///
117 inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text,
118 bool allowEmptyResult,
119 unsigned int autoCloseMs = 0)
120 {
121 using namespace ::kodi::addon;
122 char* retString = nullptr;
123 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input(CAddonBase::m_interface->toKodi->kodiBase,
124 text.c_str(), &retString,
125 allowEmptyResult, autoCloseMs);
126 if (retString != nullptr)
127 {
128 text = retString;
129 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
130 }
131 return ret;
132 }
133 //--------------------------------------------------------------------------
134
135 //==========================================================================
136 ///
137 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
138 /// @brief Shows keyboard and prompts for a password. Differs from
139 /// `ShowAndVerifyNewPassword()` in that no second verification
140 ///
141 /// @param[in,out] newPassword Overwritten with user input if return=true.
142 /// @param[in] heading String shown on dialog title.
143 /// @param[in] allowEmptyResult Whether a blank password is valid or not.
144 /// @param[in] autoCloseMs To close the dialog after a specified time,
145 /// in milliseconds, default is 0 which keeps
146 /// the dialog open indefinitely.
147 /// @return true if successful display and user input.
148 /// false if unsuccessful display, no user
149 /// input, or canceled editing.
150 ///
151 inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword,
152 const std::string& heading,
153 bool allowEmptyResult,
154 unsigned int autoCloseMs = 0)
155 {
156 using namespace ::kodi::addon;
157 char* retString = nullptr;
158 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password_with_head(CAddonBase::m_interface->toKodi->kodiBase,
159 newPassword.c_str(), &retString, heading.c_str(),
160 allowEmptyResult, autoCloseMs);
161 if (retString != nullptr)
162 {
163 newPassword = retString;
164 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
165 }
166 return ret;
167 }
168 //--------------------------------------------------------------------------
169
170 //==========================================================================
171 ///
172 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
173 /// @brief Shows keyboard and prompts for a password. Differs from
174 /// `ShowAndVerifyNewPassword()` in that no second verification
175 ///
176 /// @param[in,out] newPassword Overwritten with user input if return=true.
177 /// @param[in] autoCloseMs To close the dialog after a specified time,
178 /// in milliseconds, default is 0 which keeps
179 /// the dialog open indefinitely.
180 /// @return true if successful display and user input.
181 /// false if unsuccessful display, no user
182 /// input, or canceled editing.
183 ///
184 inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword,
185 unsigned int autoCloseMs = 0)
186 {
187 using namespace ::kodi::addon;
188 char* retString = nullptr;
189 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password(CAddonBase::m_interface->toKodi->kodiBase,
190 newPassword.c_str(), &retString, autoCloseMs);
191 if (retString != nullptr)
192 {
193 newPassword = retString;
194 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
195 }
196 return ret;
197 }
198 //--------------------------------------------------------------------------
199
200 //==========================================================================
201 ///
202 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
203 /// @brief Show keyboard twice to get and confirm a user-entered password
204 /// string.
205 ///
206 /// @param[out] newPassword Overwritten with user input if return=true.
207 /// @param[in] heading String shown on dialog title.
208 /// @param[in] allowEmptyResult
209 /// @param[in] autoCloseMs To close the dialog after a specified time,
210 /// in milliseconds, default is 0 which keeps
211 /// the dialog open indefinitely.
212 /// @return true if successful display and user input.
213 /// false if unsuccessful display, no user
214 /// input, or canceled editing.
215 ///
216 ///
217 ///-------------------------------------------------------------------------
218 ///
219 /// **Example:**
220 /// ~~~~~~~~~~~~~{.cpp}
221 /// #include <kodi/General.h>
222 /// #include <kodi/gui/dialogs/Keyboard.h>
223 ///
224 /// /*
225 /// * The example below shows the complete use of keyboard dialog for password
226 /// * check. If only one check from add-on needed can be function with retries
227 /// * set to '0' called alone.
228 /// *
229 /// * The use of MD5 translated password is always required for the check on Kodi!
230 /// */
231 ///
232 /// int maxretries = 3;
233 /// /*
234 /// * Password names need to be send as md5 sum to kodi.
235 /// */
236 /// std::string password;
237 /// kodi::GetMD5("kodi", password);
238 ///
239 /// /*
240 /// * To the loop about password checks.
241 /// */
242 /// int ret;
243 /// for (unsigned int i = 0; i < maxretries; i++)
244 /// {
245 /// /*
246 /// * Ask the user about the password.
247 /// */
248 /// ret = ::kodi::gui::dialogs::Keyboard::ShowAndVerifyPassword(password, "Demo password call for PW 'kodi'", i, 0);
249 /// if (ret == 0)
250 /// {
251 /// fprintf(stderr, "Password successfull confirmed after '%i' tries\n", i+1);
252 /// break;
253 /// }
254 /// else if (ret < 0)
255 /// {
256 /// fprintf(stderr, "Canceled editing on try '%i'\n", i+1);
257 /// break;
258 /// }
259 /// else /* if (ret > 0) */
260 /// {
261 /// fprintf(stderr, "Wrong password entered on try '%i'\n", i+1);
262 /// }
263 /// }
264 /// ~~~~~~~~~~~~~
265 ///
266 inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword,
267 const std::string& heading,
268 bool allowEmptyResult,
269 unsigned int autoCloseMs = 0)
270 {
271 using namespace ::kodi::addon;
272 char* retString = nullptr;
273 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password_with_head(CAddonBase::m_interface->toKodi->kodiBase,
274 &retString, heading.c_str(), allowEmptyResult,
275 autoCloseMs);
276 if (retString != nullptr)
277 {
278 newPassword = retString;
279 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
280 }
281 return ret;
282 }
283 //--------------------------------------------------------------------------
284
285 //==========================================================================
286 ///
287 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
288 /// @brief Show keyboard twice to get and confirm a user-entered password
289 /// string.
290 ///
291 /// @param[out] newPassword Overwritten with user input if return=true.
292 /// @param[in] autoCloseMs To close the dialog after a specified time,
293 /// in milliseconds, default is 0 which keeps
294 /// the dialog open indefinitely.
295 /// @return true if successful display and user input.
296 /// false if unsuccessful display, no user
297 /// input, or canceled editing.
298 ///
299 inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword,
300 unsigned int autoCloseMs = 0)
301 {
302 using namespace ::kodi::addon;
303 char* retString = nullptr;
304 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password(CAddonBase::m_interface->toKodi->kodiBase,
305 &retString, autoCloseMs);
306 if (retString != nullptr)
307 {
308 newPassword = retString;
309 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
310 }
311 return ret;
312 }
313 //--------------------------------------------------------------------------
314
315 //==========================================================================
316 ///
317 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
318 /// @brief Show keyboard and verify user input against `password`.
319 ///
320 /// @param[in,out] password Value to compare against user input.
321 /// @param[in] heading String shown on dialog title.
322 /// @param[in] retries If greater than 0, shows "Incorrect
323 /// password, %d retries left" on dialog line 2,
324 /// else line 2 is blank.
325 /// @param[in] autoCloseMs To close the dialog after a specified time,
326 /// in milliseconds, default is 0 which keeps
327 /// the dialog open indefinitely.
328 /// @return 0 if successful display and user input. 1 if
329 /// unsuccessful input. -1 if no user input or
330 /// canceled editing.
331 ///
332 inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(std::string& password,
333 const std::string& heading,
334 int retries,
335 unsigned int autoCloseMs = 0)
336 {
337 using namespace ::kodi::addon;
338 char* retString = nullptr;
339 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_password(CAddonBase::m_interface->toKodi->kodiBase,
340 password.c_str(), &retString, heading.c_str(),
341 retries, autoCloseMs);
342 if (retString != nullptr)
343 {
344 password = retString;
345 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
346 }
347 return ret;
348 }
349 //--------------------------------------------------------------------------
350
351 //==========================================================================
352 ///
353 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
354 /// @brief Shows a filter related keyboard
355 ///
356 /// @param[in,out] text Overwritten with user input if return=true.
357 /// @param[in] searching Use dialog for search and send our search
358 /// message in safe way (only the active window
359 /// needs it)
360 /// - header name if true is "Enter search string"
361 /// - header name if false is "Enter value"
362 /// @param autoCloseMs To close the dialog after a specified time,
363 /// in milliseconds, default is 0 which keeps
364 /// the dialog open indefinitely.
365 /// @return true if successful display and user input.
366 /// false if unsuccessful display, no user
367 /// input, or canceled editing.
368 ///
369 inline bool ATTRIBUTE_HIDDEN ShowAndGetFilter(std::string& text,
370 bool searching,
371 unsigned int autoCloseMs = 0)
372 {
373 using namespace ::kodi::addon;
374 char* retString = nullptr;
375 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_filter(CAddonBase::m_interface->toKodi->kodiBase,
376 text.c_str(), &retString, searching, autoCloseMs);
377 if (retString != nullptr)
378 {
379 text = retString;
380 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
381 }
382 return ret;
383 }
384 //--------------------------------------------------------------------------
385
386 //==========================================================================
387 ///
388 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
389 /// @brief Send a text to a visible keyboard
390 ///
391 /// @param[in] text Overwritten with user input if return=true.
392 /// @param[in] closeKeyboard The open dialog is if also closed on 'true'.
393 /// @return true if successful done, false if
394 /// unsuccessful or keyboard not present.
395 ///
396 inline bool ATTRIBUTE_HIDDEN SendTextToActiveKeyboard(const std::string& text,
397 bool closeKeyboard = false)
398 {
399 using namespace ::kodi::addon;
400 return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->send_text_to_active_keyboard(CAddonBase::m_interface->toKodi->kodiBase,
401 text.c_str(), closeKeyboard);
402 }
403 //--------------------------------------------------------------------------
404
405 //==========================================================================
406 ///
407 /// \ingroup cpp_kodi_gui_dialogs_Keyboard
408 /// @brief Check for visible keyboard on GUI
409 ///
410 /// @return true if keyboard present, false if not present
411 ///
412 inline bool ATTRIBUTE_HIDDEN IsKeyboardActivated()
413 {
414 using namespace ::kodi::addon;
415 return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->is_keyboard_activated(CAddonBase::m_interface->toKodi->kodiBase);
416 }
417 //--------------------------------------------------------------------------
418 };
419
420} /* namespace dialogs */
421} /* namespace gui */
422} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h
deleted file mode 100644
index bff7683..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h
+++ /dev/null
@@ -1,362 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_Numeric Dialog Numeric
24 /// \ingroup cpp_kodi_gui
25 /// @{
26 /// @brief \cpp_namespace{ kodi::gui::dialogs::Numeric }
27 /// **Numeric dialogs**
28 ///
29 /// The functions listed below have to be permitted by the user for the
30 /// representation of a numeric keyboard around an input.
31 ///
32 /// The class supports several kinds, from an easy number choice up to the
33 /// passport Word production and their confirmation for add-on.
34 ///
35 /// It has the header \ref Numeric.h "#include <kodi/gui/dialogs/Numeric.h>"
36 /// be included to enjoy it.
37 ///
38 namespace Numeric
39 {
40 //==========================================================================
41 ///
42 /// \ingroup cpp_kodi_gui_dialogs_Numeric
43 /// @brief Use dialog to get numeric new password
44 ///
45 /// @param[out] newPassword String to preload into the keyboard
46 /// accumulator. Overwritten with user input
47 /// if return=true. Returned in MD5 format.
48 /// @return true if successful display and user
49 /// input entry/re-entry.
50 /// false if unsuccessful display, no user
51 /// input, or canceled editing.
52 ///
53 inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword)
54 {
55 using namespace ::kodi::addon;
56 char* pw = nullptr;
57 bool ret =
58 CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password(
59 CAddonBase::m_interface->toKodi->kodiBase, &pw);
60 if (pw != nullptr)
61 {
62 newPassword = pw;
63 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, pw);
64 }
65 return ret;
66 }
67 //--------------------------------------------------------------------------
68
69 //==========================================================================
70 ///
71 /// \ingroup cpp_kodi_gui_dialogs_Numeric
72 /// @brief Use dialog to verify numeric password.
73 ///
74 /// @param[in] password Password to compare with user input, need
75 /// in MD5 format.
76 /// @param[in] heading Heading to display
77 /// @param[in] retries If greater than 0, shows "Incorrect
78 /// password, %d retries left" on dialog
79 /// line 2, else line 2 is blank.
80 /// @return Possible values:
81 /// - 0 if successful display and user input.
82 /// - 1 if unsuccessful input.
83 /// - -1 if no user input or canceled editing.
84 ///
85 ///
86 ///-------------------------------------------------------------------------
87 ///
88 /// **Example:**
89 /// ~~~~~~~~~~~~~{.cpp}
90 /// #include <stdio.h> /* fprintf */
91 /// #include <kodi/General.h>
92 /// #include <kodi/gui/dialogs/Numeric.h>
93 ///
94 /// /*
95 /// * The example below shows the complete use of keyboard dialog for password
96 /// * check. If only one check from add-on needed can be function with retries
97 /// * set to '0' called alone.
98 /// *
99 /// * The use of MD5 translated password is always required for the check on Kodi!
100 /// */
101 ///
102 /// int maxretries = 3;
103 ///
104 /// /*
105 /// * Password names need to be send as md5 sum to kodi.
106 /// */
107 /// std::string password = kodi::GetMD5("1234");
108 ///
109 /// /*
110 /// * To the loop about password checks.
111 /// */
112 /// int ret;
113 /// for (unsigned int i = 0; i < maxretries; i++)
114 /// {
115 /// /*
116 /// * Ask the user about the password.
117 /// */
118 /// ret = kodi::gui::dialogs::Numeric::ShowAndVerifyPassword(password, "Demo numeric password call for PW '1234'", i);
119 /// if (ret == 0)
120 /// {
121 /// fprintf(stderr, "Numeric password successfull confirmed after '%i' tries\n", i+1);
122 /// break;
123 /// }
124 /// else if (ret < 0)
125 /// {
126 /// fprintf(stderr, "Canceled editing on try '%i'\n", i+1);
127 /// break;
128 /// }
129 /// else /* if (ret > 0) */
130 /// {
131 /// fprintf(stderr, "Wrong numeric password entered on try '%i'\n", i+1);
132 /// }
133 /// }
134 /// ~~~~~~~~~~~~~
135 ///
136 inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(const std::string& password,
137 const std::string& heading,
138 int retries)
139 {
140 using namespace ::kodi::addon;
141 return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_password(CAddonBase::m_interface->toKodi->kodiBase,
142 password.c_str(), heading.c_str(), retries);
143 }
144 //--------------------------------------------------------------------------
145
146 //==========================================================================
147 ///
148 /// \ingroup cpp_kodi_gui_dialogs_Numeric
149 /// @brief Use dialog to verify numeric password
150 ///
151 /// @param[in,out] toVerify Value to compare against user input.
152 /// @param[in] heading Heading to display
153 /// @param[in] verifyInput If set as true we verify the users input
154 /// versus toVerify.
155 /// @return true if successful display and user
156 /// input. false if unsuccessful display, no
157 /// user input, or canceled editing.
158 ///
159 inline bool ATTRIBUTE_HIDDEN ShowAndVerifyInput(std::string& toVerify,
160 const std::string& heading,
161 bool verifyInput)
162 {
163 using namespace ::kodi::addon;
164 char* retString = nullptr;
165 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_input(CAddonBase::m_interface->toKodi->kodiBase,
166 toVerify.c_str(), &retString, heading.c_str(), verifyInput);
167 if (retString != nullptr)
168 {
169 toVerify = retString;
170 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
171 }
172 return ret;
173 }
174 //--------------------------------------------------------------------------
175
176 //==========================================================================
177 ///
178 /// \ingroup cpp_kodi_gui_dialogs_Numeric
179 /// @brief Use dialog to get time value.
180 ///
181 /// @param[out] time Overwritten with user input if
182 /// return=true and time inserted.
183 /// @param[in] heading Heading to display.
184 /// @return true if successful display and user
185 /// input. false if unsuccessful display, no
186 /// user input, or canceled editing.
187 ///
188 ///
189 ///-------------------------------------------------------------------------
190 ///
191 /// **Example:**
192 /// ~~~~~~~~~~~~~{.cpp}
193 /// #include <stdio.h> /* printf */
194 /// #include <time.h> /* time_t, struct tm, time, localtime, strftime */
195 /// #include <kodi/gui/dialogs/Numeric.h>
196 ///
197 /// time_t rawtime;
198 /// struct tm * timeinfo;
199 /// char buffer [10];
200 ///
201 /// time (&rawtime);
202 /// timeinfo = localtime(&rawtime);
203 /// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetTime(*timeinfo, "Selected time test call");
204 /// strftime(buffer, sizeof(buffer), "%H:%M.", timeinfo);
205 /// printf("Selected time it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled");
206 /// ~~~~~~~~~~~~~
207 ///
208 inline bool ATTRIBUTE_HIDDEN ShowAndGetTime(tm& time, const std::string& heading)
209 {
210 using namespace ::kodi::addon;
211 return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_time(CAddonBase::m_interface->toKodi->kodiBase, &time, heading.c_str());
212 }
213 //--------------------------------------------------------------------------
214
215 //==========================================================================
216 ///
217 /// \ingroup cpp_kodi_gui_dialogs_Numeric
218 /// @brief Use dialog to get date value.
219 ///
220 /// @param[in,out] date Overwritten with user input if
221 /// return=true and date inserted.
222 /// @param[in] heading Heading to display
223 /// @return true if successful display and user
224 /// input. false if unsuccessful display, no
225 /// user input, or canceled editing.
226 ///
227 ///
228 ///-------------------------------------------------------------------------
229 ///
230 /// **Example:**
231 /// ~~~~~~~~~~~~~{.cpp}
232 /// #include <stdio.h> /* printf */
233 /// #include <time.h> /* time_t, struct tm, time, localtime, strftime */
234 /// #include <kodi/gui/dialogs/Numeric.h>
235 ///
236 /// time_t rawtime;
237 /// struct tm * timeinfo;
238 /// char buffer [20];
239 ///
240 /// time (&rawtime);
241 /// timeinfo = localtime(&rawtime);
242 /// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetDate(*timeinfo, "Selected date test call");
243 /// strftime(buffer, sizeof(buffer), "%Y-%m-%d", timeinfo);
244 /// printf("Selected date it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled");
245 /// ~~~~~~~~~~~~~
246 ///
247 inline bool ATTRIBUTE_HIDDEN ShowAndGetDate(tm& date, const std::string& heading)
248 {
249 using namespace ::kodi::addon;
250 return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_date(CAddonBase::m_interface->toKodi->kodiBase, &date, heading.c_str());
251 }
252 //--------------------------------------------------------------------------
253
254 //==========================================================================
255 ///
256 /// \ingroup cpp_kodi_gui_dialogs_Numeric
257 /// @brief Use dialog to get a IP
258 ///
259 /// @param[in,out] ipAddress Overwritten with user input if
260 /// return=true and IP address inserted.
261 /// @param[in] heading Heading to display.
262 /// @return true if successful display and
263 /// user input. false if unsuccessful
264 /// display, no user input, or canceled
265 /// editing.
266 ///
267 inline bool ATTRIBUTE_HIDDEN ShowAndGetIPAddress(std::string& ipAddress,
268 const std::string& heading)
269 {
270 using namespace ::kodi::addon;
271 char* retString = nullptr;
272 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_ip_address(CAddonBase::m_interface->toKodi->kodiBase,
273 ipAddress.c_str(), &retString, heading.c_str());
274 if (retString != nullptr)
275 {
276 ipAddress = retString;
277 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
278 }
279 return ret;
280 }
281 //--------------------------------------------------------------------------
282
283 //==========================================================================
284 ///
285 /// \ingroup cpp_kodi_gui_dialogs_Numeric
286 /// @brief Use dialog to get normal number.
287 ///
288 /// @param[in,out] input Overwritten with user input if
289 /// return=true and time in seconds inserted
290 /// @param[in] heading Heading to display
291 /// @param[in] autoCloseTimeoutMs To close the dialog after a specified
292 /// time, in milliseconds, default is 0
293 /// which keeps the dialog open
294 /// indefinitely.
295 /// @return true if successful display and user
296 /// input. false if unsuccessful display, no
297 /// user input, or canceled editing.
298 ///
299 ///
300 ///-------------------------------------------------------------------------
301 ///
302 /// **Example:**
303 /// ~~~~~~~~~~~~~{.cpp}
304 /// #include <stdio.h> /* printf */
305 /// #include <stdlib.h> /* strtoull (C++11) */
306 /// #include <kodi/gui/dialogs/Numeric.h>
307 ///
308 /// std::string number;
309 /// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetNumber(number, "Number test call");
310 /// printf("Written number input is : %llu and was %s\n",
311 /// strtoull(number.c_str(), nullptr, 0), bRet ? "OK" : "Canceled");
312 /// ~~~~~~~~~~~~~
313 ///
314 inline bool ATTRIBUTE_HIDDEN ShowAndGetNumber(std::string& input,
315 const std::string& heading,
316 unsigned int autoCloseTimeoutMs = 0)
317 {
318 using namespace ::kodi::addon;
319 char* retString = nullptr;
320 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_number(CAddonBase::m_interface->toKodi->kodiBase,
321 input.c_str(), &retString, heading.c_str(), autoCloseTimeoutMs);
322 if (retString != nullptr)
323 {
324 input = retString;
325 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
326 }
327 return ret;
328 }
329 //--------------------------------------------------------------------------
330
331 //==========================================================================
332 ///
333 /// \ingroup cpp_kodi_gui_dialogs_Numeric
334 /// @brief Show numeric keypad to get seconds.
335 ///
336 /// @param[in,out] time Overwritten with user input if return=true and
337 /// time in seconds inserted.
338 /// @param[in] heading Heading to display
339 /// @return true if successful display and user input. false
340 /// if unsuccessful display, no user input, or
341 /// canceled editing.
342 ///
343 inline bool ATTRIBUTE_HIDDEN ShowAndGetSeconds(std::string& time, const std::string& heading)
344 {
345 using namespace ::kodi::addon;
346 char* retString = nullptr;
347 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_seconds(CAddonBase::m_interface->toKodi->kodiBase,
348 time.c_str(), &retString, heading.c_str());
349 if (retString != nullptr)
350 {
351 time = retString;
352 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString);
353 }
354 return ret;
355 }
356 //--------------------------------------------------------------------------
357 };
358 /// @}
359
360} /* namespace dialogs */
361} /* namespace gui */
362} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/OK.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/OK.h
deleted file mode 100644
index b9a3a0d..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/OK.h
+++ /dev/null
@@ -1,99 +0,0 @@
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 "../../AddonBase.h"
12#include "../definitions.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_OK Dialog OK
24 /// \ingroup cpp_kodi_gui
25 /// @{
26 /// @brief \cpp_namespace{ kodi::gui::dialogs::OK }
27 /// **OK dialog**
28 ///
29 /// The functions listed below permit the call of a dialogue of information, a
30 /// confirmation of the user by press from OK required.
31 ///
32 /// It has the header \ref OK.h "#include <kodi/gui/dialogs/OK.h>"
33 /// be included to enjoy it.
34 ///
35 namespace OK
36 {
37 //==========================================================================
38 ///
39 /// \ingroup cpp_kodi_gui_dialogs_OK
40 /// @brief Use dialog to inform user with text and confirmation with OK with continued string.
41 ///
42 /// @param[in] heading Dialog heading.
43 /// @param[in] text Multi-line text.
44 ///
45 ///
46 ///-------------------------------------------------------------------------
47 ///
48 /// **Example:**
49 /// ~~~~~~~~~~~~~{.cpp}
50 /// #include <kodi/gui/dialogs/OK.h>
51 /// ...
52 /// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!\nI'm a call from add-on\n :) :D");
53 /// ~~~~~~~~~~~~~
54 ///
55 inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, const std::string& text)
56 {
57 using namespace ::kodi::addon;
58 CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_single_text(
59 CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str());
60 }
61 //--------------------------------------------------------------------------
62
63 //==========================================================================
64 ///
65 /// \ingroup cpp_kodi_gui_dialogs_OK
66 /// @brief Use dialog to inform user with text and confirmation with OK with strings separated to the lines.
67 ///
68 /// @param[in] heading Dialog heading.
69 /// @param[in] line0 Line #1 text.
70 /// @param[in] line1 Line #2 text.
71 /// @param[in] line2 Line #3 text.
72 ///
73 ///
74 ///-------------------------------------------------------------------------
75 ///
76 /// **Example:**
77 /// ~~~~~~~~~~~~~{.cpp}
78 /// #include <kodi/gui/dialogs/OK.h>
79 /// ...
80 /// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!", "I'm a call from add-on", " :) :D");
81 /// ~~~~~~~~~~~~~
82 ///
83 inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading,
84 const std::string& line0,
85 const std::string& line1,
86 const std::string& line2)
87 {
88 using namespace ::kodi::addon;
89 CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_line_text(CAddonBase::m_interface->toKodi->kodiBase,
90 heading.c_str(), line0.c_str(), line1.c_str(),
91 line2.c_str());
92 }
93 //--------------------------------------------------------------------------
94 }
95 /// @}
96
97} /* namespace dialogs */
98} /* namespace gui */
99} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Progress.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Progress.h
deleted file mode 100644
index b1f8cc5..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Progress.h
+++ /dev/null
@@ -1,255 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21//============================================================================
22///
23/// \defgroup cpp_kodi_gui_dialogs_CProgress Dialog Progress
24/// \ingroup cpp_kodi_gui
25/// @brief \cpp_class{ kodi::gui::dialogs::CProgress }
26/// **Progress dialog shown in center**
27///
28/// The with \ref DialogProgress.h "#include <kodi/gui/dialogs/Progress.h>"
29/// given class are basically used to create Kodi's progress dialog with named
30/// text fields.
31///
32/// **Example:**
33/// ~~~~~~~~~~~~~{.cpp}
34/// #include <kodi/gui/dialogs/Progress.h>
35///
36/// kodi::gui::dialogs::CProgress *progress = new kodi::gui::dialogs::CProgress;
37/// progress->SetHeading("Test progress");
38/// progress->SetLine(1, "line 1");
39/// progress->SetLine(2, "line 2");
40/// progress->SetLine(3, "line 3");
41/// progress->SetCanCancel(true);
42/// progress->ShowProgressBar(true);
43/// progress->Open();
44/// for (unsigned int i = 0; i < 100; i += 10)
45/// {
46/// progress->SetPercentage(i);
47/// sleep(1);
48/// }
49/// delete progress;
50/// ~~~~~~~~~~~~~
51///
52class ATTRIBUTE_HIDDEN CProgress
53{
54public:
55 //==========================================================================
56 ///
57 /// \ingroup cpp_kodi_gui_dialogs_CProgress
58 /// @brief Construct a new dialog
59 ///
60 CProgress()
61 {
62 using namespace ::kodi::addon;
63 m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->new_dialog(
64 CAddonBase::m_interface->toKodi->kodiBase);
65 if (!m_DialogHandle)
66 kodi::Log(ADDON_LOG_FATAL,
67 "kodi::gui::dialogs::CProgress can't create window class from Kodi !!!");
68 }
69 //--------------------------------------------------------------------------
70
71 //==========================================================================
72 ///
73 /// \ingroup cpp_kodi_gui_dialogs_CProgress
74 /// @brief Destructor
75 ///
76 ~CProgress()
77 {
78 using namespace ::kodi::addon;
79 if (m_DialogHandle)
80 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->delete_dialog(
81 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
82 }
83 //--------------------------------------------------------------------------
84
85 //==========================================================================
86 ///
87 /// \ingroup cpp_kodi_gui_dialogs_CProgress
88 /// @brief To open the dialog
89 ///
90 void Open()
91 {
92 using namespace ::kodi::addon;
93 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->open(
94 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
95 }
96 //--------------------------------------------------------------------------
97
98 //==========================================================================
99 ///
100 /// \ingroup cpp_kodi_gui_dialogs_CProgress
101 /// @brief Set the heading title of dialog
102 ///
103 /// @param[in] heading Title string to use
104 ///
105 void SetHeading(const std::string& heading)
106 {
107 using namespace ::kodi::addon;
108 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_heading(
109 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, heading.c_str());
110 }
111 //--------------------------------------------------------------------------
112
113 //==========================================================================
114 ///
115 /// \ingroup cpp_kodi_gui_dialogs_CProgress
116 /// @brief To set the line text field on dialog from 0 - 2
117 ///
118 /// @param[in] iLine Line number
119 /// @param[in] line Text string
120 ///
121 void SetLine(unsigned int iLine, const std::string& line)
122 {
123 using namespace ::kodi::addon;
124 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_line(
125 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, iLine, line.c_str());
126 }
127 //--------------------------------------------------------------------------
128
129 //==========================================================================
130 ///
131 /// \ingroup cpp_kodi_gui_dialogs_CProgress
132 /// @brief To enable and show cancel button on dialog
133 ///
134 /// @param[in] canCancel if true becomes it shown
135 ///
136 void SetCanCancel(bool canCancel)
137 {
138 using namespace ::kodi::addon;
139 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_can_cancel(
140 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, canCancel);
141 }
142 //--------------------------------------------------------------------------
143
144 //==========================================================================
145 ///
146 /// \ingroup cpp_kodi_gui_dialogs_CProgress
147 /// @brief To check dialog for clicked cancel button
148 ///
149 /// @return True if canceled
150 ///
151 bool IsCanceled() const
152 {
153 using namespace ::kodi::addon;
154 return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->is_canceled(
155 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
156 }
157 //--------------------------------------------------------------------------
158
159 //==========================================================================
160 ///
161 /// \ingroup cpp_kodi_gui_dialogs_CProgress
162 /// @brief Get the current progress position as percent
163 ///
164 /// @param[in] percentage Position to use from 0 to 100
165 ///
166 void SetPercentage(int percentage)
167 {
168 using namespace ::kodi::addon;
169 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_percentage(
170 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage);
171 }
172 //--------------------------------------------------------------------------
173
174 //==========================================================================
175 ///
176 /// \ingroup cpp_kodi_gui_dialogs_CProgress
177 /// @brief To set the current progress position as percent
178 ///
179 /// @return Current Position used from 0 to 100
180 ///
181 int GetPercentage() const
182 {
183 using namespace ::kodi::addon;
184 return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->get_percentage(
185 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
186 }
187 //--------------------------------------------------------------------------
188
189 //==========================================================================
190 ///
191 /// \ingroup cpp_kodi_gui_dialogs_CProgress
192 /// @brief To show or hide progress bar dialog
193 ///
194 /// @param[in] onOff If true becomes it shown
195 ///
196 void ShowProgressBar(bool onOff)
197 {
198 using namespace ::kodi::addon;
199 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->show_progress_bar(
200 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, onOff);
201 }
202 //--------------------------------------------------------------------------
203
204 //==========================================================================
205 ///
206 /// \ingroup cpp_kodi_gui_dialogs_CProgress
207 /// @brief Set the maximum position of progress, needed if `SetProgressAdvance(...)` is used
208 ///
209 /// @param[in] max Biggest usable position to use
210 ///
211 void SetProgressMax(int max)
212 {
213 using namespace ::kodi::addon;
214 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_max(
215 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, max);
216 }
217 //--------------------------------------------------------------------------
218
219 //==========================================================================
220 ///
221 /// \ingroup cpp_kodi_gui_dialogs_CProgress
222 /// @brief To increase progress bar by defined step size until reach of maximum position
223 ///
224 /// @param[in] steps Step size to increase, default is 1
225 ///
226 void SetProgressAdvance(int steps = 1)
227 {
228 using namespace ::kodi::addon;
229 CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_advance(
230 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, steps);
231 }
232 //--------------------------------------------------------------------------
233
234 //==========================================================================
235 ///
236 /// \ingroup cpp_kodi_gui_dialogs_CProgress
237 /// @brief To check progress was canceled on work
238 ///
239 /// @return True if aborted
240 ///
241 bool Abort()
242 {
243 using namespace ::kodi::addon;
244 return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->abort(
245 CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle);
246 }
247 //--------------------------------------------------------------------------
248
249private:
250 void* m_DialogHandle;
251};
252
253} /* namespace dialogs */
254} /* namespace gui */
255} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h
deleted file mode 100644
index 39a98fe..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h
+++ /dev/null
@@ -1,269 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14//==============================================================================
15/// \defgroup cpp_kodi_vfs_Defs Definitions, structures and enumerators
16/// \ingroup cpp_kodi_gui_dialogs_Select
17/// @brief **Dialog Select definition values**
18//------------------------------------------------------------------------------
19
20//==============================================================================
21/// \ingroup cpp_kodi_vfs_Defs
22/// @brief **Selection entry structure**
23///
24typedef struct SSelectionEntry
25{
26 //============================================================================
27 /// Structure constructor
28 ///
29 /// There becomes selected always set to false.
30 ///
31 SSelectionEntry() = default;
32 //----------------------------------------------------------------------------
33
34 /// Entry identfication string
35 std::string id;
36
37 /// Entry name to show on GUI dialog
38 std::string name;
39
40 /// Place where entry can be preselected and after return the from user
41 /// selected is set.
42 bool selected = false;
43} SSelectionEntry;
44//------------------------------------------------------------------------------
45
46namespace kodi
47{
48namespace gui
49{
50namespace dialogs
51{
52
53 //============================================================================
54 ///
55 /// \defgroup cpp_kodi_gui_dialogs_Select Dialog Select
56 /// \ingroup cpp_kodi_gui
57 /// @{
58 /// @brief \cpp_namespace{ kodi::gui::dialogs::Select }
59 /// **Selection dialog**
60 ///
61 /// The function listed below permits the call of a dialogue to select of an
62 /// entry as a key
63 ///
64 /// It has the header \ref Select.h "#include <kodi/gui/dialogs/Select.h>"
65 /// be included to enjoy it.
66 ///
67 ///
68 namespace Select
69 {
70 //==========================================================================
71 ///
72 /// \ingroup cpp_kodi_gui_dialogs_Select
73 /// @brief Show a selection dialog about given parts.
74 ///
75 /// @param[in] heading Dialog heading name
76 /// @param[in] entries String list about entries
77 /// @param[in] selected [opt] Predefined selection (default is
78 /// <tt>-1</tt> for the first)
79 /// @param[in] autoclose [opt] To close dialog automatic after the given
80 /// time in ms. As '0' it stays open.
81 /// @return The selected entry, if return <tt>-1</tt> was
82 /// nothing selected or canceled
83 ///
84 ///
85 ///-------------------------------------------------------------------------
86 ///
87 /// **Example:**
88 /// ~~~~~~~~~~~~~{.cpp}
89 /// #include <kodi/gui/dialogs/Select.h>
90 ///
91 /// const std::vector<std::string> entries
92 /// {
93 /// "Test 1",
94 /// "Test 2",
95 /// "Test 3",
96 /// "Test 4",
97 /// "Test 5"
98 /// };
99 ///
100 /// int selected = kodi::gui::dialogs::Select::Show("Test selection", entries, -1);
101 /// if (selected < 0)
102 /// fprintf(stderr, "Item selection canceled\n");
103 /// else
104 /// fprintf(stderr, "Selected item is: %i\n", selected);
105 /// ~~~~~~~~~~~~~
106 ///
107 inline int ATTRIBUTE_HIDDEN Show(const std::string& heading,
108 const std::vector<std::string>& entries,
109 int selected = -1,
110 unsigned int autoclose = 0)
111 {
112 using namespace ::kodi::addon;
113 unsigned int size = static_cast<unsigned int>(entries.size());
114 const char** cEntries = (const char**)malloc(size * sizeof(const char**));
115 for (unsigned int i = 0; i < size; ++i)
116 {
117 cEntries[i] = entries[i].c_str();
118 }
119 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open(
120 CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size, selected,
121 autoclose);
122 free(cEntries);
123 return ret;
124 }
125 //--------------------------------------------------------------------------
126
127 //==========================================================================
128 ///
129 /// \ingroup cpp_kodi_gui_dialogs_Select
130 /// @brief Show a selection dialog about given parts.
131 ///
132 /// This function is mostly equal to the other, only becomes the string list
133 /// here done by a SSelectionEntry, where a ID string can be defined.
134 ///
135 /// @param[in] heading Dialog heading name
136 /// @param[in] entries SSelectionEntry list about entries
137 /// @param[in] selected [opt] Predefined selection (default is
138 /// <tt>-1</tt> for the first)
139 /// @param[in] autoclose [opt] To close dialog automatic after the given
140 /// time in ms. As '0' it stays open.
141 /// @return The selected entry, if return <tt>-1</tt> was
142 /// nothing selected or canceled
143 ///
144 ///
145 ///-------------------------------------------------------------------------
146 ///
147 /// **Example:**
148 /// ~~~~~~~~~~~~~{.cpp}
149 /// #include <kodi/gui/dialogs/Select.h>
150 ///
151 /// std::vector<SSelectionEntry> entries
152 /// {
153 /// { "ID 1", "Test 1", false },
154 /// { "ID 2", "Test 2", false },
155 /// { "ID 3", "Test 3", false },
156 /// { "ID 4", "Test 4", false },
157 /// { "ID 5", "Test 5", false }
158 /// };
159 ///
160 /// int selected = kodi::gui::dialogs::Select::Show("Test selection", entries, -1);
161 /// if (selected < 0)
162 /// fprintf(stderr, "Item selection canceled\n");
163 /// else
164 /// fprintf(stderr, "Selected item is: %i\n", selected);
165 /// ~~~~~~~~~~~~~
166 ///
167 inline int ATTRIBUTE_HIDDEN Show(const std::string& heading,
168 std::vector<SSelectionEntry>& entries,
169 int selected = -1,
170 unsigned int autoclose = 0)
171 {
172 using namespace ::kodi::addon;
173 unsigned int size = static_cast<unsigned int>(entries.size());
174 const char** cEntries = static_cast<const char**>(malloc(size*sizeof(const char*)));
175 for (unsigned int i = 0; i < size; ++i)
176 {
177 cEntries[i] = entries[i].name.c_str();
178 if (selected == -1 && entries[i].selected)
179 selected = i;
180 }
181 int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(),
182 cEntries, size, selected, autoclose);
183 if (ret >= 0)
184 {
185 entries[ret].selected = true;
186 }
187 free(cEntries);
188 return ret;
189 }
190 //--------------------------------------------------------------------------
191
192 //==========================================================================
193 ///
194 /// \ingroup cpp_kodi_gui_dialogs_Select
195 /// @brief Show a multiple selection dialog about given parts.
196 ///
197 /// @param[in] heading Dialog heading name
198 /// @param[in] entries SSelectionEntry list about entries
199 /// @param[in] autoclose [opt] To close dialog automatic after the given
200 /// time in ms. As '0' it stays open.
201 /// @return The selected entries, if return <tt>empty</tt> was
202 /// nothing selected or canceled
203 ///
204 /// With selected on SSelectionEntry can be a pre selection defined.
205 ///
206 ///-------------------------------------------------------------------------
207 ///
208 /// **Example:**
209 /// ~~~~~~~~~~~~~{.cpp}
210 /// #include <kodi/gui/dialogs/Select.h>
211 ///
212 /// std::vector<SSelectionEntry> entries
213 /// {
214 /// { "ID 1", "Test 1", false },
215 /// { "ID 2", "Test 2", false },
216 /// { "ID 3", "Test 3", false },
217 /// { "ID 4", "Test 4", false },
218 /// { "ID 5", "Test 5", false }
219 /// };
220 ///
221 /// bool ret = kodi::gui::dialogs::Select::ShowMultiSelect("Test selection", entries);
222 /// if (!ret)
223 /// fprintf(stderr, "Selection canceled\n");
224 /// else
225 /// {
226 /// fprintf(stderr, "Selected items:\n");
227 /// for (const auto& entry : entries)
228 /// {
229 /// if (entry.selected)
230 /// fprintf(stderr, " - %s\n", entry.selected.id.c_str());
231 /// }
232 /// }
233 /// ~~~~~~~~~~~~~
234 ///
235 inline bool ATTRIBUTE_HIDDEN ShowMultiSelect(const std::string& heading,
236 std::vector<SSelectionEntry>& entries,
237 int autoclose = 0)
238 {
239 using namespace ::kodi::addon;
240 unsigned int size = static_cast<unsigned int>(entries.size());
241 const char** cEntryIDs = static_cast<const char**>(malloc(size*sizeof(const char*)));
242 const char** cEntryNames = static_cast<const char**>(malloc(size*sizeof(const char*)));
243 bool* cEntriesSelected = static_cast<bool*>(malloc(size*sizeof(bool)));
244 for (unsigned int i = 0; i < size; ++i)
245 {
246 cEntryIDs[i] = entries[i].id.c_str();
247 cEntryNames[i] = entries[i].name.c_str();
248 cEntriesSelected[i] = entries[i].selected;
249 }
250 bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open_multi_select(CAddonBase::m_interface->toKodi->kodiBase,
251 heading.c_str(), cEntryIDs, cEntryNames,
252 cEntriesSelected, size, autoclose);
253 if (ret)
254 {
255 for (unsigned int i = 0; i < size; ++i)
256 entries[i].selected = cEntriesSelected[i];
257 }
258 free(cEntryNames);
259 free(cEntryIDs);
260 free(cEntriesSelected);
261 return ret;
262 }
263 //--------------------------------------------------------------------------
264 };
265 /// @}
266
267} /* namespace dialogs */
268} /* namespace gui */
269} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/TextViewer.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/TextViewer.h
deleted file mode 100644
index 5c81837..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/TextViewer.h
+++ /dev/null
@@ -1,108 +0,0 @@
1/*
2 * Copyright (C) 2015-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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_TextViewer Dialog Text Viewer
24 /// \ingroup cpp_kodi_gui
25 /// @{
26 /// @brief \cpp_namespace{ kodi::gui::dialogs::TextViewer }
27 /// **Text viewer dialog**
28 ///
29 /// The text viewer dialog can be used to display descriptions, help texts or
30 /// other larger texts.
31 ///
32 /// In order to achieve a line break is a <b>\\n</b> directly in the text or
33 /// in the <em>"./resources/language/resource.language.??_??/strings.po"</em>
34 /// to call with <b>std::string kodi::general::GetLocalizedString(...);</b>.
35 ///
36 /// It has the header \ref TextViewer.h "#include <kodi/gui/dialogs/TextViewer.h>"
37 /// be included to enjoy it.
38 ///
39 namespace TextViewer
40 {
41 //==========================================================================
42 ///
43 /// \ingroup cpp_kodi_gui_dialogs_TextViewer
44 /// @brief Show info text dialog
45 ///
46 /// @param[in] heading Small heading text
47 /// @param[in] text Showed text on dialog
48 ///
49 ///
50 ///-------------------------------------------------------------------------
51 ///
52 /// **Example:**
53 /// ~~~~~~~~~~~~~{.cpp}
54 /// #include <kodi/gui/dialogs/TextViewer.h>
55 ///
56 /// kodi::gui::dialogs::TextViewer::Show("The Wizard of Oz (1939 film)",
57 /// "The Wizard of Oz is a 1939 American musical comedy-drama fantasy film "
58 /// "produced by Metro-Goldwyn-Mayer, and the most well-known and commercially "
59 /// "successful adaptation based on the 1900 novel The Wonderful Wizard of Oz "
60 /// "by L. Frank Baum. The film stars Judy Garland as Dorothy Gale. The film"
61 /// "co-stars Terry the dog, billed as Toto; Ray Bolger, Jack Haley, Bert Lahr, "
62 /// "Frank Morgan, Billie Burke, Margaret Hamilton, with Charley Grapewin and "
63 /// "Clara Blandick, and the Singer Midgets as the Munchkins.\n"
64 /// "\n"
65 /// "Notable for its use of Technicolor, fantasy storytelling, musical score and "
66 /// "unusual characters, over the years it has become an icon of American popular "
67 /// "culture. It was nominated for six Academy Awards, including Best Picture but "
68 /// "lost to Gone with the Wind. It did win in two other categories including Best "
69 /// "Original Song for \"Over the Rainbow\". However, the film was a box office "
70 /// "disappointment on its initial release, earning only $3,017,000 on a $2,777,000 "
71 /// "budget, despite receiving largely positive reviews. It was MGM's most "
72 /// "expensive production at that time, and did not completely recoup the studio's "
73 /// "investment and turn a profit until theatrical re-releases starting in 1949.\n"
74 /// "\n"
75 /// "The 1956 broadcast television premiere of the film on CBS re-introduced the "
76 /// "film to the wider public and eventually made the presentation an annual "
77 /// "tradition, making it one of the most known films in cinema history. The "
78 /// "film was named the most-viewed motion picture on television syndication by "
79 /// "the Library of Congress who also included the film in its National Film "
80 /// "Registry in its inaugural year in 1989. Designation on the registry calls "
81 /// "for efforts to preserve it for being \"culturally, historically, and "
82 /// "aesthetically significant\". It is also one of the few films on UNESCO's "
83 /// "Memory of the World Register.\n"
84 /// "\n"
85 /// "The Wizard of Oz is often ranked on best-movie lists in critics' and public "
86 /// "polls. It is the source of many quotes referenced in modern popular culture. "
87 /// "It was directed primarily by Victor Fleming (who left production to take "
88 /// "over direction on the troubled Gone with the Wind production). Noel Langley, "
89 /// "Florence Ryerson and Edgar Allan Woolf received credit for the screenplay, "
90 /// "but there were uncredited contributions by others. The songs were written "
91 /// "by Edgar \"Yip\" Harburg (lyrics) and Harold Arlen (music). The incidental "
92 /// "music, based largely on the songs, was composed by Herbert Stothart, with "
93 /// "interspersed renderings from classical composers.\n");
94 /// ~~~~~~~~~~~~~
95 ///
96 inline void ATTRIBUTE_HIDDEN Show(const std::string& heading, const std::string& text)
97 {
98 using namespace ::kodi::addon;
99 CAddonBase::m_interface->toKodi->kodi_gui->dialogTextViewer->open(
100 CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str());
101 }
102 //--------------------------------------------------------------------------
103 };
104 /// @}
105
106} /* namespace dialogs */
107} /* namespace gui */
108} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/YesNo.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/YesNo.h
deleted file mode 100644
index 67c2fc4..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/YesNo.h
+++ /dev/null
@@ -1,188 +0,0 @@
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 "../definitions.h"
12#include "../../AddonBase.h"
13
14namespace kodi
15{
16namespace gui
17{
18namespace dialogs
19{
20
21 //============================================================================
22 ///
23 /// \defgroup cpp_kodi_gui_dialogs_YesNo Dialog Yes/No
24 /// \ingroup cpp_kodi_gui
25 /// @{
26 /// @brief \cpp_namespace{ kodi::gui::dialogs::YesNo }
27 /// **Yes / No dialog**
28 ///
29 /// The Yes / No dialog can be used to inform the user about questions and get
30 /// the answer.
31 ///
32 /// In order to achieve a line break is a <b>\\n</b> directly in the text or
33 /// in the <em>"./resources/language/resource.language.??_??/strings.po"</em>
34 /// to call with <b>std::string kodi::general::GetLocalizedString(...);</b>.
35 ///
36 /// It has the header \ref YesNo.h "#include <kodi/gui/dialogs/YesNo.h>"
37 /// be included to enjoy it.
38 ///
39 ///
40 namespace YesNo
41 {
42 //==========================================================================
43 ///
44 /// \ingroup cpp_kodi_gui_dialogs_YesNo
45 /// @brief Use dialog to get numeric new password with one text string shown
46 /// everywhere and cancel return field
47 ///
48 /// @param[in] heading Dialog heading
49 /// @param[in] text Multi-line text
50 /// @param[out] canceled Return value about cancel button
51 /// @param[in] noLabel [opt] label to put on the no button
52 /// @param[in] yesLabel [opt] label to put on the yes button
53 /// @return Returns True if 'Yes' was pressed, else False
54 ///
55 /// @note It is preferred to only use this as it is actually a multi-line text.
56 ///
57 ///
58 ///-------------------------------------------------------------------------
59 ///
60 /// **Example:**
61 /// ~~~~~~~~~~~~~{.cpp}
62 /// #include <kodi/gui/dialogs/YesNo.h>
63 ///
64 /// bool canceled;
65 /// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput(
66 /// "Yes / No test call", /* The Header */
67 /// "You has opened Yes / No dialog for test\n\nIs this OK for you?",
68 /// canceled, /* return value about cancel button */
69 /// "Not really", /* No label, is optional and if empty "No" */
70 /// "Ohhh yes"); /* Yes label, also optional and if empty "Yes" */
71 /// fprintf(stderr, "You has called Yes/No, returned '%s' and was %s\n",
72 /// ret ? "yes" : "no",
73 /// canceled ? "canceled" : "not canceled");
74 /// ~~~~~~~~~~~~~
75 ///
76 inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading,
77 const std::string& text,
78 bool& canceled,
79 const std::string& noLabel = "",
80 const std::string& yesLabel = "")
81 {
82 using namespace ::kodi::addon;
83 return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_single_text(
84 CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str(), &canceled,
85 noLabel.c_str(), yesLabel.c_str());
86 }
87 //--------------------------------------------------------------------------
88
89 //==========================================================================
90 ///
91 /// \ingroup cpp_kodi_gui_dialogs_YesNo
92 /// @brief Use dialog to get numeric new password with separated line strings
93 ///
94 /// @param[in] heading Dialog heading
95 /// @param[in] line0 Line #0 text
96 /// @param[in] line1 Line #1 text
97 /// @param[in] line2 Line #2 text
98 /// @param[in] noLabel [opt] label to put on the no button.
99 /// @param[in] yesLabel [opt] label to put on the yes button.
100 /// @return Returns True if 'Yes' was pressed, else False.
101 ///
102 ///
103 ///-------------------------------------------------------------------------
104 ///
105 /// **Example:**
106 /// ~~~~~~~~~~~~~{.cpp}
107 /// #include <kodi/gui/dialogs/YesNo.h>
108 ///
109 /// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput(
110 /// "Yes / No test call", // The Header
111 /// "You has opened Yes / No dialog for test",
112 /// "",
113 /// "Is this OK for you?",
114 /// "Not really", // No label, is optional and if empty "No"
115 /// "Ohhh yes"); // Yes label, also optional and if empty "Yes"
116 /// fprintf(stderr, "You has called Yes/No, returned '%s'\n",
117 /// ret ? "yes" : "no");
118 /// ~~~~~~~~~~~~~
119 ///
120 inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading,
121 const std::string& line0,
122 const std::string& line1,
123 const std::string& line2,
124 const std::string& noLabel = "",
125 const std::string& yesLabel = "")
126 {
127 using namespace ::kodi::addon;
128 return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_text(CAddonBase::m_interface->toKodi->kodiBase,
129 heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str(),
130 noLabel.c_str(), yesLabel.c_str());
131 }
132 //--------------------------------------------------------------------------
133
134 //==========================================================================
135 ///
136 /// \ingroup cpp_kodi_gui_dialogs_YesNo
137 /// @brief Use dialog to get numeric new password with separated line strings and cancel return field
138 ///
139 /// @param[in] heading Dialog heading
140 /// @param[in] line0 Line #0 text
141 /// @param[in] line1 Line #1 text
142 /// @param[in] line2 Line #2 text
143 /// @param[out] canceled Return value about cancel button
144 /// @param[in] noLabel [opt] label to put on the no button
145 /// @param[in] yesLabel [opt] label to put on the yes button
146 /// @return Returns True if 'Yes' was pressed, else False
147 ///
148 ///
149 ///-------------------------------------------------------------------------
150 ///
151 /// **Example:**
152 /// ~~~~~~~~~~~~~{.cpp}
153 /// #include <kodi/gui/dialogs/YesNo.h>
154 ///
155 /// bool canceled;
156 /// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput(
157 /// "Yes / No test call", // The Header
158 /// "You has opened Yes / No dialog for test",
159 /// "",
160 /// "Is this OK for you?",
161 /// canceled, // return value about cancel button
162 /// "Not really", // No label, is optional and if empty "No"
163 /// "Ohhh yes"); // Yes label, also optional and if empty "Yes"
164 /// fprintf(stderr, "You has called Yes/No, returned '%s' and was %s\n",
165 /// ret ? "yes" : "no",
166 /// canceled ? "canceled" : "not canceled");
167 /// ~~~~~~~~~~~~~
168 ///
169 inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading,
170 const std::string& line0,
171 const std::string& line1,
172 const std::string& line2,
173 bool& canceled,
174 const std::string& noLabel = "",
175 const std::string& yesLabel = "")
176 {
177 using namespace ::kodi::addon;
178 return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_button_text(CAddonBase::m_interface->toKodi->kodiBase,
179 heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str(),
180 &canceled, noLabel.c_str(), yesLabel.c_str());
181 }
182 //--------------------------------------------------------------------------
183 };
184 /// @}
185
186} /* namespace dialogs */
187} /* namespace gui */
188} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/CMakeLists.txt
deleted file mode 100644
index a9ab70c..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/CMakeLists.txt
+++ /dev/null
@@ -1,7 +0,0 @@
1set(HEADERS GL.h
2 GLonDX.h
3 Shader.h)
4
5if(NOT ENABLE_STATIC_LIBS)
6 core_add_library(addons_kodi-addon-dev-kit_include_kodi_gui_gl)
7endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GL.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GL.h
deleted file mode 100644
index 943c7d0..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GL.h
+++ /dev/null
@@ -1,111 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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//==============================================================================
12///
13/// \defgroup cpp_kodi_gui_gl OpenGL helpers
14/// \ingroup cpp_kodi_gui
15/// \brief Auxiliary functions for Open GL
16///
17/// This group includes help for definitions, functions, and classes for
18/// OpenGL.
19///
20/// To use OpenGL for your system, add the \ref GL.h "#include <kodi/gui/gl/GL.h>".
21///
22///
23///-----------------------------------------------------------------------------
24///
25/// The \ref HAS_GL is declared if Open GL is required and \ref HAS_GLES if Open GL
26/// Embedded Systems (ES) is required, with ES the version is additionally given
27/// in the definition, this can be "2" or "3".
28///
29///
30///-----------------------------------------------------------------------------
31///
32/// Following \ref GL_TYPE_STRING define can be used, for example, to manage
33/// different folders for GL and GLES and make the selection easier.
34/// This are on OpenGL <b>"GL"</b> and on Open GL|ES <b>"GLES"</b>.
35///
36/// **Example:**
37/// ~~~~~~~~~~~~~~~~~{.cpp}
38/// kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl");
39/// ~~~~~~~~~~~~~~~~~
40///
41///
42///----------------------------------------------------------------------------
43///
44/// In addition, \ref BUFFER_OFFSET is declared in it which can be used to give an
45/// offset on the array to GL.
46///
47/// **Example:**
48/// ~~~~~~~~~~~~~~~~~{.cpp}
49/// const struct PackedVertex {
50/// float position[3]; // Position x, y, z
51/// float color[4]; // Color r, g, b, a
52/// } vertices[3] = {
53/// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } },
54/// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
55/// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }
56/// };
57///
58/// glVertexAttribPointer(m_aPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, position)));
59/// glEnableVertexAttribArray(m_aPosition);
60///
61/// glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, color)));
62/// glEnableVertexAttribArray(m_aColor);
63/// ~~~~~~~~~~~~~~~~~
64
65#if HAS_GL
66 #define GL_TYPE_STRING "GL"
67 // always define GL_GLEXT_PROTOTYPES before include gl headers
68 #if !defined(GL_GLEXT_PROTOTYPES)
69 #define GL_GLEXT_PROTOTYPES
70 #endif
71 #if defined(TARGET_LINUX)
72 #include <GL/gl.h>
73 #include <GL/glext.h>
74 #elif defined(TARGET_FREEBSD)
75 #include <GL/gl.h>
76 #elif defined(TARGET_DARWIN)
77 #include <OpenGL/gl3.h>
78 #include <OpenGL/gl3ext.h>
79 #elif defined(WIN32)
80 #error Use of GL under Windows is not possible
81 #endif
82#elif HAS_GLES >= 2
83 #define GL_TYPE_STRING "GLES"
84 #if defined(WIN32)
85 #if defined(HAS_ANGLE)
86 #include <angle_gl.h>
87 #else
88 #error Use of GLES only be available under Windows by the use of angle
89 #endif
90 #elif defined(TARGET_DARWIN)
91 #if HAS_GLES == 3
92 #include <OpenGLES/ES3/gl.h>
93 #include <OpenGLES/ES3/glext.h>
94 #else
95 #include <OpenGLES/ES2/gl.h>
96 #include <OpenGLES/ES2/glext.h>
97 #endif
98 #else
99 #if HAS_GLES == 3
100 #include <GLES3/gl3.h>
101 #include <GLES3/gl3ext.h>
102 #else
103 #include <GLES2/gl2.h>
104 #include <GLES2/gl2ext.h>
105 #endif
106 #endif
107#endif
108
109#ifndef BUFFER_OFFSET
110#define BUFFER_OFFSET(i) ((char *)nullptr + (i))
111#endif
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GLonDX.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GLonDX.h
deleted file mode 100644
index 7a6a0a1..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/GLonDX.h
+++ /dev/null
@@ -1,369 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 <angle_gl.h>
12#include <d3d11.h>
13#include <d3dcompiler.h>
14#include <EGL/egl.h>
15#include <EGL/eglext.h>
16#include <kodi/AddonBase.h>
17#include <kodi/gui/General.h>
18#include <wrl/client.h>
19
20#pragma comment( lib, "d3dcompiler.lib" )
21#ifndef GL_CLIENT_VERSION
22#define GL_CLIENT_VERSION 3
23#endif
24
25namespace kodi
26{
27namespace gui
28{
29namespace gl
30{
31
32class ATTRIBUTE_HIDDEN CGLonDX : public kodi::gui::IRenderHelper
33{
34public:
35 explicit CGLonDX() : m_pContext(reinterpret_cast<ID3D11DeviceContext*>(kodi::gui::GetHWContext())) {}
36 ~CGLonDX() override { destruct(); }
37
38 bool Init() override
39 {
40 EGLint egl_display_attrs[] =
41 {
42 EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
43 EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE,
44 EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE,
45 EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE,
46 EGL_NONE
47 };
48 EGLint egl_config_attrs[] =
49 {
50 EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8,
51 EGL_BIND_TO_TEXTURE_RGBA, EGL_TRUE,
52 EGL_RENDERABLE_TYPE, GL_CLIENT_VERSION == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT,
53 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
54 EGL_NONE
55 };
56 EGLint egl_context_attrs[] =
57 {
58 EGL_CONTEXT_CLIENT_VERSION, GL_CLIENT_VERSION, EGL_NONE
59 };
60
61 m_eglDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, egl_display_attrs);
62 if (m_eglDisplay == EGL_NO_DISPLAY)
63 {
64 Log(ADDON_LOG_ERROR, "GLonDX: unable to get EGL display (%s)", eglGetErrorString());
65 return false;
66 }
67
68 if (eglInitialize(m_eglDisplay, nullptr, nullptr) != EGL_TRUE)
69 {
70 Log(ADDON_LOG_ERROR, "GLonDX: unable to init EGL display (%s)", eglGetErrorString());
71 return false;
72 }
73
74 EGLint numConfigs = 0;
75 if (eglChooseConfig(m_eglDisplay, egl_config_attrs, &m_eglConfig, 1, &numConfigs) != EGL_TRUE || numConfigs == 0)
76 {
77 Log(ADDON_LOG_ERROR, "GLonDX: unable to get EGL config (%s)", eglGetErrorString());
78 return false;
79 }
80
81 m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, nullptr, egl_context_attrs);
82 if (m_eglContext == EGL_NO_CONTEXT)
83 {
84 Log(ADDON_LOG_ERROR, "GLonDX: unable to create EGL context (%s)", eglGetErrorString());
85 return false;
86 }
87
88 if (!createD3DResources())
89 return false;
90
91 if (eglMakeCurrent(m_eglDisplay, m_eglBuffer, m_eglBuffer, m_eglContext) != EGL_TRUE)
92 {
93 Log(ADDON_LOG_ERROR, "GLonDX: unable to make current EGL (%s)", eglGetErrorString());
94 return false;
95 }
96 return true;
97 }
98
99 void CheckGL(ID3D11DeviceContext* device)
100 {
101 if (m_pContext != device)
102 {
103 m_pSRView = nullptr;
104 m_pVShader = nullptr;
105 m_pPShader = nullptr;
106 m_pContext = device;
107
108 if (m_eglBuffer != EGL_NO_SURFACE)
109 {
110 eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
111 eglDestroySurface(m_eglDisplay, m_eglBuffer);
112 m_eglBuffer = EGL_NO_SURFACE;
113 }
114
115 // create new resources
116 if (!createD3DResources())
117 return;
118
119 eglMakeCurrent(m_eglDisplay, m_eglBuffer, m_eglBuffer, m_eglContext);
120 }
121 }
122
123 void Begin() override
124 {
125 // confirm on begin D3D context is correct
126 CheckGL(reinterpret_cast<ID3D11DeviceContext*>(kodi::gui::GetHWContext()));
127
128 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
129 glClear(GL_COLOR_BUFFER_BIT);
130 }
131
132 void End() override
133 {
134 glFlush();
135
136 // set our primitive shaders
137 m_pContext->VSSetShader(m_pVShader.Get(), nullptr, 0);
138 m_pContext->PSSetShader(m_pPShader.Get(), nullptr, 0);
139 m_pContext->PSSetShaderResources(0, 1, m_pSRView.GetAddressOf());
140 // draw texture
141 m_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
142 m_pContext->IASetVertexBuffers(0, 0, nullptr, nullptr, nullptr);
143 m_pContext->IASetInputLayout(nullptr);
144 m_pContext->Draw(4, 0);
145 // unset shaders
146 m_pContext->PSSetShader(nullptr, nullptr, 0);
147 m_pContext->VSSetShader(nullptr, nullptr, 0);
148 // unbind our view
149 ID3D11ShaderResourceView* views[1] = {};
150 m_pContext->PSSetShaderResources(0, 1, views);
151 }
152
153private:
154 enum ShaderType
155 {
156 VERTEX_SHADER,
157 PIXEL_SHADER
158 };
159
160 bool createD3DResources()
161 {
162 HANDLE sharedHandle;
163 Microsoft::WRL::ComPtr<ID3D11Device> pDevice;
164 Microsoft::WRL::ComPtr<ID3D11RenderTargetView> pRTView;
165 Microsoft::WRL::ComPtr<ID3D11Resource> pRTResource;
166 Microsoft::WRL::ComPtr<ID3D11Texture2D> pRTTexture;
167 Microsoft::WRL::ComPtr<ID3D11Texture2D> pOffScreenTexture;
168 Microsoft::WRL::ComPtr<IDXGIResource> dxgiResource;
169
170 m_pContext->GetDevice(&pDevice);
171 m_pContext->OMGetRenderTargets(1, &pRTView, nullptr);
172 if (!pRTView)
173 return false;
174
175 pRTView->GetResource(&pRTResource);
176 if (FAILED(pRTResource.As(&pRTTexture)))
177 return false;
178
179 D3D11_TEXTURE2D_DESC texDesc;
180 pRTTexture->GetDesc(&texDesc);
181 texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
182 texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
183 texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
184 if (FAILED(pDevice->CreateTexture2D(&texDesc, nullptr, &pOffScreenTexture)))
185 {
186 Log(ADDON_LOG_ERROR, "GLonDX: unable to create intermediate texture");
187 return false;
188 }
189
190 CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(pOffScreenTexture.Get(), D3D11_SRV_DIMENSION_TEXTURE2D);
191 if (FAILED(pDevice->CreateShaderResourceView(pOffScreenTexture.Get(), &srvDesc, &m_pSRView)))
192 {
193 Log(ADDON_LOG_ERROR, "GLonDX: unable to create shader view");
194 return false;
195 }
196
197 if (FAILED(pOffScreenTexture.As(&dxgiResource)) ||
198 FAILED(dxgiResource->GetSharedHandle(&sharedHandle)))
199 {
200 Log(ADDON_LOG_ERROR, "GLonDX: unable get shared handle for texture");
201 return false;
202 }
203
204 // initiate simple shaders
205 if (FAILED(d3dCreateShader(VERTEX_SHADER, vs_out_shader_text, &m_pVShader)))
206 {
207 Log(ADDON_LOG_ERROR, "GLonDX: unable to create vertex shader view");
208 return false;
209 }
210
211 if (FAILED(d3dCreateShader(PIXEL_SHADER, ps_out_shader_text, &m_pPShader)))
212 {
213 Log(ADDON_LOG_ERROR, "GLonDX: unable to create pixel shader view");
214 return false;
215 }
216
217 // create EGL buffer from D3D shared texture
218 EGLint egl_buffer_attrs[] =
219 {
220 EGL_WIDTH, static_cast<EGLint>(texDesc.Width),
221 EGL_HEIGHT, static_cast<EGLint>(texDesc.Height),
222 EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
223 EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
224 EGL_NONE
225 };
226
227 m_eglBuffer = eglCreatePbufferFromClientBuffer(m_eglDisplay,
228 EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE,
229 sharedHandle, m_eglConfig, egl_buffer_attrs);
230
231 if (m_eglBuffer == EGL_NO_SURFACE)
232 {
233 Log(ADDON_LOG_ERROR, "GLonDX: unable to create EGL buffer (%s)", eglGetErrorString());
234 return false;
235 }
236 return true;
237 }
238
239 HRESULT d3dCreateShader(ShaderType shaderType, const std::string& source, IUnknown** ppShader) const
240 {
241 Microsoft::WRL::ComPtr<ID3DBlob> pBlob;
242 Microsoft::WRL::ComPtr<ID3DBlob> pErrors;
243
244 auto hr = D3DCompile(source.c_str(), source.length(), nullptr, nullptr, nullptr, "main",
245 shaderType == PIXEL_SHADER ? "ps_4_0" : "vs_4_0", 0, 0, &pBlob, &pErrors);
246
247 if (SUCCEEDED(hr))
248 {
249 Microsoft::WRL::ComPtr<ID3D11Device> pDevice;
250 m_pContext->GetDevice(&pDevice);
251
252 if (shaderType == PIXEL_SHADER)
253 {
254 hr = pDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), nullptr,
255 reinterpret_cast<ID3D11PixelShader**>(ppShader));
256 }
257 else
258 {
259 hr = pDevice->CreateVertexShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), nullptr,
260 reinterpret_cast<ID3D11VertexShader**>(ppShader));
261 }
262
263 if (FAILED(hr))
264 {
265 Log(ADDON_LOG_ERROR, "GLonDX: unable to create %s shader",
266 shaderType == PIXEL_SHADER ? "pixel" : "vertex");
267 }
268 }
269 else
270 {
271 Log(ADDON_LOG_ERROR, "GLonDX: unable to compile shader (%s)", pErrors->GetBufferPointer());
272 }
273 return hr;
274 }
275
276 static const char* eglGetErrorString()
277 {
278#define CASE_STR( value ) case value: return #value
279 switch (eglGetError())
280 {
281 CASE_STR(EGL_SUCCESS);
282 CASE_STR(EGL_NOT_INITIALIZED);
283 CASE_STR(EGL_BAD_ACCESS);
284 CASE_STR(EGL_BAD_ALLOC);
285 CASE_STR(EGL_BAD_ATTRIBUTE);
286 CASE_STR(EGL_BAD_CONTEXT);
287 CASE_STR(EGL_BAD_CONFIG);
288 CASE_STR(EGL_BAD_CURRENT_SURFACE);
289 CASE_STR(EGL_BAD_DISPLAY);
290 CASE_STR(EGL_BAD_SURFACE);
291 CASE_STR(EGL_BAD_MATCH);
292 CASE_STR(EGL_BAD_PARAMETER);
293 CASE_STR(EGL_BAD_NATIVE_PIXMAP);
294 CASE_STR(EGL_BAD_NATIVE_WINDOW);
295 CASE_STR(EGL_CONTEXT_LOST);
296 default:
297 return "Unknown";
298 }
299#undef CASE_STR
300 }
301
302 void destruct()
303 {
304 if (m_eglDisplay != EGL_NO_DISPLAY)
305 {
306 eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
307
308 if (m_eglBuffer != EGL_NO_SURFACE)
309 {
310 eglDestroySurface(m_eglDisplay, m_eglBuffer);
311 m_eglBuffer = EGL_NO_SURFACE;
312 }
313
314 if (m_eglContext != EGL_NO_CONTEXT)
315 {
316 eglDestroyContext(m_eglDisplay, m_eglContext);
317 m_eglContext = EGL_NO_CONTEXT;
318 }
319
320 eglTerminate(m_eglDisplay);
321 m_eglDisplay = EGL_NO_DISPLAY;
322 }
323
324 m_pSRView = nullptr;
325 m_pVShader = nullptr;
326 m_pPShader = nullptr;
327 m_pContext = nullptr;
328 }
329
330 EGLConfig m_eglConfig = EGL_NO_CONFIG_KHR;
331 EGLDisplay m_eglDisplay = EGL_NO_DISPLAY;
332 EGLContext m_eglContext = EGL_NO_CONTEXT;
333 EGLSurface m_eglBuffer = EGL_NO_SURFACE;
334
335 ID3D11DeviceContext* m_pContext = nullptr; // don't hold context
336 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_pSRView = nullptr;
337 Microsoft::WRL::ComPtr<ID3D11VertexShader> m_pVShader = nullptr;
338 Microsoft::WRL::ComPtr<ID3D11PixelShader> m_pPShader = nullptr;
339
340#define TO_STRING(...) #__VA_ARGS__
341 std::string vs_out_shader_text = TO_STRING(
342 void main(uint id : SV_VertexId, out float2 tex : TEXCOORD0, out float4 pos : SV_POSITION)
343 {
344 tex = float2(id % 2, (id % 4) >> 1);
345 pos = float4((tex.x - 0.5f) * 2, -(tex.y - 0.5f) * 2, 0, 1);
346 });
347
348 std::string ps_out_shader_text = TO_STRING(
349 Texture2D texMain : register(t0);
350 SamplerState Sampler
351 {
352 Filter = MIN_MAG_MIP_LINEAR;
353 AddressU = CLAMP;
354 AddressV = CLAMP;
355 Comparison = NEVER;
356 };
357
358 float4 main(in float2 tex : TEXCOORD0) : SV_TARGET
359 {
360 return texMain.Sample(Sampler, tex);
361 });
362#undef TO_STRING
363}; /* class CGLonDX */
364
365} /* namespace gl */
366
367using CRenderHelper = gl::CGLonDX;
368} /* namespace gui */
369} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/Shader.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/Shader.h
deleted file mode 100644
index 209f274..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/gl/Shader.h
+++ /dev/null
@@ -1,594 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 "GL.h"
12
13#include <stdio.h>
14#include <vector>
15#include <string>
16
17#include <kodi/AddonBase.h>
18#include <kodi/Filesystem.h>
19
20#define LOG_SIZE 1024
21#define GLchar char
22
23namespace kodi
24{
25namespace gui
26{
27namespace gl
28{
29
30//========================================================================
31/// CShader - base class
32class ATTRIBUTE_HIDDEN CShader
33{
34public:
35 CShader() = default;
36 virtual ~CShader() = default;
37 virtual bool Compile(const std::string& extraBegin = "",
38 const std::string& extraEnd = "") = 0;
39 virtual void Free() = 0;
40 virtual GLuint Handle() = 0;
41
42 bool LoadSource(const std::string& file)
43 {
44 char buffer[16384];
45
46 kodi::vfs::CFile source;
47 if (!source.OpenFile(file))
48 {
49 kodi::Log(ADDON_LOG_ERROR, "CShader::%s: Failed to open file '%s'", __FUNCTION__, file.c_str());
50 return false;
51 }
52 size_t len = source.Read(buffer, sizeof(buffer));
53 m_source.assign(buffer);
54 m_source[len] = 0;
55 source.Close();
56 return true;
57 }
58
59 bool OK() const { return m_compiled; }
60
61protected:
62 std::string m_source;
63 std::string m_lastLog;
64 bool m_compiled = false;
65};
66//------------------------------------------------------------------------
67
68//========================================================================
69/// CVertexShader
70class ATTRIBUTE_HIDDEN CVertexShader : public CShader
71{
72public:
73 CVertexShader() = default;
74 ~CVertexShader() override { Free(); }
75
76 void Free() override
77 {
78 if (m_vertexShader)
79 glDeleteShader(m_vertexShader);
80 m_vertexShader = 0;
81 }
82
83 bool Compile(const std::string& extraBegin = "",
84 const std::string& extraEnd = "") override
85 {
86 GLint params[4];
87
88 Free();
89
90 m_vertexShader = glCreateShader(GL_VERTEX_SHADER);
91
92 GLsizei count = 0;
93 const char *sources[3];
94 if (!extraBegin.empty())
95 sources[count++] = extraBegin.c_str();
96 if (!m_source.empty())
97 sources[count++] = m_source.c_str();
98 if (!extraEnd.empty())
99 sources[count++] = extraEnd.c_str();
100
101 glShaderSource(m_vertexShader, count, sources, nullptr);
102 glCompileShader(m_vertexShader);
103 glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params);
104 if (params[0] != GL_TRUE)
105 {
106 GLchar log[LOG_SIZE];
107 glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log);
108 kodi::Log(ADDON_LOG_ERROR, "CVertexShader::%s: %s", __FUNCTION__, log);
109 fprintf(stderr, "CVertexShader::%s: %s\n", __FUNCTION__, log);
110 m_lastLog = log;
111 m_compiled = false;
112 }
113 else
114 {
115 GLchar log[LOG_SIZE];
116 glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log);
117 m_lastLog = log;
118 m_compiled = true;
119 }
120 return m_compiled;
121 }
122
123 GLuint Handle() override { return m_vertexShader; }
124
125protected:
126 GLuint m_vertexShader = 0;
127};
128//------------------------------------------------------------------------
129
130//========================================================================
131/// CPixelShader
132class ATTRIBUTE_HIDDEN CPixelShader : public CShader
133{
134public:
135 CPixelShader() = default;
136 ~CPixelShader() { Free(); }
137 void Free() override
138 {
139 if (m_pixelShader)
140 glDeleteShader(m_pixelShader);
141 m_pixelShader = 0;
142 }
143
144 bool Compile(const std::string& extraBegin = "",
145 const std::string& extraEnd = "") override
146 {
147 GLint params[4];
148
149 Free();
150
151 m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER);
152
153 GLsizei count = 0;
154 const char *sources[3];
155 if (!extraBegin.empty())
156 sources[count++] = extraBegin.c_str();
157 if (!m_source.empty())
158 sources[count++] = m_source.c_str();
159 if (!extraEnd.empty())
160 sources[count++] = extraEnd.c_str();
161
162 glShaderSource(m_pixelShader, count, sources, 0);
163 glCompileShader(m_pixelShader);
164 glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params);
165 if (params[0] != GL_TRUE)
166 {
167 GLchar log[LOG_SIZE];
168 glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log);
169 kodi::Log(ADDON_LOG_ERROR, "CPixelShader::%s: %s", __FUNCTION__, log);
170 fprintf(stderr, "CPixelShader::%s: %s\n", __FUNCTION__, log);
171 m_lastLog = log;
172 m_compiled = false;
173 }
174 else
175 {
176 GLchar log[LOG_SIZE];
177 glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log);
178 m_lastLog = log;
179 m_compiled = true;
180 }
181 return m_compiled;
182 }
183
184 GLuint Handle() override { return m_pixelShader; }
185
186protected:
187 GLuint m_pixelShader = 0;
188};
189//------------------------------------------------------------------------
190
191//============================================================================
192///
193/// \defgroup cpp_kodi_gui_gl_CShaderProgram GL Shader Program
194/// \ingroup cpp_kodi_gui_gl
195/// @brief \cpp_class{ kodi::gui::gl::CShaderProgram }
196/// **Class to manage an OpenGL shader program**
197///
198/// With this class the used GL shader code can be defined on the GPU and
199/// its variables can be managed between CPU and GPU.
200///
201/// It has the header \ref Shader.h "#include <kodi/gui/gl/Shader.h>"
202/// be included to enjoy it.
203///
204/// ----------------------------------------------------------------------------
205///
206/// <b>Example:</b>
207///
208/// ~~~~~~~~~~~~~{.cpp}
209///
210/// #include <kodi/gui/gl/Shader.h>
211/// ...
212///
213/// class ATTRIBUTE_HIDDEN CExample
214/// : ...,
215/// public kodi::gui::gl::CShaderProgram
216/// {
217/// public:
218/// CExample() = default;
219///
220/// bool Start();
221/// void Render();
222///
223/// // override functions for kodi::gui::gl::CShaderProgram
224/// void OnCompiledAndLinked() override;
225/// bool OnEnabled() override;
226///
227/// private:
228/// ...
229/// GLint m_aPosition = -1;
230/// GLint m_aColor = -1;
231/// };
232///
233/// bool CExample::Start()
234/// {
235/// // Define shaders and load
236/// std::string fraqShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.frag");
237/// std::string vertShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.vert");
238/// if (!LoadShaderFiles(vertShader, fraqShader) || !CompileAndLink())
239/// return false;
240///
241/// ...
242/// return true;
243/// }
244///
245/// ...
246///
247/// void CExample::Render()
248/// {
249/// ...
250///
251/// EnableShader();
252/// ...
253/// DO WORK
254/// ...
255/// DisableShader();
256/// }
257///
258/// void CExample::OnCompiledAndLinked()
259/// {
260/// ...
261/// DO YOUR WORK HERE FOR WHAT IS ONE TIME REQUIRED DURING COMPILE OF SHADER, E.G.:
262///
263/// m_aPosition = glGetAttribLocation(ProgramHandle(), "a_position");
264/// m_aColor = glGetAttribLocation(ProgramHandle(), "a_color");
265/// }
266///
267/// bool OnEnabled() override
268/// {
269/// ...
270/// DO YOUR WORK HERE FOR WHAT REQUIRED DURING ENABLE OF SHADER
271/// ...
272/// return true;
273/// }
274///
275/// ADDONCREATOR(CExample);
276/// ~~~~~~~~~~~~~
277///
278
279//========================================================================
280/// CShaderProgram
281class ATTRIBUTE_HIDDEN CShaderProgram
282{
283public:
284 //==========================================================================
285 ///
286 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
287 /// @brief Construct a new shader
288 ///
289 /// Load must be done later with \ref LoadShaderFiles.
290 ///
291 CShaderProgram() = default;
292 //--------------------------------------------------------------------------
293
294 //==========================================================================
295 ///
296 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
297 /// @brief Construct a new shader and load defined shader files
298 ///
299 /// @param[in] vert Path to used GL vertext shader
300 /// @param[in] frag Path to used GL fragment shader
301 ///
302 CShaderProgram(const std::string& vert, const std::string& frag)
303 {
304 LoadShaderFiles(vert, frag);
305 }
306 //--------------------------------------------------------------------------
307
308 //==========================================================================
309 ///
310 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
311 /// @brief Destructor
312 ///
313 virtual ~CShaderProgram()
314 {
315 ShaderFree();
316 }
317 //--------------------------------------------------------------------------
318
319 //==========================================================================
320 ///
321 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
322 /// @brief To load manually the needed shader files
323 ///
324 /// @param[in] vert Path to used GL vertext shader
325 /// @param[in] frag Path to used GL fragment shader
326 ///
327 ///
328 /// @note The use of the files is optional, but it must either be passed over
329 /// here or via \ref CompileAndLink, or both of the source code.
330 ///
331 bool LoadShaderFiles(const std::string& vert, const std::string& frag)
332 {
333 if (!kodi::vfs::FileExists(vert) || !m_pVP.LoadSource(vert))
334 {
335 kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, vert.c_str());
336 return false;
337 }
338
339 if (!kodi::vfs::FileExists(frag) || !m_pFP.LoadSource(frag))
340 {
341 kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, frag.c_str());
342 return false;
343 }
344
345 return true;
346 }
347 //--------------------------------------------------------------------------
348
349 //==========================================================================
350 ///
351 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
352 /// @brief To compile and link the shader to the GL interface
353 ///
354 /// Optionally, additional source code can be transferred here, or it can be
355 /// used independently without any files
356 ///
357 /// @param[in] vertexExtraBegin [opt] To additionally add vextex source
358 /// code to the beginning of the loaded file
359 /// source code
360 /// @param[in] vertexExtraEnd [opt] To additionally add vextex source
361 /// code to the end of the loaded file
362 /// source code
363 /// @param[in] fragmentExtraBegin [opt] To additionally add fragment source
364 /// code to the beginning of the loaded file
365 /// source code
366 /// @param[in] fragmentExtraEnd [opt] To additionally add fragment source
367 /// code to the end of the loaded file
368 /// source code
369 /// @return true if compile was successed
370 ///
371 ///
372 /// @note In the case of a compile error, it will be written once into the Kodi
373 /// log and in addition to the console output to quickly detect the errors when
374 /// writing the damage.
375 ///
376 ///
377 bool CompileAndLink(const std::string& vertexExtraBegin = "",
378 const std::string& vertexExtraEnd = "",
379 const std::string& fragmentExtraBegin = "",
380 const std::string& fragmentExtraEnd = "")
381 {
382 GLint params[4];
383
384 // free resources
385 ShaderFree();
386 m_ok = false;
387
388 // compiled vertex shader
389 if (!m_pVP.Compile(vertexExtraBegin, vertexExtraEnd))
390 {
391 kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling vertex shader");
392 return false;
393 }
394
395 // compile pixel shader
396 if (!m_pFP.Compile(fragmentExtraBegin, fragmentExtraEnd))
397 {
398 m_pVP.Free();
399 kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling fragment shader");
400 return false;
401 }
402
403 // create program object
404 m_shaderProgram = glCreateProgram();
405 if (!m_shaderProgram)
406 {
407 kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: Failed to create GL program", __FUNCTION__);
408 ShaderFree();
409 return false;
410 }
411
412 // attach the vertex shader
413 glAttachShader(m_shaderProgram, m_pVP.Handle());
414 glAttachShader(m_shaderProgram, m_pFP.Handle());
415
416 // link the program
417 glLinkProgram(m_shaderProgram);
418 glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params);
419 if (params[0] != GL_TRUE)
420 {
421 GLchar log[LOG_SIZE];
422 glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log);
423 kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log);
424 fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log);
425 ShaderFree();
426 return false;
427 }
428
429 m_validated = false;
430 m_ok = true;
431 OnCompiledAndLinked();
432 return true;
433 }
434 //--------------------------------------------------------------------------
435
436 //==========================================================================
437 ///
438 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
439 /// @brief To activate the shader and use it on the GPU
440 ///
441 /// @return true if enable was successfull done
442 ///
443 ///
444 /// @note During this call, the \ref OnEnabled stored in the child is also
445 /// called
446 ///
447 bool EnableShader()
448 {
449 if (ShaderOK())
450 {
451 glUseProgram(m_shaderProgram);
452 if (OnEnabled())
453 {
454 if (!m_validated)
455 {
456 // validate the program
457 GLint params[4];
458 glValidateProgram(m_shaderProgram);
459 glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params);
460 if (params[0] != GL_TRUE)
461 {
462 GLchar log[LOG_SIZE];
463 glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log);
464 kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log);
465 fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log);
466 }
467 m_validated = true;
468 }
469 return true;
470 }
471 else
472 {
473 glUseProgram(0);
474 return false;
475 }
476 return true;
477 }
478 return false;
479 }
480 //--------------------------------------------------------------------------
481
482 //==========================================================================
483 ///
484 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
485 /// @brief To deactivate the shader use on the GPU
486 ///
487 void DisableShader()
488 {
489 if (ShaderOK())
490 {
491 glUseProgram(0);
492 OnDisabled();
493 }
494 }
495 //--------------------------------------------------------------------------
496
497 //==========================================================================
498 ///
499 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
500 /// @brief Used to check if shader has been loaded before.
501 ///
502 /// @return true if enable was successfull done
503 ///
504 /// @note The CompileAndLink call sets these values
505 ///
506 ATTRIBUTE_FORCEINLINE bool ShaderOK() const { return m_ok; }
507 //--------------------------------------------------------------------------
508
509 //==========================================================================
510 ///
511 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
512 /// @brief To get the vertex shader class used by Kodi at the addon
513 ///
514 /// @return pointer to vertex shader class
515 ///
516 ATTRIBUTE_FORCEINLINE CVertexShader& VertexShader() { return m_pVP; }
517 //--------------------------------------------------------------------------
518
519 //==========================================================================
520 ///
521 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
522 /// @brief To get the fragment shader class used by Kodi at the addon
523 ///
524 /// @return pointer to fragment shader class
525 ///
526 ATTRIBUTE_FORCEINLINE CPixelShader& PixelShader() { return m_pFP; }
527 //--------------------------------------------------------------------------
528
529 //==========================================================================
530 ///
531 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
532 /// @brief Used to get the definition created in the OpenGL itself
533 ///
534 /// @return GLuint of GL shader program handler
535 ///
536 ATTRIBUTE_FORCEINLINE GLuint ProgramHandle() { return m_shaderProgram; }
537 //--------------------------------------------------------------------------
538
539 //==========================================================================
540 ///
541 /// \defgroup cpp_kodi_gui_gl_CShaderProgram_child Child Functions
542 /// \ingroup cpp_kodi_gui_gl_CShaderProgram
543 /// @brief \cpp_class{ kodi::gui::gl::CShaderProgram child functions }
544 ///
545 /// Functions that are added by parent in the child
546 //@{
547 //==========================================================================
548 ///
549 /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child
550 /// @brief Mandatory child function to set the necessary CPU to GPU data
551 ///
552 virtual void OnCompiledAndLinked() {};
553 //--------------------------------------------------------------------------
554
555 //==========================================================================
556 ///
557 /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child
558 /// @brief Optional function to exchange data between CPU and GPU while
559 /// activating the shader
560 ///
561 /// @return true if enable was successfull done
562 ///
563 virtual bool OnEnabled() { return true; };
564 //--------------------------------------------------------------------------
565
566 //==========================================================================
567 ///
568 /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child
569 /// @brief Optional child function that may have to be performed when
570 /// switching off the shader
571 virtual void OnDisabled() {};
572 //--------------------------------------------------------------------------
573 //@}
574
575private:
576 void ShaderFree()
577 {
578 if (m_shaderProgram)
579 glDeleteProgram(m_shaderProgram);
580 m_shaderProgram = 0;
581 m_ok = false;
582 }
583
584 CVertexShader m_pVP;
585 CPixelShader m_pFP;
586 GLuint m_shaderProgram = 0;
587 bool m_ok = false;
588 bool m_validated = false;
589};
590//------------------------------------------------------------------------
591
592} /* namespace gl */
593} /* namespace gui */
594} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/renderHelper.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/renderHelper.h
deleted file mode 100644
index 2e96d21..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/renderHelper.h
+++ /dev/null
@@ -1,78 +0,0 @@
1/*
2 * Copyright (C) 2005-2019 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 "../AddonBase.h"
12
13namespace kodi
14{
15namespace gui
16{
17struct ATTRIBUTE_HIDDEN IRenderHelper
18{
19 virtual ~IRenderHelper() = default;
20 virtual bool Init() = 0;
21 virtual void Begin() = 0;
22 virtual void End() = 0;
23}; /* class IRenderHelper */
24} /* namespace gui */
25} /* namespace kodi */
26
27#if defined(WIN32) && defined(HAS_ANGLE)
28#include "gl/GLonDX.h"
29#else
30/*
31 * Default background GUI render helper class
32 */
33namespace kodi
34{
35namespace gui
36{
37struct ATTRIBUTE_HIDDEN CRenderHelperStub : public IRenderHelper
38{
39 bool Init() override { return true; }
40 void Begin() override { }
41 void End() override { }
42}; /* class CRenderHelperStub */
43
44using CRenderHelper = CRenderHelperStub;
45} /* namespace gui */
46} /* namespace kodi */
47#endif
48
49namespace kodi
50{
51namespace gui
52{
53
54/*
55 * Create render background handler, e.g. becomes on "Windows" Angle used
56 * to emulate GL.
57 *
58 * This only be used internal and not from addon's direct.
59 *
60 * Function defines here and not in CAddonBase because of a hen and egg problem.
61 */
62inline std::shared_ptr<IRenderHelper> ATTRIBUTE_HIDDEN GetRenderHelper()
63{
64 using namespace ::kodi::addon;
65 if (static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper)
66 return static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper;
67
68 const std::shared_ptr<kodi::gui::IRenderHelper> renderHelper(new CRenderHelper());
69 if (!renderHelper->Init())
70 return nullptr;
71
72 static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper =
73 renderHelper; // Hold on base for other types
74 return renderHelper;
75}
76
77} /* namespace gui */
78} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/platform/android/System.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/platform/android/System.h
deleted file mode 100644
index ef2d728..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/platform/android/System.h
+++ /dev/null
@@ -1,114 +0,0 @@
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 "../../AddonBase.h"
12
13/*
14 * For interface between add-on and kodi.
15 *
16 * This structure defines the addresses of functions stored inside Kodi which
17 * are then available for the add-on to call
18 *
19 * All function pointers there are used by the C++ interface functions below.
20 * You find the set of them on xbmc/addons/interfaces/General.cpp
21 *
22 * Note: For add-on development itself this is not needed
23 */
24
25static const char* INTERFACE_ANDROID_SYSTEM_NAME = "ANDROID_SYSTEM";
26static const char* INTERFACE_ANDROID_SYSTEM_VERSION = "1.0.1";
27static const char* INTERFACE_ANDROID_SYSTEM_VERSION_MIN = "1.0.1";
28
29struct AddonToKodiFuncTable_android_system
30{
31 void* (*get_jni_env)();
32 int (*get_sdk_version)();
33 const char *(*get_class_name)();
34};
35
36//==============================================================================
37///
38/// \defgroup cpp_kodi_platform Interface - kodi::platform
39/// \ingroup cpp
40/// @brief **Android platform specific functions**
41///
42/// #include <kodi/platform/android/System.h>"
43///
44//------------------------------------------------------------------------------
45
46namespace kodi
47{
48namespace platform
49{
50class ATTRIBUTE_HIDDEN CInterfaceAndroidSystem
51{
52public:
53 CInterfaceAndroidSystem()
54 : m_interface(static_cast<AddonToKodiFuncTable_android_system*>(
55 GetInterface(INTERFACE_ANDROID_SYSTEM_NAME, INTERFACE_ANDROID_SYSTEM_VERSION))){};
56
57 //============================================================================
58 ///
59 /// \ingroup cpp_kodi_platform
60 /// @brief request an JNI env pointer for the calling thread.
61 /// JNI env has to be controlled by kodi because of the underlying
62 /// threading concep.
63 ///
64 /// @param[in]:
65 /// @return JNI env pointer for the calling thread
66 ///
67 inline void* GetJNIEnv()
68 {
69 if (m_interface)
70 return m_interface->get_jni_env();
71
72 return nullptr;
73 }
74 //----------------------------------------------------------------------------
75
76 //============================================================================
77 ///
78 /// \ingroup cpp_kodi_platform
79 /// @brief request the android sdk version to e.g. initialize JNIBase.
80 ///
81 /// @param[in]:
82 /// @return Android SDK version
83 ///
84 inline int GetSDKVersion()
85 {
86 if (m_interface)
87 return m_interface->get_sdk_version();
88
89 return 0;
90 }
91
92 //============================================================================
93 ///
94 /// \ingroup cpp_kodi_platform
95 /// @brief request the android main class name e.g. org.xbmc.kodi.
96 ///
97 /// @param[in]:
98 /// @return package class name
99 ///
100 inline std::string GetClassName()
101 {
102 if (m_interface)
103 return m_interface->get_class_name();
104
105 return std::string();
106 }
107
108private:
109 AddonToKodiFuncTable_android_system* m_interface;
110};
111//----------------------------------------------------------------------------
112
113} /* namespace platform */
114} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/CMakeLists.txt b/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/CMakeLists.txt
deleted file mode 100644
index 939585c..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
1set(HEADERS DllHelper.h )
2
3if(NOT ENABLE_STATIC_LIBS)
4 core_add_library(addons_kodi-addon-dev-kit_include_kodi_tools)
5endif()
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/DllHelper.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/DllHelper.h
deleted file mode 100644
index 3cc9eea..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/tools/DllHelper.h
+++ /dev/null
@@ -1,211 +0,0 @@
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#ifdef __cplusplus
12
13#include <string>
14
15#include <dlfcn.h>
16#include <kodi/AddonBase.h>
17#include <kodi/Filesystem.h>
18
19//==============================================================================
20/// @ingroup cpp_kodi_tools_CDllHelper
21/// @brief Macro to translate the given pointer value name of functions to
22/// requested function name.
23///
24/// @note This should always be used and does the work of
25/// @ref kodi::tools::CDllHelper::RegisterSymbol().
26///
27#define REGISTER_DLL_SYMBOL(functionPtr) \
28 kodi::tools::CDllHelper::RegisterSymbol(functionPtr, #functionPtr)
29//------------------------------------------------------------------------------
30
31namespace kodi
32{
33namespace tools
34{
35
36//==============================================================================
37/// @defgroup cpp_kodi_tools_CDllHelper class CDllHelper
38/// @ingroup cpp_kodi_tools
39/// @brief **Class to help with load of shared library functions**\n
40/// You can add them as parent to your class and to help with load of shared
41/// library functions.
42///
43/// @note To use on Windows must you also include [dlfcn-win32](https://github.com/dlfcn-win32/dlfcn-win32)
44/// on your addon!\n\n
45/// Furthermore, this allows the use of Android where the required library is
46/// copied to an EXE useable folder.
47///
48///
49/// ----------------------------------------------------------------------------
50///
51/// **Example:**
52/// ~~~~~~~~~~~~~{.cpp}
53///
54/// #include <kodi/tools/DllHelper.h>
55///
56/// ...
57/// class CMyInstance : public kodi::addon::CInstanceAudioDecoder,
58/// private kodi::tools::CDllHelper
59/// {
60/// public:
61/// CMyInstance(KODI_HANDLE instance, const std::string& kodiVersion);
62/// bool Start();
63///
64/// ...
65///
66/// // The pointers for on shared library exported functions
67/// int (*Init)();
68/// void (*Cleanup)();
69/// int (*GetLength)();
70/// };
71///
72/// CMyInstance::CMyInstance(KODI_HANDLE instance, const std::string& kodiVersion)
73/// : CInstanceAudioDecoder(instance, kodiVersion)
74/// {
75/// }
76///
77/// bool CMyInstance::Start()
78/// {
79/// std::string lib = kodi::GetAddonPath("myLib.so");
80/// if (!LoadDll(lib)) return false;
81/// if (!REGISTER_DLL_SYMBOL(Init)) return false;
82/// if (!REGISTER_DLL_SYMBOL(Cleanup)) return false;
83/// if (!REGISTER_DLL_SYMBOL(GetLength)) return false;
84///
85/// Init();
86/// return true;
87/// }
88/// ...
89/// ~~~~~~~~~~~~~
90///
91///@{
92class ATTRIBUTE_HIDDEN CDllHelper
93{
94public:
95 //============================================================================
96 /// @ingroup cpp_kodi_tools_CDllHelper
97 /// @brief Class constructor.
98 ///
99 CDllHelper() = default;
100 //----------------------------------------------------------------------------
101
102 //============================================================================
103 /// @ingroup cpp_kodi_tools_CDllHelper
104 /// @brief Class destructor.
105 ///
106 virtual ~CDllHelper()
107 {
108 if (m_dll)
109 dlclose(m_dll);
110 }
111 //----------------------------------------------------------------------------
112
113 //============================================================================
114 /// @ingroup cpp_kodi_tools_CDllHelper
115 /// @brief Function to load requested library.
116 ///
117 /// @param[in] path The path with filename of shared library to load
118 /// @return true if load was successful done
119 ///
120 bool LoadDll(std::string path)
121 {
122#if defined(TARGET_ANDROID)
123 if (kodi::vfs::FileExists(path))
124 {
125 // Check already defined for "xbmcaltbinaddons", if yes no copy necassary.
126 std::string xbmcaltbinaddons =
127 kodi::vfs::TranslateSpecialProtocol("special://xbmcaltbinaddons/");
128 if (path.compare(0, xbmcaltbinaddons.length(), xbmcaltbinaddons) != 0)
129 {
130 bool doCopy = true;
131 std::string dstfile = xbmcaltbinaddons + kodi::vfs::GetFileName(path);
132
133 kodi::vfs::FileStatus dstFileStat;
134 if (kodi::vfs::StatFile(dstfile, dstFileStat))
135 {
136 kodi::vfs::FileStatus srcFileStat;
137 if (kodi::vfs::StatFile(path, srcFileStat))
138 {
139 if (dstFileStat.GetSize() == srcFileStat.GetSize() &&
140 dstFileStat.GetModificationTime() > srcFileStat.GetModificationTime())
141 doCopy = false;
142 }
143 }
144
145 if (doCopy)
146 {
147 kodi::Log(ADDON_LOG_DEBUG, "Caching '%s' to '%s'", path.c_str(), dstfile.c_str());
148 if (!kodi::vfs::CopyFile(path, dstfile))
149 {
150 kodi::Log(ADDON_LOG_ERROR, "Failed to cache '%s' to '%s'", path.c_str(),
151 dstfile.c_str());
152 return false;
153 }
154 }
155
156 path = dstfile;
157 }
158 }
159 else
160 {
161 return false;
162 }
163#endif
164
165 m_dll = dlopen(path.c_str(), RTLD_LAZY);
166 if (m_dll == nullptr)
167 {
168 kodi::Log(ADDON_LOG_ERROR, "Unable to load %s", dlerror());
169 return false;
170 }
171 return true;
172 }
173 //----------------------------------------------------------------------------
174
175 //============================================================================
176 /// @ingroup cpp_kodi_tools_CDllHelper
177 /// @brief Function to register requested library symbol.
178 ///
179 /// @warning This function should not be used, use instead the macro
180 /// @ref REGISTER_DLL_SYMBOL to register the symbol pointer.
181 ///
182 ///
183 /// Use this always via Macro, e.g.:
184 /// ~~~~~~~~~~~~~{.cpp}
185 /// if (!REGISTER_DLL_SYMBOL(Init))
186 /// return false;
187 /// ~~~~~~~~~~~~~
188 ///
189 template <typename T>
190 bool RegisterSymbol(T& functionPtr, const char* strFunctionPtr)
191 {
192 functionPtr = reinterpret_cast<T>(dlsym(m_dll, strFunctionPtr));
193 if (functionPtr == nullptr)
194 {
195 kodi::Log(ADDON_LOG_ERROR, "Unable to assign function %s", dlerror());
196 return false;
197 }
198 return true;
199 }
200 //----------------------------------------------------------------------------
201
202private:
203 void* m_dll = nullptr;
204};
205///@}
206//------------------------------------------------------------------------------
207
208} /* namespace tools */
209} /* namespace kodi */
210
211#endif /* __cplusplus */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h
deleted file mode 100644
index 041e22b..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h
+++ /dev/null
@@ -1,482 +0,0 @@
1/*
2 * Copyright (C) 2016-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 <string.h>
12
13#define STR_HELPER(x) #x
14#define STR(x) STR_HELPER(x)
15
16/*
17 *------------------------------------------------------------------------------
18 * Some parts on headers are only be used for Kodi itself and internally (not
19 * for add-on development).
20 *
21 * For this reason also no doxygen part with "///" defined there.
22 * -----------------------------------------------------------------------------
23 */
24
25/*
26 * Versions of all add-on globals and instances are defined below.
27 *
28 * This is added here and not in related header to prevent not
29 * needed includes during compile. Also have it here a better
30 * overview.
31 */
32
33// Ignore clang here, as this must be good in overview and as the main reason,
34// because cmake uses this area in this form to perform its addon dependency
35// check.
36// clang-format off
37#define ADDON_GLOBAL_VERSION_MAIN "1.2.4"
38#define ADDON_GLOBAL_VERSION_MAIN_MIN "1.2.0"
39#define ADDON_GLOBAL_VERSION_MAIN_XML_ID "kodi.binary.global.main"
40#define ADDON_GLOBAL_VERSION_MAIN_DEPENDS "AddonBase.h" \
41 "addon-instance/" \
42 "c-api/addon_base.h"
43
44#define ADDON_GLOBAL_VERSION_GENERAL "1.0.5"
45#define ADDON_GLOBAL_VERSION_GENERAL_MIN "1.0.4"
46#define ADDON_GLOBAL_VERSION_GENERAL_XML_ID "kodi.binary.global.general"
47#define ADDON_GLOBAL_VERSION_GENERAL_DEPENDS "General.h"
48
49#define ADDON_GLOBAL_VERSION_GUI "5.14.1"
50#define ADDON_GLOBAL_VERSION_GUI_MIN "5.14.0"
51#define ADDON_GLOBAL_VERSION_GUI_XML_ID "kodi.binary.global.gui"
52#define ADDON_GLOBAL_VERSION_GUI_DEPENDS "ActionIDs.h" \
53 "gui/"
54
55#define ADDON_GLOBAL_VERSION_AUDIOENGINE "1.1.1"
56#define ADDON_GLOBAL_VERSION_AUDIOENGINE_MIN "1.1.0"
57#define ADDON_GLOBAL_VERSION_AUDIOENGINE_XML_ID "kodi.binary.global.audioengine"
58#define ADDON_GLOBAL_VERSION_AUDIOENGINE_DEPENDS "AudioEngine.h" \
59 "c-api/audio_engine.h"
60
61#define ADDON_GLOBAL_VERSION_FILESYSTEM "1.1.4"
62#define ADDON_GLOBAL_VERSION_FILESYSTEM_MIN "1.1.0"
63#define ADDON_GLOBAL_VERSION_FILESYSTEM_XML_ID "kodi.binary.global.filesystem"
64#define ADDON_GLOBAL_VERSION_FILESYSTEM_DEPENDS "Filesystem.h" \
65 "c-api/filesystem.h" \
66 "gui/gl/Shader.h" \
67 "tools/DllHelper.h"
68
69#define ADDON_GLOBAL_VERSION_NETWORK "1.0.4"
70#define ADDON_GLOBAL_VERSION_NETWORK_MIN "1.0.0"
71#define ADDON_GLOBAL_VERSION_NETWORK_XML_ID "kodi.binary.global.network"
72#define ADDON_GLOBAL_VERSION_NETWORK_DEPENDS "Network.h" \
73 "c-api/network.h"
74
75#define ADDON_GLOBAL_VERSION_TOOLS "1.0.1"
76#define ADDON_GLOBAL_VERSION_TOOLS_MIN "1.0.0"
77#define ADDON_GLOBAL_VERSION_TOOLS_XML_ID "kodi.binary.global.tools"
78#define ADDON_GLOBAL_VERSION_TOOLS_DEPENDS "tools/DllHelper.h"
79
80#define ADDON_INSTANCE_VERSION_AUDIODECODER "2.0.2"
81#define ADDON_INSTANCE_VERSION_AUDIODECODER_MIN "2.0.1"
82#define ADDON_INSTANCE_VERSION_AUDIODECODER_XML_ID "kodi.binary.instance.audiodecoder"
83#define ADDON_INSTANCE_VERSION_AUDIODECODER_DEPENDS "addon-instance/AudioDecoder.h"
84
85#define ADDON_INSTANCE_VERSION_AUDIOENCODER "2.0.2"
86#define ADDON_INSTANCE_VERSION_AUDIOENCODER_MIN "2.0.1"
87#define ADDON_INSTANCE_VERSION_AUDIOENCODER_XML_ID "kodi.binary.instance.audioencoder"
88#define ADDON_INSTANCE_VERSION_AUDIOENCODER_DEPENDS "addon-instance/AudioEncoder.h"
89
90#define ADDON_INSTANCE_VERSION_GAME "2.0.2"
91#define ADDON_INSTANCE_VERSION_GAME_MIN "2.0.1"
92#define ADDON_INSTANCE_VERSION_GAME_XML_ID "kodi.binary.instance.game"
93#define ADDON_INSTANCE_VERSION_GAME_DEPENDS "addon-instance/Game.h"
94
95#define ADDON_INSTANCE_VERSION_IMAGEDECODER "2.1.1"
96#define ADDON_INSTANCE_VERSION_IMAGEDECODER_MIN "2.1.0"
97#define ADDON_INSTANCE_VERSION_IMAGEDECODER_XML_ID "kodi.binary.instance.imagedecoder"
98#define ADDON_INSTANCE_VERSION_IMAGEDECODER_DEPENDS "addon-instance/ImageDecoder.h"
99
100#define ADDON_INSTANCE_VERSION_INPUTSTREAM "2.3.3"
101#define ADDON_INSTANCE_VERSION_INPUTSTREAM_MIN "2.3.1"
102#define ADDON_INSTANCE_VERSION_INPUTSTREAM_XML_ID "kodi.binary.instance.inputstream"
103#define ADDON_INSTANCE_VERSION_INPUTSTREAM_DEPENDS "addon-instance/Inputstream.h"
104
105#define ADDON_INSTANCE_VERSION_PERIPHERAL "1.3.9"
106#define ADDON_INSTANCE_VERSION_PERIPHERAL_MIN "1.3.8"
107#define ADDON_INSTANCE_VERSION_PERIPHERAL_XML_ID "kodi.binary.instance.peripheral"
108#define ADDON_INSTANCE_VERSION_PERIPHERAL_DEPENDS "addon-instance/Peripheral.h" \
109 "addon-instance/PeripheralUtils.h"
110
111#define ADDON_INSTANCE_VERSION_PVR "7.0.1"
112#define ADDON_INSTANCE_VERSION_PVR_MIN "7.0.0"
113#define ADDON_INSTANCE_VERSION_PVR_XML_ID "kodi.binary.instance.pvr"
114#define ADDON_INSTANCE_VERSION_PVR_DEPENDS "c-api/addon-instance/pvr.h" \
115 "c-api/addon-instance/pvr/pvr_channel_groups.h" \
116 "c-api/addon-instance/pvr/pvr_channels.h" \
117 "c-api/addon-instance/pvr/pvr_defines.h" \
118 "c-api/addon-instance/pvr/pvr_edl.h" \
119 "c-api/addon-instance/pvr/pvr_epg.h" \
120 "c-api/addon-instance/pvr/pvr_general.h" \
121 "c-api/addon-instance/pvr/pvr_menu_hook.h" \
122 "c-api/addon-instance/pvr/pvr_recordings.h" \
123 "c-api/addon-instance/pvr/pvr_stream.h" \
124 "c-api/addon-instance/pvr/pvr_timers.h" \
125 "addon-instance/PVR.h" \
126 "addon-instance/pvr/ChannelGroups.h" \
127 "addon-instance/pvr/Channels.h" \
128 "addon-instance/pvr/EDL.h" \
129 "addon-instance/pvr/EPG.h" \
130 "addon-instance/pvr/General.h" \
131 "addon-instance/pvr/MenuHook.h" \
132 "addon-instance/pvr/Recordings.h" \
133 "addon-instance/pvr/Stream.h" \
134 "addon-instance/pvr/Timers.h"
135
136#define ADDON_INSTANCE_VERSION_SCREENSAVER "2.0.2"
137#define ADDON_INSTANCE_VERSION_SCREENSAVER_MIN "2.0.1"
138#define ADDON_INSTANCE_VERSION_SCREENSAVER_XML_ID "kodi.binary.instance.screensaver"
139#define ADDON_INSTANCE_VERSION_SCREENSAVER_DEPENDS "addon-instance/Screensaver.h"
140
141#define ADDON_INSTANCE_VERSION_VFS "2.3.2"
142#define ADDON_INSTANCE_VERSION_VFS_MIN "2.3.1"
143#define ADDON_INSTANCE_VERSION_VFS_XML_ID "kodi.binary.instance.vfs"
144#define ADDON_INSTANCE_VERSION_VFS_DEPENDS "addon-instance/VFS.h"
145
146#define ADDON_INSTANCE_VERSION_VISUALIZATION "2.0.4"
147#define ADDON_INSTANCE_VERSION_VISUALIZATION_MIN "2.0.3"
148#define ADDON_INSTANCE_VERSION_VISUALIZATION_XML_ID "kodi.binary.instance.visualization"
149#define ADDON_INSTANCE_VERSION_VISUALIZATION_DEPENDS "addon-instance/Visualization.h"
150
151#define ADDON_INSTANCE_VERSION_VIDEOCODEC "1.0.3"
152#define ADDON_INSTANCE_VERSION_VIDEOCODEC_MIN "1.0.2"
153#define ADDON_INSTANCE_VERSION_VIDEOCODEC_XML_ID "kodi.binary.instance.videocodec"
154#define ADDON_INSTANCE_VERSION_VIDEOCODEC_DEPENDS "addon-instance/VideoCodec.h" \
155 "StreamCodec.h" \
156 "StreamCrypto.h"
157// clang-format on
158
159//==============================================================================
160///
161/// @ingroup cpp_kodi_addon_addonbase
162/// The currently available instance types for Kodi add-ons
163///
164/// \internal
165/// @note For add of new types take a new number on end. To change
166/// existing numbers can be make problems on already compiled add-ons.
167/// \endinternal
168///
169typedef enum ADDON_TYPE
170{
171 /* addon global parts */
172 ADDON_GLOBAL_MAIN = 0,
173 ADDON_GLOBAL_GUI = 1,
174 ADDON_GLOBAL_AUDIOENGINE = 2,
175 ADDON_GLOBAL_GENERAL = 3,
176 ADDON_GLOBAL_NETWORK = 4,
177 ADDON_GLOBAL_FILESYSTEM = 5,
178 ADDON_GLOBAL_TOOLS = 6,
179 // Last used global id, used in loops to check versions.
180 // Need to change if new global type becomes added!
181 ADDON_GLOBAL_MAX = 6,
182
183 /* addon type instances */
184
185 /// Audio decoder instance, see \ref cpp_kodi_addon_audiodecoder "kodi::addon::CInstanceAudioDecoder"
186 ADDON_INSTANCE_AUDIODECODER = 102,
187
188 /// Audio encoder instance, see \ref cpp_kodi_addon_audioencoder "kodi::addon::CInstanceAudioEncoder"
189 ADDON_INSTANCE_AUDIOENCODER = 103,
190
191 /// Game instance, see \ref cpp_kodi_addon_game "kodi::addon::CInstanceGame"
192 ADDON_INSTANCE_GAME = 104,
193
194 /// Input stream instance, see \ref cpp_kodi_addon_inputstream "kodi::addon::CInstanceInputStream"
195 ADDON_INSTANCE_INPUTSTREAM = 105,
196
197 /// Peripheral instance, see \ref cpp_kodi_addon_peripheral "kodi::addon::CInstancePeripheral"
198 ADDON_INSTANCE_PERIPHERAL = 106,
199
200 /// Game instance, see \ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient"
201 ADDON_INSTANCE_PVR = 107,
202
203 /// PVR client instance, see \ref cpp_kodi_addon_screensaver "kodi::addon::CInstanceScreensaver"
204 ADDON_INSTANCE_SCREENSAVER = 108,
205
206 /// Music visualization instance, see \ref cpp_kodi_addon_visualization "kodi::addon::CInstanceVisualization"
207 ADDON_INSTANCE_VISUALIZATION = 109,
208
209 /// Virtual Filesystem (VFS) instance, see \ref cpp_kodi_addon_vfs "kodi::addon::CInstanceVFS"
210 ADDON_INSTANCE_VFS = 110,
211
212 /// Image Decoder instance, see \ref cpp_kodi_addon_imagedecoder "kodi::addon::CInstanceImageDecoder"
213 ADDON_INSTANCE_IMAGEDECODER = 111,
214
215 /// Video Decoder instance, see \ref cpp_kodi_addon_videocodec "kodi::addon::CInstanceVideoCodec"
216 ADDON_INSTANCE_VIDEOCODEC = 112,
217} ADDON_TYPE;
218//------------------------------------------------------------------------------
219
220#ifdef __cplusplus
221extern "C" {
222namespace kodi {
223namespace addon {
224#endif
225
226///
227/// This is used from Kodi to get the active version of add-on parts.
228/// It is compiled in add-on and also in Kodi itself, with this can be Kodi
229/// compare the version from him with them on add-on.
230///
231/// @param[in] type The with 'enum ADDON_TYPE' type to ask
232/// @return version The current version of asked type
233///
234inline const char* GetTypeVersion(int type)
235{
236 /*
237 * #ifdef's below becomes set by cmake, no set by hand needed.
238 */
239 switch (type)
240 {
241 /* addon global parts */
242 case ADDON_GLOBAL_MAIN:
243 return ADDON_GLOBAL_VERSION_MAIN;
244#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GENERAL_USED)
245 case ADDON_GLOBAL_GENERAL:
246 return ADDON_GLOBAL_VERSION_GENERAL;
247#endif
248#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GUI_USED)
249 case ADDON_GLOBAL_GUI:
250 return ADDON_GLOBAL_VERSION_GUI;
251#endif
252#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_AUDIOENGINE_USED)
253 case ADDON_GLOBAL_AUDIOENGINE:
254 return ADDON_GLOBAL_VERSION_AUDIOENGINE;
255#endif
256#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_FILESYSTEM_USED)
257 case ADDON_GLOBAL_FILESYSTEM:
258 return ADDON_GLOBAL_VERSION_FILESYSTEM;
259#endif
260#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_NETWORK_USED)
261 case ADDON_GLOBAL_NETWORK:
262 return ADDON_GLOBAL_VERSION_NETWORK;
263#endif
264#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_TOOLS_USED)
265 case ADDON_GLOBAL_TOOLS:
266 return ADDON_GLOBAL_VERSION_TOOLS;
267#endif
268
269 /* addon type instances */
270#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_AUDIODECODER_USED)
271 case ADDON_INSTANCE_AUDIODECODER:
272 return ADDON_INSTANCE_VERSION_AUDIODECODER;
273#endif
274#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_AUDIOENCODER_USED)
275 case ADDON_INSTANCE_AUDIOENCODER:
276 return ADDON_INSTANCE_VERSION_AUDIOENCODER;
277#endif
278#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_GAME_USED)
279 case ADDON_INSTANCE_GAME:
280 return ADDON_INSTANCE_VERSION_GAME;
281#endif
282#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_IMAGEDECODER_USED)
283 case ADDON_INSTANCE_IMAGEDECODER:
284 return ADDON_INSTANCE_VERSION_IMAGEDECODER;
285#endif
286#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_INPUTSTREAM_USED)
287 case ADDON_INSTANCE_INPUTSTREAM:
288 return ADDON_INSTANCE_VERSION_INPUTSTREAM;
289#endif
290#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_PERIPHERAL_USED)
291 case ADDON_INSTANCE_PERIPHERAL:
292 return ADDON_INSTANCE_VERSION_PERIPHERAL;
293#endif
294#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_PVR_USED)
295 case ADDON_INSTANCE_PVR:
296 return ADDON_INSTANCE_VERSION_PVR;
297#endif
298#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_SCREENSAVER_USED)
299 case ADDON_INSTANCE_SCREENSAVER:
300 return ADDON_INSTANCE_VERSION_SCREENSAVER;
301#endif
302#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VFS_USED)
303 case ADDON_INSTANCE_VFS:
304 return ADDON_INSTANCE_VERSION_VFS;
305#endif
306#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VISUALIZATION_USED)
307 case ADDON_INSTANCE_VISUALIZATION:
308 return ADDON_INSTANCE_VERSION_VISUALIZATION;
309#endif
310#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VIDEOCODEC_USED)
311 case ADDON_INSTANCE_VIDEOCODEC:
312 return ADDON_INSTANCE_VERSION_VIDEOCODEC;
313#endif
314 }
315 return "0.0.0";
316}
317
318///
319/// This is used from Kodi to get the minimum supported version of add-on parts.
320/// It is compiled in add-on and also in Kodi itself, with this can be Kodi
321/// compare the version from him with them on add-on.
322///
323/// @param[in] type The with 'enum ADDON_TYPE' type to ask
324/// @return version The minimum version of asked type
325///
326inline const char* GetTypeMinVersion(int type)
327{
328 switch (type)
329 {
330 /* addon global parts */
331 case ADDON_GLOBAL_MAIN:
332 return ADDON_GLOBAL_VERSION_MAIN_MIN;
333 case ADDON_GLOBAL_GUI:
334 return ADDON_GLOBAL_VERSION_GUI_MIN;
335 case ADDON_GLOBAL_GENERAL:
336 return ADDON_GLOBAL_VERSION_GENERAL_MIN;
337 case ADDON_GLOBAL_AUDIOENGINE:
338 return ADDON_GLOBAL_VERSION_AUDIOENGINE_MIN;
339 case ADDON_GLOBAL_FILESYSTEM:
340 return ADDON_GLOBAL_VERSION_FILESYSTEM_MIN;
341 case ADDON_GLOBAL_NETWORK:
342 return ADDON_GLOBAL_VERSION_NETWORK_MIN;
343 case ADDON_GLOBAL_TOOLS:
344 return ADDON_GLOBAL_VERSION_TOOLS_MIN;
345
346 /* addon type instances */
347 case ADDON_INSTANCE_AUDIODECODER:
348 return ADDON_INSTANCE_VERSION_AUDIODECODER_MIN;
349 case ADDON_INSTANCE_AUDIOENCODER:
350 return ADDON_INSTANCE_VERSION_AUDIOENCODER_MIN;
351 case ADDON_INSTANCE_GAME:
352 return ADDON_INSTANCE_VERSION_GAME_MIN;
353 case ADDON_INSTANCE_IMAGEDECODER:
354 return ADDON_INSTANCE_VERSION_IMAGEDECODER_MIN;
355 case ADDON_INSTANCE_INPUTSTREAM:
356 return ADDON_INSTANCE_VERSION_INPUTSTREAM_MIN;
357 case ADDON_INSTANCE_PERIPHERAL:
358 return ADDON_INSTANCE_VERSION_PERIPHERAL_MIN;
359 case ADDON_INSTANCE_PVR:
360 return ADDON_INSTANCE_VERSION_PVR_MIN;
361 case ADDON_INSTANCE_SCREENSAVER:
362 return ADDON_INSTANCE_VERSION_SCREENSAVER_MIN;
363 case ADDON_INSTANCE_VFS:
364 return ADDON_INSTANCE_VERSION_VFS_MIN;
365 case ADDON_INSTANCE_VISUALIZATION:
366 return ADDON_INSTANCE_VERSION_VISUALIZATION_MIN;
367 case ADDON_INSTANCE_VIDEOCODEC:
368 return ADDON_INSTANCE_VERSION_VIDEOCODEC_MIN;
369 }
370 return "0.0.0";
371}
372
373///
374/// Function used internally on add-on and in Kodi itself to get name
375/// about given type.
376///
377/// @param[in] type The with 'enum ADDON_TYPE' defined type to ask
378/// @return Name of the asked instance type
379///
380inline const char* GetTypeName(int type)
381{
382 switch (type)
383 {
384 /* addon global parts */
385 case ADDON_GLOBAL_MAIN:
386 return "Addon";
387 case ADDON_GLOBAL_GUI:
388 return "GUI";
389 case ADDON_GLOBAL_GENERAL:
390 return "General";
391 case ADDON_GLOBAL_AUDIOENGINE:
392 return "AudioEngine";
393 case ADDON_GLOBAL_FILESYSTEM:
394 return "Filesystem";
395 case ADDON_GLOBAL_NETWORK:
396 return "Network";
397 case ADDON_GLOBAL_TOOLS:
398 return "Tools";
399
400 /* addon type instances */
401 case ADDON_INSTANCE_AUDIODECODER:
402 return "AudioDecoder";
403 case ADDON_INSTANCE_AUDIOENCODER:
404 return "AudioEncoder";
405 case ADDON_INSTANCE_GAME:
406 return "Game";
407 case ADDON_INSTANCE_IMAGEDECODER:
408 return "ImageDecoder";
409 case ADDON_INSTANCE_INPUTSTREAM:
410 return "Inputstream";
411 case ADDON_INSTANCE_PERIPHERAL:
412 return "Peripheral";
413 case ADDON_INSTANCE_PVR:
414 return "PVR";
415 case ADDON_INSTANCE_SCREENSAVER:
416 return "ScreenSaver";
417 case ADDON_INSTANCE_VISUALIZATION:
418 return "Visualization";
419 case ADDON_INSTANCE_VIDEOCODEC:
420 return "VideoCodec";
421 }
422 return "unknown";
423}
424
425///
426/// Function used internally on add-on and in Kodi itself to get id number
427/// about given type name.
428///
429/// @param[in] name The type name string to ask
430/// @return Id number of the asked instance type
431///
432/// @warning String must be lower case here!
433///
434inline int GetTypeId(const char* name)
435{
436 if (name)
437 {
438 if (strcmp(name, "addon") == 0)
439 return ADDON_GLOBAL_MAIN;
440 else if (strcmp(name, "general") == 0)
441 return ADDON_GLOBAL_GENERAL;
442 else if (strcmp(name, "gui") == 0)
443 return ADDON_GLOBAL_GUI;
444 else if (strcmp(name, "audioengine") == 0)
445 return ADDON_GLOBAL_AUDIOENGINE;
446 else if (strcmp(name, "filesystem") == 0)
447 return ADDON_GLOBAL_FILESYSTEM;
448 else if (strcmp(name, "network") == 0)
449 return ADDON_GLOBAL_NETWORK;
450 else if (strcmp(name, "tools") == 0)
451 return ADDON_GLOBAL_TOOLS;
452 else if (strcmp(name, "audiodecoder") == 0)
453 return ADDON_INSTANCE_AUDIODECODER;
454 else if (strcmp(name, "audioencoder") == 0)
455 return ADDON_INSTANCE_AUDIOENCODER;
456 else if (strcmp(name, "game") == 0)
457 return ADDON_INSTANCE_GAME;
458 else if (strcmp(name, "imagedecoder") == 0)
459 return ADDON_INSTANCE_IMAGEDECODER;
460 else if (strcmp(name, "inputstream") == 0)
461 return ADDON_INSTANCE_INPUTSTREAM;
462 else if (strcmp(name, "peripheral") == 0)
463 return ADDON_INSTANCE_PERIPHERAL;
464 else if (strcmp(name, "pvr") == 0)
465 return ADDON_INSTANCE_PVR;
466 else if (strcmp(name, "screensaver") == 0)
467 return ADDON_INSTANCE_SCREENSAVER;
468 else if (strcmp(name, "vfs") == 0)
469 return ADDON_INSTANCE_VFS;
470 else if (strcmp(name, "visualization") == 0)
471 return ADDON_INSTANCE_VISUALIZATION;
472 else if (strcmp(name, "videocodec") == 0)
473 return ADDON_INSTANCE_VIDEOCODEC;
474 }
475 return -1;
476}
477
478#ifdef __cplusplus
479} /* namespace addon */
480} /* namespace kodi */
481} /* extern "C" */
482#endif