11#include "c-api/addon_base.h"
19#include "tools/StringUtils.h"
61using HardwareContext = ADDON_HARDWARE_CONTEXT;
81inline char* AllocAndCopyString(
const char* source)
85 const size_t len{strlen(source) + 1};
86 char* target =
new char[len];
87 memcpy(target, source, len);
96inline void FreeString(
const char* str)
104inline void ReallocAndCopyString(
const char** stringToRealloc,
const char* stringToCopy)
106 FreeString(*stringToRealloc);
107 *stringToRealloc = AllocAndCopyString(stringToCopy);
113template<
typename CPP_CLASS,
typename C_STRUCT>
114inline static C_STRUCT** AllocAndCopyPointerArray(std::vector<CPP_CLASS>& sourceVector,
115 unsigned int& targetArraySize)
117 targetArraySize =
static_cast<unsigned int>(sourceVector.size());
118 if (targetArraySize > 0)
120 C_STRUCT** targetArray =
new C_STRUCT* [targetArraySize] {};
123 for (
auto& entry : sourceVector)
126 C_STRUCT** arrayElem{&targetArray[i]};
127 *arrayElem = entry.release();
138template<
typename CPP_CLASS,
typename C_STRUCT>
139inline static void FreeDynamicPointerArray(C_STRUCT** targetArray,
unsigned int targetArraySize)
141 for (
unsigned int i = 0; i < targetArraySize; ++i)
143 C_STRUCT** arrayElem{&targetArray[i]};
144 CPP_CLASS::FreeResources(*arrayElem);
147 delete[] targetArray;
153template<
typename CPP_CLASS,
typename C_STRUCT>
154inline static void FreeStaticPointerArray(C_STRUCT** targetArray,
unsigned int targetArraySize)
156 for (
unsigned int i = 0; i < targetArraySize; ++i)
158 C_STRUCT** arrayElem{&targetArray[i]};
161 delete[] targetArray;
204template<
class CPP_CLASS,
typename C_STRUCT>
208 CStructHdl() : m_cStructure(
new C_STRUCT()), m_owner(
true) {}
210 CStructHdl(
const CStructHdl& cppClass)
211 : m_cStructure(
new C_STRUCT(*cppClass.m_cStructure)), m_owner(
true)
215 explicit CStructHdl(
const C_STRUCT* cStructure)
216 : m_cStructure(
new C_STRUCT(*cStructure)), m_owner(
true)
220 explicit CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
222 const CStructHdl& operator=(
const CStructHdl& right)
227 if (m_cStructure && !m_owner)
229 memcpy(m_cStructure, right.m_cStructure,
sizeof(C_STRUCT));
236 m_cStructure =
new C_STRUCT(*right.m_cStructure);
241 const CStructHdl& operator=(
const C_STRUCT& right)
245 if (m_cStructure == &right)
248 if (m_cStructure && !m_owner)
250 memcpy(m_cStructure, &right,
sizeof(C_STRUCT));
257 m_cStructure =
new C_STRUCT(*right);
262 virtual ~CStructHdl()
268 operator C_STRUCT*() {
return m_cStructure; }
269 operator const C_STRUCT*()
const {
return m_cStructure; }
271 const C_STRUCT* GetCStructure()
const {
return m_cStructure; }
280 C_STRUCT* m_cStructure =
nullptr;
283 bool m_owner =
false;
286template<
class CPP_CLASS,
typename C_STRUCT>
287class DynamicCStructHdl
290 DynamicCStructHdl() : m_cStructure(
new C_STRUCT()), m_owner(
true)
292 memset(m_cStructure, 0,
sizeof(C_STRUCT));
295 DynamicCStructHdl(
const DynamicCStructHdl& cppClass)
296 : m_cStructure(
new C_STRUCT(*cppClass.m_cStructure)), m_owner(
true)
298 CPP_CLASS::AllocResources(cppClass.m_cStructure, m_cStructure);
301 explicit DynamicCStructHdl(
const C_STRUCT* cStructure)
302 : m_cStructure(
new C_STRUCT(*cStructure)), m_owner(
true)
304 CPP_CLASS::AllocResources(cStructure, m_cStructure);
307 explicit DynamicCStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure)
312 const DynamicCStructHdl& operator=(
const DynamicCStructHdl& right)
317 CPP_CLASS::FreeResources(m_cStructure);
318 if (m_cStructure && !m_owner)
320 memcpy(m_cStructure, right.m_cStructure,
sizeof(C_STRUCT));
327 m_cStructure =
new C_STRUCT(*right.m_cStructure);
329 CPP_CLASS::AllocResources(right.m_cStructure, m_cStructure);
333 const DynamicCStructHdl& operator=(
const C_STRUCT& right)
337 if (m_cStructure == &right)
340 CPP_CLASS::FreeResources(m_cStructure);
341 if (m_cStructure && !m_owner)
343 memcpy(m_cStructure, &right,
sizeof(C_STRUCT));
350 m_cStructure =
new C_STRUCT(*right);
352 CPP_CLASS::AllocResources(&right, m_cStructure);
356 virtual ~DynamicCStructHdl()
360 CPP_CLASS::FreeResources(m_cStructure);
365 operator C_STRUCT*() {
return m_cStructure; }
366 operator const C_STRUCT*()
const {
return m_cStructure; }
368 const C_STRUCT* GetCStructure()
const {
return m_cStructure; }
377 C_STRUCT* m_cStructure =
nullptr;
380 bool m_owner =
false;
287class DynamicCStructHdl {
…};
436class ATTR_DLL_LOCAL CSettingValue
439 explicit CSettingValue(
const std::string& settingValue) : str(settingValue) {}
441 bool empty()
const {
return str.empty(); }
463 int GetInt()
const {
return std::atoi(str.c_str()); }
466 unsigned int GetUInt()
const {
return std::atoi(str.c_str()); }
469 bool GetBoolean()
const {
return std::atoi(str.c_str()) > 0; }
472 float GetFloat()
const {
return static_cast<float>(std::atof(str.c_str())); }
476 template<
typename enumType>
479 return static_cast<enumType
>(
GetInt());
485 const std::string str;
436class ATTR_DLL_LOCAL CSettingValue {
…};
497class ATTR_DLL_LOCAL IInstanceInfo
519 KODI_ADDON_INSTANCE_TYPE
GetType()
const {
return m_instance->info->type; }
525 bool IsType(KODI_ADDON_INSTANCE_TYPE type)
const {
return m_instance->info->type == type; }
528 uint32_t
GetNumber()
const {
return m_instance->info->number; }
531 std::string
GetID()
const {
return m_instance->info->id; }
546 IInstanceInfo() =
delete;
547 IInstanceInfo(
const IInstanceInfo&) =
delete;
497class ATTR_DLL_LOCAL IInstanceInfo {
…};
561class ATTR_DLL_LOCAL IAddonInstance
566 m_instance->functions->instance_setting_change_string = INSTANCE_instance_setting_change_string;
567 m_instance->functions->instance_setting_change_integer =
568 INSTANCE_instance_setting_change_integer;
569 m_instance->functions->instance_setting_change_boolean =
570 INSTANCE_instance_setting_change_boolean;
571 m_instance->functions->instance_setting_change_float = INSTANCE_instance_setting_change_float;
573 virtual ~IAddonInstance() =
default;
576 KODI_ADDON_INSTANCE_HDL& hdl)
578 return ADDON_STATUS_NOT_IMPLEMENTED;
581 std::string GetInstanceAPIVersion()
const {
return m_instance->info->version; }
583 virtual ADDON_STATUS SetInstanceSetting(
const std::string& settingName,
589 inline bool IsInstanceSettingUsingDefault(
const std::string& settingName)
591 return m_instance->info->functions->is_instance_setting_using_default(m_instance->info->kodi,
592 settingName.c_str());
595 inline std::string GetInstanceUserPath(
const std::string& append =
"")
597 using namespace kodi::addon;
599 char* str = m_instance->info->functions->get_instance_user_path(
600 CPrivateBase::m_interface->toKodi->kodiBase);
601 std::string ret = str;
602 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
606 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
617 inline bool CheckInstanceSettingString(
const std::string& settingName, std::string& settingValue)
619 char* buffer =
nullptr;
620 bool ret = m_instance->info->functions->get_instance_setting_string(
621 m_instance->info->kodi, settingName.c_str(), &buffer);
625 settingValue = buffer;
631 inline std::string GetInstanceSettingString(
const std::string& settingName,
632 const std::string& defaultValue =
"")
634 std::string settingValue = defaultValue;
635 CheckInstanceSettingString(settingName, settingValue);
639 inline void SetInstanceSettingString(
const std::string& settingName,
640 const std::string& settingValue)
642 m_instance->info->functions->set_instance_setting_string(
643 m_instance->info->kodi, settingName.c_str(), settingValue.c_str());
646 inline bool CheckInstanceSettingInt(
const std::string& settingName,
int& settingValue)
649 return cb->get_instance_setting_int(m_instance->info->kodi, settingName.c_str(), &settingValue);
652 inline int GetInstanceSettingInt(
const std::string& settingName,
int defaultValue = 0)
654 int settingValue = defaultValue;
655 CheckInstanceSettingInt(settingName, settingValue);
659 inline void SetInstanceSettingInt(
const std::string& settingName,
int settingValue)
661 m_instance->info->functions->set_instance_setting_int(m_instance->info->kodi,
662 settingName.c_str(), settingValue);
665 inline bool CheckInstanceSettingBoolean(
const std::string& settingName,
bool& settingValue)
667 return m_instance->info->functions->get_instance_setting_bool(
668 m_instance->info->kodi, settingName.c_str(), &settingValue);
671 inline bool GetInstanceSettingBoolean(
const std::string& settingName,
bool defaultValue =
false)
673 bool settingValue = defaultValue;
674 CheckInstanceSettingBoolean(settingName, settingValue);
678 inline void SetInstanceSettingBoolean(
const std::string& settingName,
bool settingValue)
680 m_instance->info->functions->set_instance_setting_bool(m_instance->info->kodi,
681 settingName.c_str(), settingValue);
684 inline bool CheckInstanceSettingFloat(
const std::string& settingName,
float& settingValue)
686 return m_instance->info->functions->get_instance_setting_float(
687 m_instance->info->kodi, settingName.c_str(), &settingValue);
690 inline float GetInstanceSettingFloat(
const std::string& settingName,
float defaultValue = 0.0f)
692 float settingValue = defaultValue;
693 CheckInstanceSettingFloat(settingName, settingValue);
697 inline void SetInstanceSettingFloat(
const std::string& settingName,
float settingValue)
699 m_instance->info->functions->set_instance_setting_float(m_instance->info->kodi,
700 settingName.c_str(), settingValue);
703 template<
typename enumType>
704 inline bool CheckInstanceSettingEnum(
const std::string& settingName, enumType& settingValue)
706 using namespace kodi::addon;
708 int settingValueInt =
static_cast<int>(settingValue);
709 bool ret = m_instance->info->functions->get_instance_setting_int(
710 m_instance->info->kodi, settingName.c_str(), &settingValueInt);
712 settingValue =
static_cast<enumType
>(settingValueInt);
716 template<
typename enumType>
717 inline enumType GetInstanceSettingEnum(
const std::string& settingName,
718 enumType defaultValue =
static_cast<enumType
>(0))
720 enumType settingValue = defaultValue;
721 CheckInstanceSettingEnum(settingName, settingValue);
725 template<
typename enumType>
726 inline void SetInstanceSettingEnum(
const std::string& settingName, enumType settingValue)
728 m_instance->info->functions->set_instance_setting_int(
729 m_instance->info->kodi, settingName.c_str(),
static_cast<int>(settingValue));
733 static inline ADDON_STATUS INSTANCE_instance_setting_change_string(
734 const KODI_ADDON_INSTANCE_HDL hdl,
const char* name,
const char* value)
736 return static_cast<IAddonInstance*
>(hdl)->SetInstanceSetting(name,
CSettingValue(value));
739 static inline ADDON_STATUS INSTANCE_instance_setting_change_boolean(
740 const KODI_ADDON_INSTANCE_HDL hdl,
const char* name,
bool value)
742 return static_cast<IAddonInstance*
>(hdl)->SetInstanceSetting(name,
746 static inline ADDON_STATUS INSTANCE_instance_setting_change_integer(
747 const KODI_ADDON_INSTANCE_HDL hdl,
const char* name,
int value)
749 return static_cast<IAddonInstance*
>(hdl)->SetInstanceSetting(
753 static inline ADDON_STATUS INSTANCE_instance_setting_change_float(
754 const KODI_ADDON_INSTANCE_HDL hdl,
const char* name,
float value)
756 return static_cast<IAddonInstance*
>(hdl)->SetInstanceSetting(
760 friend class CAddonBase;
561class ATTR_DLL_LOCAL IAddonInstance {
…};
780 CPrivateBase::m_interface->toAddon->create =
nullptr;
781 CPrivateBase::m_interface->toAddon->destroy = ADDONBASE_Destroy;
782 CPrivateBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
783 CPrivateBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
784 CPrivateBase::m_interface->toAddon->setting_change_string = ADDONBASE_setting_change_string;
785 CPrivateBase::m_interface->toAddon->setting_change_boolean = ADDONBASE_setting_change_boolean;
786 CPrivateBase::m_interface->toAddon->setting_change_integer = ADDONBASE_setting_change_integer;
787 CPrivateBase::m_interface->toAddon->setting_change_float = ADDONBASE_setting_change_float;
922 KODI_ADDON_INSTANCE_HDL& hdl)
924 return ADDON_STATUS_NOT_IMPLEMENTED;
945 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
948 static inline void ADDONBASE_Destroy(
const KODI_ADDON_HDL hdl)
953 static inline ADDON_STATUS ADDONBASE_CreateInstance(
const KODI_ADDON_HDL hdl,
965 if (CPrivateBase::m_interface->firstKodiInstance == instance &&
966 CPrivateBase::m_interface->globalSingleInstance &&
967 static_cast<IAddonInstance*
>(CPrivateBase::m_interface->globalSingleInstance)
968 ->m_instance->info->type == instance->info->type)
973 instance->hdl = CPrivateBase::m_interface->globalSingleInstance;
985 if (instance->info->parent !=
nullptr)
987 ->CreateInstance(instanceInfo, instance->hdl);
990 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
996 if (instance->hdl ==
nullptr)
1000 CPrivateBase::m_interface->toKodi->addon_log_msg(
1002 "kodi::addon::CAddonBase CreateInstance returned an "
1003 "empty instance pointer, but reported OK!");
1012 if (
static_cast<IAddonInstance*
>(instance->hdl)->m_instance->info->type != instance->info->type)
1014 CPrivateBase::m_interface->toKodi->addon_log_msg(
1016 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
1017 delete static_cast<IAddonInstance*
>(instance->hdl);
1018 instance->hdl =
nullptr;
1025 static inline void ADDONBASE_DestroyInstance(
const KODI_ADDON_HDL hdl,
1026 struct KODI_ADDON_INSTANCE_STRUCT* instance)
1028 CAddonBase* base =
static_cast<CAddonBase*
>(hdl);
1030 if (CPrivateBase::m_interface->globalSingleInstance ==
nullptr && instance->hdl != base)
1032 IInstanceInfo instanceInfo(instance);
1034 delete static_cast<IAddonInstance*
>(instance->hdl);
1038 static inline ADDON_STATUS ADDONBASE_setting_change_string(
const KODI_ADDON_HDL hdl,
1042 return static_cast<CAddonBase*
>(hdl)->SetSetting(name, CSettingValue(value));
1045 static inline ADDON_STATUS ADDONBASE_setting_change_boolean(
const KODI_ADDON_HDL hdl,
1049 return static_cast<CAddonBase*
>(hdl)->SetSetting(name, CSettingValue(value ?
"1" :
"0"));
1052 static inline ADDON_STATUS ADDONBASE_setting_change_integer(
const KODI_ADDON_HDL hdl,
1056 return static_cast<CAddonBase*
>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1059 static inline ADDON_STATUS ADDONBASE_setting_change_float(
const KODI_ADDON_HDL hdl,
1063 return static_cast<CAddonBase*
>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1074inline std::string ATTR_DLL_LOCAL
GetAddonPath(
const std::string& append =
"")
1076 using namespace kodi::addon;
1078 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_addon_path(
1079 CPrivateBase::m_interface->toKodi->kodiBase);
1080 std::string ret = str;
1081 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1082 if (!append.empty())
1084 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
1085#ifdef TARGET_WINDOWS
1074inline std::string ATTR_DLL_LOCAL
GetAddonPath(
const std::string& append =
"") {
…}
1111inline std::string ATTR_DLL_LOCAL
GetLibPath(
const std::string& append =
"")
1113 using namespace kodi::addon;
1115 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_lib_path(
1116 CPrivateBase::m_interface->toKodi->kodiBase);
1117 std::string ret = str;
1118 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1119 if (!append.empty())
1121 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
1122#ifdef TARGET_WINDOWS
1111inline std::string ATTR_DLL_LOCAL
GetLibPath(
const std::string& append =
"") {
…}
1143inline std::string ATTR_DLL_LOCAL
GetUserPath(
const std::string& append =
"")
1145 using namespace kodi::addon;
1147 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_user_path(
1148 CPrivateBase::m_interface->toKodi->kodiBase);
1149 std::string ret = str;
1150 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1151 if (!append.empty())
1153 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
1154#ifdef TARGET_WINDOWS
1143inline std::string ATTR_DLL_LOCAL
GetUserPath(
const std::string& append =
"") {
…}
1176inline std::string ATTR_DLL_LOCAL
GetTempPath(
const std::string& append =
"")
1178 using namespace kodi::addon;
1180 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_temp_path(
1181 CPrivateBase::m_interface->toKodi->kodiBase);
1182 std::string ret = str;
1183 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1184 if (!append.empty())
1186 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
1187#ifdef TARGET_WINDOWS
1176inline std::string ATTR_DLL_LOCAL
GetTempPath(
const std::string& append =
"") {
…}
1226 const std::string& defaultStr =
"")
1228 using namespace kodi::addon;
1230 std::string retString = defaultStr;
1231 char* strMsg = CPrivateBase::m_interface->toKodi->kodi_addon->get_localized_string(
1232 CPrivateBase::m_interface->toKodi->kodiBase, labelId);
1233 if (strMsg !=
nullptr)
1235 if (std::strlen(strMsg))
1237 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1276 using namespace kodi::addon;
1277 return CPrivateBase::m_interface->toKodi->kodi_addon->open_settings_dialog(
1278 CPrivateBase::m_interface->toKodi->kodiBase);
1292 using namespace kodi::addon;
1293 return CPrivateBase::m_interface->toKodi->kodi_addon->is_setting_using_default(
1294 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str());
1322 std::string& settingValue)
1324 using namespace kodi::addon;
1326 char* buffer =
nullptr;
1327 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_string(
1328 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer);
1332 settingValue = buffer;
1333 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1360 const std::string& defaultValue =
"")
1362 std::string settingValue = defaultValue;
1364 return settingValue;
1388 const std::string& settingValue)
1390 using namespace kodi::addon;
1392 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_string(
1393 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue.c_str());
1420inline bool ATTR_DLL_LOCAL
CheckSettingInt(
const std::string& settingName,
int& settingValue)
1422 using namespace kodi::addon;
1424 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1425 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1420inline bool ATTR_DLL_LOCAL
CheckSettingInt(
const std::string& settingName,
int& settingValue) {
…}
1448inline int ATTR_DLL_LOCAL
GetSettingInt(
const std::string& settingName,
int defaultValue = 0)
1450 int settingValue = defaultValue;
1452 return settingValue;
1448inline int ATTR_DLL_LOCAL
GetSettingInt(
const std::string& settingName,
int defaultValue = 0) {
…}
1475inline void ATTR_DLL_LOCAL
SetSettingInt(
const std::string& settingName,
int settingValue)
1477 using namespace kodi::addon;
1479 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1480 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1475inline void ATTR_DLL_LOCAL
SetSettingInt(
const std::string& settingName,
int settingValue) {
…}
1509 using namespace kodi::addon;
1511 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_bool(
1512 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1536 bool defaultValue =
false)
1538 bool settingValue = defaultValue;
1540 return settingValue;
1565 using namespace kodi::addon;
1567 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_bool(
1568 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1597 using namespace kodi::addon;
1599 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_float(
1600 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1624 float defaultValue = 0.0f)
1626 float settingValue = defaultValue;
1628 return settingValue;
1651inline void ATTR_DLL_LOCAL
SetSettingFloat(
const std::string& settingName,
float settingValue)
1653 using namespace kodi::addon;
1655 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_float(
1656 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1651inline void ATTR_DLL_LOCAL
SetSettingFloat(
const std::string& settingName,
float settingValue) {
…}
1691template<
typename enumType>
1692inline bool ATTR_DLL_LOCAL
CheckSettingEnum(
const std::string& settingName, enumType& settingValue)
1694 using namespace kodi::addon;
1696 int settingValueInt =
static_cast<int>(settingValue);
1697 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1698 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt);
1700 settingValue =
static_cast<enumType
>(settingValueInt);
1692inline bool ATTR_DLL_LOCAL
CheckSettingEnum(
const std::string& settingName, enumType& settingValue) {
…}
1733template<
typename enumType>
1735 enumType defaultValue =
static_cast<enumType
>(0))
1737 enumType settingValue = defaultValue;
1739 return settingValue;
1771template<
typename enumType>
1772inline void ATTR_DLL_LOCAL
SetSettingEnum(
const std::string& settingName, enumType settingValue)
1774 using namespace kodi::addon;
1776 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1777 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(),
1778 static_cast<int>(settingValue));
1772inline void ATTR_DLL_LOCAL
SetSettingEnum(
const std::string& settingName, enumType settingValue) {
…}
1812 using namespace kodi::addon;
1816 std::string strReturn;
1817 char* strMsg = toKodi->kodi_addon->get_addon_info(toKodi->kodiBase,
id.c_str());
1818 if (strMsg !=
nullptr)
1820 if (std::strlen(strMsg))
1822 toKodi->free_string(toKodi->kodiBase, strMsg);
1846inline void*
GetInterface(
const std::string& name,
const std::string& version)
1848 using namespace kodi::addon;
1852 return toKodi->kodi_addon->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1846inline void*
GetInterface(
const std::string& name,
const std::string& version) {
…}
1868 using namespace kodi::addon;
1870 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_type_version(
1871 CPrivateBase::m_interface->toKodi->kodiBase, type);
1872 std::string ret = str;
1873 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1892 return "Lost Connection";
1894 return "Need Restart";
1896 return "Need Settings";
1898 return "Unknown error";
1900 return "Permanent failure";
1901 case ADDON_STATUS_NOT_IMPLEMENTED:
1902 return "Not implemented";
1935inline void ATTR_DLL_LOCAL
Log(
const ADDON_LOG loglevel,
const char* format, ...)
1937 using namespace kodi::addon;
1940 va_start(args, format);
1943 CPrivateBase::m_interface->toKodi->addon_log_msg(CPrivateBase::m_interface->toKodi->kodiBase,
1944 loglevel, str.c_str());
1935inline void ATTR_DLL_LOCAL
Log(
const ADDON_LOG loglevel,
const char* format, ...) {
…}
2044#define ADDONCREATOR(AddonClass) \
2045 extern "C" ATTR_DLL_EXPORT ADDON_STATUS ADDON_Create(KODI_HANDLE addonInterface) \
2047 using namespace kodi::addon; \
2048 CPrivateBase::m_interface = static_cast<AddonGlobalInterface*>(addonInterface); \
2049 CPrivateBase::m_interface->addonBase = new AddonClass; \
2050 return static_cast<CAddonBase*>(CPrivateBase::m_interface->addonBase)->Create(); \
2052 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \
2054 return kodi::addon::GetTypeVersion(type); \
2056 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \
2058 return kodi::addon::GetTypeMinVersion(type); \
2060 AddonGlobalInterface* kodi::addon::CPrivateBase::m_interface = nullptr;
Definition AddonBase.h:772
Definition AddonBase.h:437
Definition AddonBase.h:562
Definition AddonBase.h:498
ADDON_LOG
Definition addon_base.h:182
@ ADDON_LOG_FATAL
4 : To notify fatal unrecoverable errors, which can may also indicate upcoming crashes.
Definition addon_base.h:197
ADDON_STATUS
Definition addon_base.h:138
@ ADDON_STATUS_NEED_SETTINGS
Necessary settings are not yet set.
Definition addon_base.h:149
@ ADDON_STATUS_LOST_CONNECTION
A needed connection was lost.
Definition addon_base.h:143
@ ADDON_STATUS_OK
For everything OK and no error.
Definition addon_base.h:140
@ ADDON_STATUS_NEED_RESTART
Addon needs a restart inside Kodi.
Definition addon_base.h:146
@ ADDON_STATUS_UNKNOWN
Unknown and incomprehensible error.
Definition addon_base.h:152
@ ADDON_STATUS_PERMANENT_FAILURE
Permanent failure, like failing to resolve methods.
Definition addon_base.h:155
unsigned int GetUInt() const
To get settings value as unsigned integer.
Definition AddonBase.h:466
int GetInt() const
To get settings value as integer.
Definition AddonBase.h:463
bool GetBoolean() const
To get settings value as boolean.
Definition AddonBase.h:469
const std::string & GetString() const
To get settings value as string.
Definition AddonBase.h:460
float GetFloat() const
To get settings value as floating point.
Definition AddonBase.h:472
enumType GetEnum() const
To get settings value as enum.
Definition AddonBase.h:477
uint32_t GetNumber() const
Get optional identification number (usage relate to addon type).
Definition AddonBase.h:528
std::string GetID() const
Get optional identification string (usage relate to addon type).
Definition AddonBase.h:531
KODI_ADDON_INSTANCE_TYPE GetType() const
To get settings value as string.
Definition AddonBase.h:519
bool FirstInstance() const
Check this is first created instance by Kodi.
Definition AddonBase.h:537
bool IsType(KODI_ADDON_INSTANCE_TYPE type) const
Check asked type used on this class.
Definition AddonBase.h:525
std::string GetAPIVersion() const
Get API version from Kodi about instance.
Definition AddonBase.h:534
virtual ADDON_STATUS SetSetting(const std::string &settingName, const kodi::addon::CSettingValue &settingValue)
To inform addon about changed settings values.
Definition AddonBase.h:867
virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo &instance, KODI_ADDON_INSTANCE_HDL &hdl)
Instance created.
Definition AddonBase.h:921
virtual ~CAddonBase()=default
Destructor.
virtual ADDON_STATUS Create()
Main addon creation function.
Definition AddonBase.h:814
CAddonBase()
Addon base class constructor.
Definition AddonBase.h:778
virtual void DestroyInstance(const IInstanceInfo &instance, const KODI_ADDON_INSTANCE_HDL hdl)
Instance destroy.
Definition AddonBase.h:941
std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId, const std::string &defaultStr="")
Returns an addon's localized 'unicode string'.
Definition AddonBase.h:1225
std::string ATTR_DLL_LOCAL GetTempPath(const std::string &append="")
To get a temporary path for the addon.
Definition AddonBase.h:1176
std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
Get to related ADDON_STATUS a human readable text.
Definition AddonBase.h:1885
std::string ATTR_DLL_LOCAL GetLibPath(const std::string &append="")
This function gives OS associated executable binary path of the addon.
Definition AddonBase.h:1111
void * GetInterface(const std::string &name, const std::string &version)
Returns a function table to a named interface.
Definition AddonBase.h:1846
std::string ATTR_DLL_LOCAL GetUserPath(const std::string &append="")
To get the user-related folder of the addon.
Definition AddonBase.h:1143
std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition AddonBase.h:1866
std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string &id)
Returns the value of an addon property as a string.
Definition AddonBase.h:1810
std::string ATTR_DLL_LOCAL GetAddonPath(const std::string &append="")
To get the addon system installation folder.
Definition AddonBase.h:1074
void ATTR_DLL_LOCAL SetSettingInt(const std::string &settingName, int settingValue)
Set integer setting of addon.
Definition AddonBase.h:1475
bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string &settingName, float &settingValue)
Check and get a floating point setting value.
Definition AddonBase.h:1595
bool ATTR_DLL_LOCAL CheckSettingInt(const std::string &settingName, int &settingValue)
Check and get a integer setting value.
Definition AddonBase.h:1420
void ATTR_DLL_LOCAL SetSettingString(const std::string &settingName, const std::string &settingValue)
Set string setting of addon.
Definition AddonBase.h:1387
bool ATTR_DLL_LOCAL OpenSettings()
Opens this Add-Ons settings dialog.
Definition AddonBase.h:1274
void ATTR_DLL_LOCAL SetSettingFloat(const std::string &settingName, float settingValue)
Set floating point setting of addon.
Definition AddonBase.h:1651
bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string &settingName)
Check the given setting name is set to default value.
Definition AddonBase.h:1290
std::string ATTR_DLL_LOCAL GetSettingString(const std::string &settingName, const std::string &defaultValue="")
Get string setting value.
Definition AddonBase.h:1359
bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string &settingName, enumType &settingValue)
Check and get a enum setting value.
Definition AddonBase.h:1692
bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string &settingName, bool &settingValue)
Check and get a boolean setting value.
Definition AddonBase.h:1507
void ATTR_DLL_LOCAL SetSettingEnum(const std::string &settingName, enumType settingValue)
Set enum setting of addon.
Definition AddonBase.h:1772
enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string &settingName, enumType defaultValue=static_cast< enumType >(0))
Get enum setting value.
Definition AddonBase.h:1734
float ATTR_DLL_LOCAL GetSettingFloat(const std::string &settingName, float defaultValue=0.0f)
Get floating point setting value.
Definition AddonBase.h:1623
void ATTR_DLL_LOCAL SetSettingBoolean(const std::string &settingName, bool settingValue)
Set boolean setting of addon.
Definition AddonBase.h:1563
bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string &settingName, bool defaultValue=false)
Get boolean setting value.
Definition AddonBase.h:1535
bool ATTR_DLL_LOCAL CheckSettingString(const std::string &settingName, std::string &settingValue)
Check and get a string setting value.
Definition AddonBase.h:1321
int ATTR_DLL_LOCAL GetSettingInt(const std::string &settingName, int defaultValue=0)
Get integer setting value.
Definition AddonBase.h:1448
void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char *format,...)
Add a message to Kodi's log.
Definition AddonBase.h:1935
Main structure passed from kodi to addon with basic information needed to create add-on.
Definition addon_base.h:379
Callback function tables from addon to Kodi Set complete from Kodi!
Definition addon_base.h:326
Definition addon_base.h:220
Definition addon_base.h:268
Internal used structure to have stored C API data above and available for everything below.
Definition AddonBase.h:73
Definition renderHelper.h:20