/*
* Copyright (C) 2005-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#pragma once
#include "../../AddonBase.h"
#include "../../c-api/addon-instance/pvr/pvr_general.h"
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// "C++" Definitions group 1 - General PVR
#ifdef __cplusplus
namespace kodi
{
namespace addon
{
//==============================================================================
/// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue class PVRTypeIntValue
/// @ingroup cpp_kodi_addon_pvr_Defs_General
/// @brief **PVR add-on type value**\n
/// Representation of a `` event related value.
///
/// ----------------------------------------------------------------------------
///
/// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
///
///@{
class PVRTypeIntValue : public CStructHdl
{
friend class CInstancePVRClient;
public:
/*! \cond PRIVATE */
PVRTypeIntValue(const PVRTypeIntValue& data) : CStructHdl(data) {}
/*! \endcond */
/// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help Value Help
/// @ingroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue
///
/// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue :
/// | Name | Type | Set call | Get call
/// |------|------|----------|----------
/// | **Value** | `int` | @ref PVRTypeIntValue::SetValue "SetValue" | @ref PVRTypeIntValue::GetValue "GetValue"
/// | **Description** | `std::string` | @ref PVRTypeIntValue::SetDescription "SetDescription" | @ref PVRTypeIntValue::GetDescription "GetDescription"
///
/// @remark Further can there be used his class constructor to set values.
/// @addtogroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue
///@{
/// @brief Default class constructor.
///
/// @note Values must be set afterwards.
PVRTypeIntValue() = default;
/// @brief Class constructor with integrated value set.
///
/// @param[in] value Type identification value
/// @param[in] description Type description text
PVRTypeIntValue(int value, const std::string& description)
{
SetValue(value);
SetDescription(description);
}
/// @brief To set with the identification value.
void SetValue(int value) { m_cStructure->iValue = value; }
/// @brief To get with the identification value.
int GetValue() const { return m_cStructure->iValue; }
/// @brief To set with the description text of the value.
void SetDescription(const std::string& description)
{
strncpy(m_cStructure->strDescription, description.c_str(),
sizeof(m_cStructure->strDescription) - 1);
}
/// @brief To get with the description text of the value.
std::string GetDescription() const { return m_cStructure->strDescription; }
///@}
private:
PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {}
PVRTypeIntValue(PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {}
};
///@}
//------------------------------------------------------------------------------
//==============================================================================
/// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities class PVRCapabilities
/// @ingroup cpp_kodi_addon_pvr_Defs_General
/// @brief **PVR add-on capabilities**\n
/// This class is needed to tell Kodi which options are supported on the addon.
///
/// If a capability is set to **true**, then the corresponding methods from
/// @ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient" need to be
/// implemented.
///
/// As default them all set to **false**.
///
/// Used on @ref kodi::addon::CInstancePVRClient::GetCapabilities().
///
/// ----------------------------------------------------------------------------
///
/// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help
///
///@{
class PVRCapabilities
{
friend class CInstancePVRClient;
public:
/*! \cond PRIVATE */
explicit PVRCapabilities() = delete;
/*! \endcond */
/// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help Value Help
/// @ingroup cpp_kodi_addon_pvr_Defs_PVRCapabilities
/// ----------------------------------------------------------------------------
///
/// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities :
/// | Name | Type | Set call | Get call
/// |------|------|----------|----------
/// | **Supports EPG** | `boolean` | @ref PVRCapabilities::SetSupportsEPG "SetSupportsEPG" | @ref PVRCapabilities::GetSupportsEPG "GetSupportsEPG"
/// | **Supports EPG EDL** | `boolean` | @ref PVRCapabilities::SetSupportsEPGEdl "SetSupportsEPGEdl" | @ref PVRCapabilities::GetSupportsEPGEdl "GetSupportsEPGEdl"
/// | **Supports TV** | `boolean` | @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" | @ref PVRCapabilities::GetSupportsTV "GetSupportsTV"
/// | **Supports radio** | `boolean` | @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" | @ref PVRCapabilities::GetSupportsRadio "GetSupportsRadio"
/// | **Supports recordings** | `boolean` | @ref PVRCapabilities::SetSupportsRecordings "SetSupportsRecordings" | @ref PVRCapabilities::GetSupportsRecordings "GetSupportsRecordings"
/// | **Supports recordings undelete** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" | @ref PVRCapabilities::GetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete"
/// | **Supports timers** | `boolean` | @ref PVRCapabilities::SetSupportsTimers "SetSupportsTimers" | @ref PVRCapabilities::GetSupportsTimers "GetSupportsTimers"
/// | **Supports channel groups** | `boolean` | @ref PVRCapabilities::SetSupportsChannelGroups "SetSupportsChannelGroups" | @ref PVRCapabilities::GetSupportsChannelGroups "GetSupportsChannelGroups"
/// | **Supports channel scan** | `boolean` | @ref PVRCapabilities::SetSupportsChannelScan "SetSupportsChannelScan" | @ref PVRCapabilities::GetSupportsChannelScan "GetSupportsChannelScan"
/// | **Supports channel settings** | `boolean` | @ref PVRCapabilities::SetSupportsChannelSettings "SetSupportsChannelSettings" | @ref PVRCapabilities::GetSupportsChannelSettings "GetSupportsChannelSettings"
/// | **Handles input stream** | `boolean` | @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" | @ref PVRCapabilities::GetHandlesInputStream "GetHandlesInputStream"
/// | **Handles demuxing** | `boolean` | @ref PVRCapabilities::SetHandlesDemuxing "SetHandlesDemuxing" | @ref PVRCapabilities::GetHandlesDemuxing "GetHandlesDemuxing"
/// | **Supports recording play count** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingPlayCount "SetSupportsRecordingPlayCount" | @ref PVRCapabilities::GetSupportsRecordingPlayCount "GetSupportsRecordingPlayCount"
/// | **Supports last played position** | `boolean` | @ref PVRCapabilities::SetSupportsLastPlayedPosition "SetSupportsLastPlayedPosition" | @ref PVRCapabilities::GetSupportsLastPlayedPosition "GetSupportsLastPlayedPosition"
/// | **Supports recording EDL** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingEdl "SetSupportsRecordingEdl" | @ref PVRCapabilities::GetSupportsRecordingEdl "GetSupportsRecordingEdl"
/// | **Supports recordings rename** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsRename "SetSupportsRecordingsRename" | @ref PVRCapabilities::GetSupportsRecordingsRename "GetSupportsRecordingsRename"
/// | **Supports recordings lifetime change** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "SetSupportsRecordingsLifetimeChange" | @ref PVRCapabilities::GetSupportsRecordingsLifetimeChange "GetSupportsRecordingsLifetimeChange"
/// | **Supports descramble info** | `boolean` | @ref PVRCapabilities::SetSupportsDescrambleInfo "SetSupportsDescrambleInfo" | @ref PVRCapabilities::GetSupportsDescrambleInfo "GetSupportsDescrambleInfo"
/// | **Supports async EPG transfer** | `boolean` | @ref PVRCapabilities::SetSupportsAsyncEPGTransfer "SetSupportsAsyncEPGTransfer" | @ref PVRCapabilities::GetSupportsAsyncEPGTransfer "GetSupportsAsyncEPGTransfer"
/// | **Supports recording size** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingSize "SetSupportsRecordingSize" | @ref PVRCapabilities::GetSupportsRecordingSize "GetSupportsRecordingSize"
/// | **Recordings lifetime values** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRCapabilities::SetRecordingsLifetimeValues "SetRecordingsLifetimeValues" | @ref PVRCapabilities::GetRecordingsLifetimeValues "GetRecordingsLifetimeValues"
///
/// @warning This class can not be used outside of @ref kodi::addon::CInstancePVRClient::GetCapabilities()
///
/// @addtogroup cpp_kodi_addon_pvr_Defs_PVRCapabilities
///@{
/// @brief Set **true** if the add-on provides EPG information.
void SetSupportsEPG(bool supportsEPG) { m_capabilities->bSupportsEPG = supportsEPG; }
/// @brief To get with @ref SetSupportsEPG changed values.
bool GetSupportsEPG() const { return m_capabilities->bSupportsEPG; }
/// @brief Set **true** if the backend supports retrieving an edit decision
/// list for an EPG tag.
void SetSupportsEPGEdl(bool supportsEPGEdl) { m_capabilities->bSupportsEPGEdl = supportsEPGEdl; }
/// @brief To get with @ref SetSupportsEPGEdl changed values.
bool GetSupportsEPGEdl() const { return m_capabilities->bSupportsEPGEdl; }
/// @brief Set **true** if this add-on provides TV channels.
void SetSupportsTV(bool supportsTV) { m_capabilities->bSupportsTV = supportsTV; }
/// @brief To get with @ref SetSupportsTV changed values.
bool GetSupportsTV() const { return m_capabilities->bSupportsTV; }
/// @brief Set **true** if this add-on provides TV channels.
void SetSupportsRadio(bool supportsRadio) { m_capabilities->bSupportsRadio = supportsRadio; }
/// @brief To get with @ref SetSupportsRadio changed values.
bool GetSupportsRadio() const { return m_capabilities->bSupportsRadio; }
/// @brief **true** if this add-on supports playback of recordings stored on
/// the backend.
void SetSupportsRecordings(bool supportsRecordings)
{
m_capabilities->bSupportsRecordings = supportsRecordings;
}
/// @brief To get with @ref SetSupportsRecordings changed values.
bool GetSupportsRecordings() const { return m_capabilities->bSupportsRecordings; }
/// @brief Set **true** if this add-on supports undelete of recordings stored
/// on the backend.
void SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete)
{
m_capabilities->bSupportsRecordingsUndelete = supportsRecordingsUndelete;
}
/// @brief To get with @ref SetSupportsRecordings changed values.
bool GetSupportsRecordingsUndelete() const { return m_capabilities->bSupportsRecordingsUndelete; }
/// @brief Set **true** if this add-on supports the creation and editing of
/// timers.
void SetSupportsTimers(bool supportsTimers) { m_capabilities->bSupportsTimers = supportsTimers; }
/// @brief To get with @ref SetSupportsTimers changed values.
bool GetSupportsTimers() const { return m_capabilities->bSupportsTimers; }
/// @brief Set **true** if this add-on supports channel groups.
///
/// It use the following functions:
/// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupsAmount()
/// - @ref kodi::addon::CInstancePVRClient::GetChannelGroups()
/// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers()
void SetSupportsChannelGroups(bool supportsChannelGroups)
{
m_capabilities->bSupportsChannelGroups = supportsChannelGroups;
}
/// @brief To get with @ref SetSupportsChannelGroups changed values.
bool GetSupportsChannelGroups() const { return m_capabilities->bSupportsChannelGroups; }
/// @brief Set **true** if this add-on support scanning for new channels on
/// the backend.
///
/// It use the following function:
/// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelScan()
void SetSupportsChannelScan(bool supportsChannelScan)
{
m_capabilities->bSupportsChannelScan = supportsChannelScan;
}
/// @brief To get with @ref SetSupportsChannelScan changed values.
bool GetSupportsChannelScan() const { return m_capabilities->bSupportsChannelScan; }
/// @brief Set **true** if this add-on supports channel edit.
///
/// It use the following functions:
/// - @ref kodi::addon::CInstancePVRClient::DeleteChannel()
/// - @ref kodi::addon::CInstancePVRClient::RenameChannel()
/// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelSettings()
/// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelAdd()
void SetSupportsChannelSettings(bool supportsChannelSettings)
{
m_capabilities->bSupportsChannelSettings = supportsChannelSettings;
}
/// @brief To get with @ref SetSupportsChannelSettings changed values.
bool GetSupportsChannelSettings() const { return m_capabilities->bSupportsChannelSettings; }
/// @brief Set **true** if this add-on provides an input stream. false if Kodi
/// handles the stream.
void SetHandlesInputStream(bool handlesInputStream)
{
m_capabilities->bHandlesInputStream = handlesInputStream;
}
/// @brief To get with @ref SetHandlesInputStream changed values.
bool GetHandlesInputStream() const { return m_capabilities->bHandlesInputStream; }
/// @brief Set **true** if this add-on demultiplexes packets.
void SetHandlesDemuxing(bool handlesDemuxing)
{
m_capabilities->bHandlesDemuxing = handlesDemuxing;
}
/// @brief To get with @ref SetHandlesDemuxing changed values.
bool GetHandlesDemuxing() const { return m_capabilities->bHandlesDemuxing; }
/// @brief Set **true** if the backend supports play count for recordings.
void SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount)
{
m_capabilities->bSupportsRecordingPlayCount = supportsRecordingPlayCount;
}
/// @brief To get with @ref SetSupportsRecordingPlayCount changed values.
bool GetSupportsRecordingPlayCount() const { return m_capabilities->bSupportsRecordingPlayCount; }
/// @brief Set **true** if the backend supports store/retrieve of last played
/// position for recordings.
void SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition)
{
m_capabilities->bSupportsLastPlayedPosition = supportsLastPlayedPosition;
}
/// @brief To get with @ref SetSupportsLastPlayedPosition changed values.
bool GetSupportsLastPlayedPosition() const { return m_capabilities->bSupportsLastPlayedPosition; }
/// @brief Set **true** if the backend supports retrieving an edit decision
/// list for recordings.
void SetSupportsRecordingEdl(bool supportsRecordingEdl)
{
m_capabilities->bSupportsRecordingEdl = supportsRecordingEdl;
}
/// @brief To get with @ref SetSupportsRecordingEdl changed values.
bool GetSupportsRecordingEdl() const { return m_capabilities->bSupportsRecordingEdl; }
/// @brief Set **true** if the backend supports renaming recordings.
void SetSupportsRecordingsRename(bool supportsRecordingsRename)
{
m_capabilities->bSupportsRecordingsRename = supportsRecordingsRename;
}
/// @brief To get with @ref SetSupportsRecordingsRename changed values.
bool GetSupportsRecordingsRename() const { return m_capabilities->bSupportsRecordingsRename; }
/// @brief Set **true** if the backend supports changing lifetime for
/// recordings.
void SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange)
{
m_capabilities->bSupportsRecordingsLifetimeChange = supportsRecordingsLifetimeChange;
}
/// @brief To get with @ref SetSupportsRecordingsLifetimeChange changed
/// values.
bool GetSupportsRecordingsLifetimeChange() const
{
return m_capabilities->bSupportsRecordingsLifetimeChange;
}
/// @brief Set **true** if the backend supports descramble information for
/// playing channels.
void SetSupportsDescrambleInfo(bool supportsDescrambleInfo)
{
m_capabilities->bSupportsDescrambleInfo = supportsDescrambleInfo;
}
/// @brief To get with @ref SetSupportsDescrambleInfo changed values.
bool GetSupportsDescrambleInfo() const { return m_capabilities->bSupportsDescrambleInfo; }
/// @brief Set **true** if this addon-on supports asynchronous transfer of epg
/// events to Kodi using the callback function
/// @ref kodi::addon::CInstancePVRClient::EpgEventStateChange().
void SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer)
{
m_capabilities->bSupportsAsyncEPGTransfer = supportsAsyncEPGTransfer;
}
/// @brief To get with @ref SetSupportsAsyncEPGTransfer changed values.
bool GetSupportsAsyncEPGTransfer() const { return m_capabilities->bSupportsAsyncEPGTransfer; }
/// @brief Set **true** if this addon-on supports retrieving size of recordings.
void SetSupportsRecordingSize(bool supportsRecordingSize)
{
m_capabilities->bSupportsRecordingSize = supportsRecordingSize;
}
/// @brief To get with @ref SetSupportsRecordingSize changed values.
bool GetSupportsRecordingSize() const { return m_capabilities->bSupportsRecordingSize; }
/// @brief **optional**\n
/// Set array containing the possible values for @ref PVRRecording::SetLifetime().
///
/// --------------------------------------------------------------------------
///
/// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help
void SetRecordingsLifetimeValues(
const std::vector& recordingsLifetimeValues)
{
m_capabilities->iRecordingsLifetimesSize = 0;
for (unsigned int i = 0; i < recordingsLifetimeValues.size() &&
i < sizeof(m_capabilities->recordingsLifetimeValues);
++i)
{
m_capabilities->recordingsLifetimeValues[i].iValue =
recordingsLifetimeValues[i].GetCStructure()->iValue;
strncpy(m_capabilities->recordingsLifetimeValues[i].strDescription,
recordingsLifetimeValues[i].GetCStructure()->strDescription,
sizeof(m_capabilities->recordingsLifetimeValues[i].strDescription) - 1);
++m_capabilities->iRecordingsLifetimesSize;
}
}
/// @brief To get with @ref SetRecordingsLifetimeValues changed values.
std::vector GetRecordingsLifetimeValues() const
{
std::vector recordingsLifetimeValues;
for (unsigned int i = 0; i < m_capabilities->iRecordingsLifetimesSize; ++i)
recordingsLifetimeValues.emplace_back(
m_capabilities->recordingsLifetimeValues[i].iValue,
m_capabilities->recordingsLifetimeValues[i].strDescription);
return recordingsLifetimeValues;
}
///@}
private:
PVRCapabilities(PVR_ADDON_CAPABILITIES* capabilities) : m_capabilities(capabilities) {}
PVR_ADDON_CAPABILITIES* m_capabilities;
};
///@}
//------------------------------------------------------------------------------
//==============================================================================
/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty class PVRStreamProperty
/// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream
/// @brief **PVR stream property value handler**\n
/// To set for Kodi wanted stream properties.
///
/// ----------------------------------------------------------------------------
///
/// @copydetails cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help
///
///---------------------------------------------------------------------------
///
/// **Example:**
/// ~~~~~~~~~~~~~{.cpp}
/// ...
///
/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
/// std::vector& properties)
/// {
/// ...
/// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive");
/// return PVR_ERROR_NO_ERROR;
/// }
///
/// ...
/// ~~~~~~~~~~~~~
///
///
/// **Example 2:**
/// ~~~~~~~~~~~~~{.cpp}
/// ...
///
/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel,
/// std::vector& properties)
/// {
/// ...
/// kodi::addon::PVRStreamProperty property;
/// property.SetName(PVR_STREAM_PROPERTY_INPUTSTREAM);
/// property.SetValue("inputstream.adaptive");
/// properties.emplace_back(property);
/// return PVR_ERROR_NO_ERROR;
/// }
///
/// ...
/// ~~~~~~~~~~~~~
///
///@{
class PVRStreamProperty : public CStructHdl
{
friend class CInstancePVRClient;
public:
/*! \cond PRIVATE */
PVRStreamProperty(const PVRStreamProperty& data) : CStructHdl(data) {}
/*! \endcond */
/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help Value Help
/// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty
///
/// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty :
/// | Name | Type | Set call | Get call
/// |------|------|----------|----------
/// | **Name** | `int` | @ref PVRStreamProperty::SetValue "SetName" | @ref PVRStreamProperty::GetName "GetName"
/// | **Value** | `std::string` | @ref PVRStreamProperty::SetValue "SetValue" | @ref PVRStreamProperty::GetValue "GetValue"
///
/// @remark Further can there be used his class constructor to set values.
/// @addtogroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty
///@{
/// @brief Default class constructor.
///
/// @note Values must be set afterwards.
PVRStreamProperty() = default;
/// @brief Class constructor with integrated value set.
///
/// @param[in] name Type identification
/// @param[in] value Type used property value
PVRStreamProperty(const std::string& name, const std::string& value)
{
SetName(name);
SetValue(value);
}
/// @brief To set with the identification name.
void SetName(const std::string& name)
{
strncpy(m_cStructure->strName, name.c_str(), sizeof(m_cStructure->strName) - 1);
}
/// @brief To get with the identification name.
std::string GetName() const { return m_cStructure->strName; }
/// @brief To set with the used property value.
void SetValue(const std::string& value)
{
strncpy(m_cStructure->strValue, value.c_str(), sizeof(m_cStructure->strValue) - 1);
}
/// @brief To get with the used property value.
std::string GetValue() const { return m_cStructure->strValue; }
///@}
private:
PVRStreamProperty(const PVR_NAMED_VALUE* data) : CStructHdl(data) {}
PVRStreamProperty(PVR_NAMED_VALUE* data) : CStructHdl(data) {}
};
///@}
//------------------------------------------------------------------------------
} /* namespace addon */
} /* namespace kodi */
#endif /* __cplusplus */