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 
18 namespace kodi
19 {
20 namespace 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 ///@{
34 class PVRTypeIntValue : public CStructHdl<PVRTypeIntValue, PVR_ATTRIBUTE_INT_VALUE>
35 {
36   friend class CInstancePVRClient;
37 
38 public:
39   /*! \cond PRIVATE */
PVRTypeIntValue(const PVRTypeIntValue & data)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
PVRTypeIntValue(int value,const std::string & description)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.
SetValue(int value)73   void SetValue(int value) { m_cStructure->iValue = value; }
74 
75   /// @brief To get with the identification value.
GetValue()76   int GetValue() const { return m_cStructure->iValue; }
77 
78   /// @brief To set with the description text of the value.
SetDescription(const std::string & description)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.
GetDescription()86   std::string GetDescription() const { return m_cStructure->strDescription; }
87   ///@}
88 
89 private:
PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE * data)90   PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {}
PVRTypeIntValue(PVR_ATTRIBUTE_INT_VALUE * 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 ///@{
115 class PVRCapabilities
116 {
117   friend class CInstancePVRClient;
118 
119 public:
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.
SetSupportsEPG(bool supportsEPG)160   void SetSupportsEPG(bool supportsEPG) { m_capabilities->bSupportsEPG = supportsEPG; }
161 
162   /// @brief To get with @ref SetSupportsEPG changed values.
GetSupportsEPG()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.
SetSupportsEPGEdl(bool supportsEPGEdl)167   void SetSupportsEPGEdl(bool supportsEPGEdl) { m_capabilities->bSupportsEPGEdl = supportsEPGEdl; }
168 
169   /// @brief To get with @ref SetSupportsEPGEdl changed values.
GetSupportsEPGEdl()170   bool GetSupportsEPGEdl() const { return m_capabilities->bSupportsEPGEdl; }
171 
172   /// @brief Set **true** if this add-on provides TV channels.
SetSupportsTV(bool supportsTV)173   void SetSupportsTV(bool supportsTV) { m_capabilities->bSupportsTV = supportsTV; }
174 
175   /// @brief To get with @ref SetSupportsTV changed values.
GetSupportsTV()176   bool GetSupportsTV() const { return m_capabilities->bSupportsTV; }
177 
178   /// @brief Set **true** if this add-on provides TV channels.
SetSupportsRadio(bool supportsRadio)179   void SetSupportsRadio(bool supportsRadio) { m_capabilities->bSupportsRadio = supportsRadio; }
180 
181   /// @brief To get with @ref SetSupportsRadio changed values.
GetSupportsRadio()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.
SetSupportsRecordings(bool supportsRecordings)186   void SetSupportsRecordings(bool supportsRecordings)
187   {
188     m_capabilities->bSupportsRecordings = supportsRecordings;
189   }
190 
191   /// @brief To get with @ref SetSupportsRecordings changed values.
GetSupportsRecordings()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.
SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete)196   void SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete)
197   {
198     m_capabilities->bSupportsRecordingsUndelete = supportsRecordingsUndelete;
199   }
200 
201   /// @brief To get with @ref SetSupportsRecordings changed values.
GetSupportsRecordingsUndelete()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.
SetSupportsTimers(bool supportsTimers)206   void SetSupportsTimers(bool supportsTimers) { m_capabilities->bSupportsTimers = supportsTimers; }
207 
208   /// @brief To get with @ref SetSupportsTimers changed values.
GetSupportsTimers()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()
SetSupportsChannelGroups(bool supportsChannelGroups)217   void SetSupportsChannelGroups(bool supportsChannelGroups)
218   {
219     m_capabilities->bSupportsChannelGroups = supportsChannelGroups;
220   }
221 
222   /// @brief To get with @ref SetSupportsChannelGroups changed values.
GetSupportsChannelGroups()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()
SetSupportsChannelScan(bool supportsChannelScan)230   void SetSupportsChannelScan(bool supportsChannelScan)
231   {
232     m_capabilities->bSupportsChannelScan = supportsChannelScan;
233   }
234 
235   /// @brief To get with @ref SetSupportsChannelScan changed values.
GetSupportsChannelScan()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()
SetSupportsChannelSettings(bool supportsChannelSettings)245   void SetSupportsChannelSettings(bool supportsChannelSettings)
246   {
247     m_capabilities->bSupportsChannelSettings = supportsChannelSettings;
248   }
249 
250   /// @brief To get with @ref SetSupportsChannelSettings changed values.
GetSupportsChannelSettings()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.
SetHandlesInputStream(bool handlesInputStream)255   void SetHandlesInputStream(bool handlesInputStream)
256   {
257     m_capabilities->bHandlesInputStream = handlesInputStream;
258   }
259 
260   /// @brief To get with @ref SetHandlesInputStream changed values.
GetHandlesInputStream()261   bool GetHandlesInputStream() const { return m_capabilities->bHandlesInputStream; }
262 
263   /// @brief Set **true** if this add-on demultiplexes packets.
SetHandlesDemuxing(bool handlesDemuxing)264   void SetHandlesDemuxing(bool handlesDemuxing)
265   {
266     m_capabilities->bHandlesDemuxing = handlesDemuxing;
267   }
268 
269   /// @brief To get with @ref SetHandlesDemuxing changed values.
GetHandlesDemuxing()270   bool GetHandlesDemuxing() const { return m_capabilities->bHandlesDemuxing; }
271 
272   /// @brief Set **true** if the backend supports play count for recordings.
SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount)273   void SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount)
274   {
275     m_capabilities->bSupportsRecordingPlayCount = supportsRecordingPlayCount;
276   }
277 
278   /// @brief To get with @ref SetSupportsRecordingPlayCount changed values.
GetSupportsRecordingPlayCount()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.
SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition)283   void SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition)
284   {
285     m_capabilities->bSupportsLastPlayedPosition = supportsLastPlayedPosition;
286   }
287 
288   /// @brief To get with @ref SetSupportsLastPlayedPosition changed values.
GetSupportsLastPlayedPosition()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.
SetSupportsRecordingEdl(bool supportsRecordingEdl)293   void SetSupportsRecordingEdl(bool supportsRecordingEdl)
294   {
295     m_capabilities->bSupportsRecordingEdl = supportsRecordingEdl;
296   }
297 
298   /// @brief To get with @ref SetSupportsRecordingEdl changed values.
GetSupportsRecordingEdl()299   bool GetSupportsRecordingEdl() const { return m_capabilities->bSupportsRecordingEdl; }
300 
301   /// @brief Set **true** if the backend supports renaming recordings.
SetSupportsRecordingsRename(bool supportsRecordingsRename)302   void SetSupportsRecordingsRename(bool supportsRecordingsRename)
303   {
304     m_capabilities->bSupportsRecordingsRename = supportsRecordingsRename;
305   }
306 
307   /// @brief To get with @ref SetSupportsRecordingsRename changed values.
GetSupportsRecordingsRename()308   bool GetSupportsRecordingsRename() const { return m_capabilities->bSupportsRecordingsRename; }
309 
310   /// @brief Set **true** if the backend supports changing lifetime for
311   /// recordings.
SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange)312   void SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange)
313   {
314     m_capabilities->bSupportsRecordingsLifetimeChange = supportsRecordingsLifetimeChange;
315   }
316 
317   /// @brief To get with @ref SetSupportsRecordingsLifetimeChange changed
318   /// values.
GetSupportsRecordingsLifetimeChange()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.
SetSupportsDescrambleInfo(bool supportsDescrambleInfo)326   void SetSupportsDescrambleInfo(bool supportsDescrambleInfo)
327   {
328     m_capabilities->bSupportsDescrambleInfo = supportsDescrambleInfo;
329   }
330 
331   /// @brief To get with @ref SetSupportsDescrambleInfo changed values.
GetSupportsDescrambleInfo()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().
SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer)337   void SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer)
338   {
339     m_capabilities->bSupportsAsyncEPGTransfer = supportsAsyncEPGTransfer;
340   }
341 
342   /// @brief To get with @ref SetSupportsAsyncEPGTransfer changed values.
GetSupportsAsyncEPGTransfer()343   bool GetSupportsAsyncEPGTransfer() const { return m_capabilities->bSupportsAsyncEPGTransfer; }
344 
345   /// @brief Set **true** if this addon-on supports retrieving size of recordings.
SetSupportsRecordingSize(bool supportsRecordingSize)346   void SetSupportsRecordingSize(bool supportsRecordingSize)
347   {
348     m_capabilities->bSupportsRecordingSize = supportsRecordingSize;
349   }
350 
351   /// @brief To get with @ref SetSupportsRecordingSize changed values.
GetSupportsRecordingSize()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
SetRecordingsLifetimeValues(const std::vector<PVRTypeIntValue> & recordingsLifetimeValues)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.
GetRecordingsLifetimeValues()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 
389 private:
PVRCapabilities(PVR_ADDON_CAPABILITIES * capabilities)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 ///@{
444 class PVRStreamProperty : public CStructHdl<PVRStreamProperty, PVR_NAMED_VALUE>
445 {
446   friend class CInstancePVRClient;
447 
448 public:
449   /*! \cond PRIVATE */
PVRStreamProperty(const PVRStreamProperty & data)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
PVRStreamProperty(const std::string & name,const std::string & 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.
SetName(const std::string & 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.
GetName()489   std::string GetName() const { return m_cStructure->strName; }
490 
491   /// @brief To set with the used property value.
SetValue(const std::string & 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.
GetValue()498   std::string GetValue() const { return m_cStructure->strValue; }
499   ///@}
500 
501 private:
PVRStreamProperty(const PVR_NAMED_VALUE * data)502   PVRStreamProperty(const PVR_NAMED_VALUE* data) : CStructHdl(data) {}
PVRStreamProperty(PVR_NAMED_VALUE * data)503   PVRStreamProperty(PVR_NAMED_VALUE* data) : CStructHdl(data) {}
504 };
505 ///@}
506 //------------------------------------------------------------------------------
507 
508 } /* namespace addon */
509 } /* namespace kodi */
510 
511 #endif /* __cplusplus */
512