11#include "c-api/addon_base.h"
27#include "tools/StringUtils.h"
61using HardwareContext = ADDON_HARDWARE_CONTEXT;
121 explicit CSettingValue(
const void* settingValue) : m_settingValue(settingValue) {}
123 bool empty()
const {
return (m_settingValue ==
nullptr) ? true :
false; }
142 std::string
GetString()
const {
return (
const char*)m_settingValue; }
145 int GetInt()
const {
return *(
const int*)m_settingValue; }
148 unsigned int GetUInt()
const {
return *(
const unsigned int*)m_settingValue; }
151 bool GetBoolean()
const {
return *(
const bool*)m_settingValue; }
154 float GetFloat()
const {
return *(
const float*)m_settingValue; }
158 template<
typename enumType>
161 return static_cast<enumType
>(*(
const int*)m_settingValue);
167 const void* m_settingValue;
189 : m_type(type), m_kodiVersion(version)
195 const std::string& instanceID,
196 KODI_HANDLE instance,
197 const std::string& version,
198 KODI_HANDLE& addonInstance)
200 return ADDON_STATUS_NOT_IMPLEMENTED;
204 const std::string m_kodiVersion;
248template<
class CPP_CLASS,
typename C_STRUCT>
252 CStructHdl() : m_cStructure(
new C_STRUCT()), m_owner(
true) {}
255 : m_cStructure(
new C_STRUCT(*cppClass.m_cStructure)), m_owner(
true)
259 CStructHdl(
const C_STRUCT* cStructure) : m_cStructure(
new C_STRUCT(*cStructure)), m_owner(
true) {}
261 CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
265 assert(&right.m_cStructure);
266 if (m_cStructure && !m_owner)
268 memcpy(m_cStructure, right.m_cStructure,
sizeof(C_STRUCT));
275 m_cStructure =
new C_STRUCT(*right.m_cStructure);
280 const CStructHdl& operator=(
const C_STRUCT& right)
283 if (m_cStructure && !m_owner)
285 memcpy(m_cStructure, &right,
sizeof(C_STRUCT));
292 m_cStructure =
new C_STRUCT(*right);
303 operator C_STRUCT*() {
return m_cStructure; }
304 operator const C_STRUCT*()
const {
return m_cStructure; }
306 const C_STRUCT* GetCStructure()
const {
return m_cStructure; }
309 C_STRUCT* m_cStructure =
nullptr;
312 bool m_owner =
false;
330 m_interface->toAddon->destroy = ADDONBASE_Destroy;
331 m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
332 m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
333 m_interface->toAddon->set_setting = ADDONBASE_SetSetting;
482 const std::string& instanceID,
483 KODI_HANDLE instance,
484 const std::string& version,
485 KODI_HANDLE& addonInstance)
487 return ADDON_STATUS_NOT_IMPLEMENTED;
506 const std::string& instanceID,
507 KODI_HANDLE addonInstance)
513 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
520 static inline void ADDONBASE_Destroy()
522 delete static_cast<CAddonBase*
>(m_interface->addonBase);
523 m_interface->addonBase =
nullptr;
526 static inline ADDON_STATUS ADDONBASE_SetSetting(
const char* settingName,
const void* settingValue)
528 return static_cast<CAddonBase*
>(m_interface->addonBase)
532 static inline ADDON_STATUS ADDONBASE_CreateInstance(
int instanceType,
533 const char* instanceID,
534 KODI_HANDLE instance,
536 KODI_HANDLE* addonInstance,
539 CAddonBase* base =
static_cast<CAddonBase*
>(m_interface->addonBase);
548 if (m_interface->firstKodiInstance == instance && m_interface->globalSingleInstance &&
549 static_cast<IAddonInstance*
>(m_interface->globalSingleInstance)->m_type == instanceType)
554 *addonInstance = m_interface->globalSingleInstance;
564 if (parent !=
nullptr)
565 status =
static_cast<IAddonInstance*
>(parent)->CreateInstance(
566 instanceType, instanceID, instance, version, *addonInstance);
569 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
571 status = base->CreateInstance(instanceType, instanceID, instance, version, *addonInstance);
575 if (*addonInstance ==
nullptr)
579 m_interface->toKodi->addon_log_msg(m_interface->toKodi->kodiBase,
ADDON_LOG_FATAL,
580 "kodi::addon::CAddonBase CreateInstance returned an "
581 "empty instance pointer, but reported OK!");
590 if (
static_cast<IAddonInstance*
>(*addonInstance)->m_type != instanceType)
592 m_interface->toKodi->addon_log_msg(
594 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
595 delete static_cast<IAddonInstance*
>(*addonInstance);
596 *addonInstance =
nullptr;
601 static_cast<IAddonInstance*
>(*addonInstance)->m_id = instanceID;
606 static inline void ADDONBASE_DestroyInstance(
int instanceType, KODI_HANDLE instance)
608 CAddonBase* base =
static_cast<CAddonBase*
>(m_interface->addonBase);
610 if (m_interface->globalSingleInstance ==
nullptr && instance != base)
612 base->DestroyInstance(instanceType,
static_cast<IAddonInstance*
>(instance)->m_id, instance);
613 delete static_cast<IAddonInstance*
>(instance);
632 using namespace kodi::addon;
634 char* str = CAddonBase::m_interface->toKodi->get_type_version(
635 CAddonBase::m_interface->toKodi->kodiBase, type);
636 std::string ret = str;
637 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
649inline std::string ATTRIBUTE_HIDDEN
GetAddonPath(
const std::string& append =
"")
651 using namespace kodi::addon;
654 CAddonBase::m_interface->toKodi->get_addon_path(CAddonBase::m_interface->toKodi->kodiBase);
655 std::string ret = str;
656 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
659 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
683 using namespace kodi::addon;
685 char* str = CAddonBase::m_interface->toKodi->get_base_user_path(
686 CAddonBase::m_interface->toKodi->kodiBase);
687 std::string ret = str;
688 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str);
691 if (append.at(0) !=
'\\' && append.at(0) !=
'/')
720 using namespace kodi::addon;
722 return CAddonBase::m_interface->libBasePath;
749inline void ATTRIBUTE_HIDDEN
Log(
const AddonLog loglevel,
const char* format, ...)
751 using namespace kodi::addon;
754 va_start(args, format);
757 CAddonBase::m_interface->toKodi->addon_log_msg(CAddonBase::m_interface->toKodi->kodiBase,
758 loglevel, str.c_str());
786 using namespace kodi::addon;
787 return CAddonBase::m_interface->toKodi->is_setting_using_default(
788 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str());
816 std::string& settingValue)
818 using namespace kodi::addon;
820 char* buffer =
nullptr;
821 bool ret = CAddonBase::m_interface->toKodi->get_setting_string(
822 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer);
826 settingValue = buffer;
827 CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, buffer);
853 const std::string& defaultValue =
"")
855 std::string settingValue = defaultValue;
881 const std::string& settingValue)
883 using namespace kodi::addon;
885 CAddonBase::m_interface->toKodi->set_setting_string(CAddonBase::m_interface->toKodi->kodiBase,
886 settingName.c_str(), settingValue.c_str());
913inline bool ATTRIBUTE_HIDDEN
CheckSettingInt(
const std::string& settingName,
int& settingValue)
915 using namespace kodi::addon;
917 return CAddonBase::m_interface->toKodi->get_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
918 settingName.c_str(), &settingValue);
941inline int ATTRIBUTE_HIDDEN
GetSettingInt(
const std::string& settingName,
int defaultValue = 0)
943 int settingValue = defaultValue;
968inline void ATTRIBUTE_HIDDEN
SetSettingInt(
const std::string& settingName,
int settingValue)
970 using namespace kodi::addon;
972 CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
973 settingName.c_str(), settingValue);
1002 using namespace kodi::addon;
1004 return CAddonBase::m_interface->toKodi->get_setting_bool(
1005 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1029 bool defaultValue =
false)
1031 bool settingValue = defaultValue;
1033 return settingValue;
1058 using namespace kodi::addon;
1060 CAddonBase::m_interface->toKodi->set_setting_bool(CAddonBase::m_interface->toKodi->kodiBase,
1061 settingName.c_str(), settingValue);
1090 using namespace kodi::addon;
1092 return CAddonBase::m_interface->toKodi->get_setting_float(
1093 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1117 float defaultValue = 0.0f)
1119 float settingValue = defaultValue;
1121 return settingValue;
1144inline void ATTRIBUTE_HIDDEN
SetSettingFloat(
const std::string& settingName,
float settingValue)
1146 using namespace kodi::addon;
1148 CAddonBase::m_interface->toKodi->set_setting_float(CAddonBase::m_interface->toKodi->kodiBase,
1149 settingName.c_str(), settingValue);
1184template<
typename enumType>
1186 enumType& settingValue)
1188 using namespace kodi::addon;
1190 int settingValueInt =
static_cast<int>(settingValue);
1191 bool ret = CAddonBase::m_interface->toKodi->get_setting_int(
1192 CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt);
1194 settingValue =
static_cast<enumType
>(settingValueInt);
1227template<
typename enumType>
1229 enumType defaultValue =
static_cast<enumType
>(0))
1231 enumType settingValue = defaultValue;
1233 return settingValue;
1265template<
typename enumType>
1266inline void ATTRIBUTE_HIDDEN
SetSettingEnum(
const std::string& settingName, enumType settingValue)
1268 using namespace kodi::addon;
1270 CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase,
1271 settingName.c_str(),
1272 static_cast<int>(settingValue));
1292 return "Lost Connection";
1294 return "Need Restart";
1296 return "Need Settings";
1298 return "Unknown error";
1300 return "Permanent failure";
1301 case ADDON_STATUS_NOT_IMPLEMENTED:
1302 return "Not implemented";
1328inline void*
GetInterface(
const std::string& name,
const std::string& version)
1330 using namespace kodi::addon;
1334 return toKodi->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1434#define ADDONCREATOR(AddonClass) \
1435 extern "C" ATTRIBUTE_DLL_EXPORT ADDON_STATUS ADDON_Create( \
1436 KODI_HANDLE addonInterface, const char*
, void* ) \
1438 kodi::addon::CAddonBase::m_interface = static_cast<AddonGlobalInterface*>(addonInterface); \
1439 kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \
1440 return static_cast<kodi::addon::CAddonBase*>(kodi::addon::CAddonBase::m_interface->addonBase) \
1443 extern "C" ATTRIBUTE_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \
1445 return kodi::addon::GetTypeVersion(type); \
1447 extern "C" ATTRIBUTE_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \
1449 return kodi::addon::GetTypeMinVersion(type); \
1451 AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr;
Definition: AddonBase.h:119
Definition: AddonBase.h:322
Definition: AddonBase.h:250
Definition: AddonBase.h:186
AddonLog
Definition: addon_base.h:149
@ ADDON_LOG_FATAL
4 : To notify fatal unrecoverable errors, which can may also indicate upcoming crashes.
Definition: addon_base.h:164
ADDON_STATUS
Definition: addon_base.h:105
@ ADDON_STATUS_NEED_SETTINGS
Necessary settings are not yet set.
Definition: addon_base.h:116
@ ADDON_STATUS_LOST_CONNECTION
A needed connection was lost.
Definition: addon_base.h:110
@ ADDON_STATUS_OK
For everything OK and no error.
Definition: addon_base.h:107
@ ADDON_STATUS_NEED_RESTART
Addon needs a restart inside Kodi.
Definition: addon_base.h:113
@ ADDON_STATUS_UNKNOWN
Unknown and incomprehensible error.
Definition: addon_base.h:119
@ ADDON_STATUS_PERMANENT_FAILURE
Permanent failure, like failing to resolve methods.
Definition: addon_base.h:122
ADDON_TYPE
Definition: versions.h:200
unsigned int GetUInt() const
To get settings value as unsigned integer.
Definition: AddonBase.h:148
int GetInt() const
To get settings value as integer.
Definition: AddonBase.h:145
bool GetBoolean() const
To get settings value as boolean.
Definition: AddonBase.h:151
std::string GetString() const
To get settings value as string.
Definition: AddonBase.h:142
float GetFloat() const
To get settings value as floating point.
Definition: AddonBase.h:154
enumType GetEnum() const
To get settings value as enum.
Definition: AddonBase.h:159
virtual ADDON_STATUS SetSetting(const std::string &settingName, const kodi::CSettingValue &settingValue)
To inform addon about changed settings values.
Definition: AddonBase.h:416
virtual ADDON_STATUS CreateInstance(int instanceType, const std::string &instanceID, KODI_HANDLE instance, const std::string &version, KODI_HANDLE &addonInstance)
Instance created.
Definition: AddonBase.h:481
virtual ~CAddonBase()=default
Destructor.
virtual ADDON_STATUS Create()
Main addon creation function.
Definition: AddonBase.h:360
CAddonBase()
Addon base class constructor.
Definition: AddonBase.h:328
virtual void DestroyInstance(int instanceType, const std::string &instanceID, KODI_HANDLE addonInstance)
Instance destroy.
Definition: AddonBase.h:505
bool ATTRIBUTE_HIDDEN CheckSettingString(const std::string &settingName, std::string &settingValue)
Check and get a string setting value.
Definition: AddonBase.h:815
void ATTRIBUTE_HIDDEN SetSettingFloat(const std::string &settingName, float settingValue)
Set floating point setting of addon.
Definition: AddonBase.h:1144
std::string ATTRIBUTE_HIDDEN GetSettingString(const std::string &settingName, const std::string &defaultValue="")
Get string setting value.
Definition: AddonBase.h:852
bool ATTRIBUTE_HIDDEN CheckSettingFloat(const std::string &settingName, float &settingValue)
Check and get a floating point setting value.
Definition: AddonBase.h:1088
void ATTRIBUTE_HIDDEN SetSettingEnum(const std::string &settingName, enumType settingValue)
Set enum setting of addon.
Definition: AddonBase.h:1266
enumType ATTRIBUTE_HIDDEN GetSettingEnum(const std::string &settingName, enumType defaultValue=static_cast< enumType >(0))
Get enum setting value.
Definition: AddonBase.h:1228
bool ATTRIBUTE_HIDDEN CheckSettingInt(const std::string &settingName, int &settingValue)
Check and get a integer setting value.
Definition: AddonBase.h:913
void ATTRIBUTE_HIDDEN SetSettingString(const std::string &settingName, const std::string &settingValue)
Set string setting of addon.
Definition: AddonBase.h:880
float ATTRIBUTE_HIDDEN GetSettingFloat(const std::string &settingName, float defaultValue=0.0f)
Get floating point setting value.
Definition: AddonBase.h:1116
bool ATTRIBUTE_HIDDEN CheckSettingBoolean(const std::string &settingName, bool &settingValue)
Check and get a boolean setting value.
Definition: AddonBase.h:1000
void ATTRIBUTE_HIDDEN SetSettingBoolean(const std::string &settingName, bool settingValue)
Set boolean setting of addon.
Definition: AddonBase.h:1056
int ATTRIBUTE_HIDDEN GetSettingInt(const std::string &settingName, int defaultValue=0)
Get integer setting value.
Definition: AddonBase.h:941
void ATTRIBUTE_HIDDEN SetSettingInt(const std::string &settingName, int settingValue)
Set integer setting of addon.
Definition: AddonBase.h:968
bool ATTRIBUTE_HIDDEN GetSettingBoolean(const std::string &settingName, bool defaultValue=false)
Get boolean setting value.
Definition: AddonBase.h:1028
bool ATTRIBUTE_HIDDEN CheckSettingEnum(const std::string &settingName, enumType &settingValue)
Check and get a enum setting value.
Definition: AddonBase.h:1185
bool ATTRIBUTE_HIDDEN IsSettingUsingDefault(const std::string &settingName)
Check the given setting name is set to default value.
Definition: AddonBase.h:784
std::string ATTRIBUTE_HIDDEN GetAddonPath(const std::string &append="")
To get the addon system installation folder.
Definition: AddonBase.h:649
std::string ATTRIBUTE_HIDDEN GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition: AddonBase.h:630
std::string ATTRIBUTE_HIDDEN GetBaseUserPath(const std::string &append="")
To get the user-related folder of the addon.
Definition: AddonBase.h:681
void * GetInterface(const std::string &name, const std::string &version)
Returns a function table to a named interface.
Definition: AddonBase.h:1328
std::string ATTRIBUTE_HIDDEN TranslateAddonStatus(ADDON_STATUS status)
Get to related ADDON_STATUS a human readable text.
Definition: AddonBase.h:1285
void ATTRIBUTE_HIDDEN Log(const AddonLog loglevel, const char *format,...)
Add a message to Kodi's log.
Definition: AddonBase.h:749
std::string ATTRIBUTE_HIDDEN GetLibPath()
This function gives OS associated executable binary path of the addon.
Definition: AddonBase.h:718
Main structure passed from kodi to addon with basic information needed to create add-on.
Definition: addon_base.h:252
Definition: addon_base.h:193