Kodi Development 22.0
for Binary and Script based Add-Ons
 
Loading...
Searching...
No Matches
AddonBase.h
1/*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "c-api/addon_base.h"
12#include "versions.h"
13
14#include <assert.h> /* assert */
15#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
16
17#ifdef __cplusplus
18
19#include "tools/StringUtils.h"
20
21#include <cstdlib>
22#include <cstring>
23#include <ctime>
24#include <memory>
25#include <stdexcept>
26#include <string>
27#include <vector>
28
29namespace kodi
30{
31
32namespace gui
33{
34struct IRenderHelper;
35} /* namespace gui */
36
37//==============================================================================
61using HardwareContext = ADDON_HARDWARE_CONTEXT;
63//------------------------------------------------------------------------------
64
65namespace addon
66{
67
72struct ATTR_DLL_LOCAL CPrivateBase
73{
74 // Interface function table to hold addresses on add-on and from kodi
75 static AddonGlobalInterface* m_interface;
76};
77
81inline char* AllocAndCopyString(const char* source)
82{
83 if (source)
84 {
85 const size_t len{strlen(source) + 1};
86 char* target = new char[len];
87 memcpy(target, source, len);
88 return target;
89 }
90 return nullptr;
91}
92
96inline void FreeString(const char* str)
97{
98 delete[] str;
99}
100
104inline void ReallocAndCopyString(const char** stringToRealloc, const char* stringToCopy)
105{
106 FreeString(*stringToRealloc);
107 *stringToRealloc = AllocAndCopyString(stringToCopy);
108}
109
113template<typename CPP_CLASS, typename C_STRUCT>
114inline static C_STRUCT** AllocAndCopyPointerArray(std::vector<CPP_CLASS>& sourceVector,
115 unsigned int& targetArraySize)
116{
117 targetArraySize = static_cast<unsigned int>(sourceVector.size());
118 if (targetArraySize > 0)
119 {
120 C_STRUCT** targetArray = new C_STRUCT* [targetArraySize] {};
121
122 unsigned int i{0};
123 for (auto& entry : sourceVector)
124 {
125 // Assign data to target array. Take pointer ownership.
126 C_STRUCT** arrayElem{&targetArray[i]};
127 *arrayElem = entry.release();
128 ++i;
129 }
130 return targetArray;
131 }
132 return nullptr;
133}
134
138template<typename CPP_CLASS, typename C_STRUCT>
139inline static void FreeDynamicPointerArray(C_STRUCT** targetArray, unsigned int targetArraySize)
140{
141 for (unsigned int i = 0; i < targetArraySize; ++i)
142 {
143 C_STRUCT** arrayElem{&targetArray[i]};
144 CPP_CLASS::FreeResources(*arrayElem);
145 delete *arrayElem;
146 }
147 delete[] targetArray;
148}
149
153template<typename CPP_CLASS, typename C_STRUCT>
154inline static void FreeStaticPointerArray(C_STRUCT** targetArray, unsigned int targetArraySize)
155{
156 for (unsigned int i = 0; i < targetArraySize; ++i)
157 {
158 C_STRUCT** arrayElem{&targetArray[i]};
159 delete *arrayElem;
160 }
161 delete[] targetArray;
162}
163
164/*
165 * Internally used helper class to manage processing of a "C" structure in "CPP"
166 * class.
167 *
168 * At constant, the "C" structure is copied, otherwise the given pointer is
169 * superseded and is changeable.
170 *
171 * -----------------------------------------------------------------------------
172 *
173 * Example:
174 *
175 * ~~~~~~~~~~~~~{.cpp}
176 * extern "C" typedef struct C_SAMPLE_DATA
177 * {
178 * unsigned int iUniqueId;
179 * } C_SAMPLE_DATA;
180 *
181 * class CPPSampleData : public CStructHdl<CPPSampleData, C_SAMPLE_DATA>
182 * {
183 * public:
184 * CPPSampleData() = default;
185 * CPPSampleData(const CPPSampleData& sample) : CStructHdl(sample) { }
186 * CPPSampleData(const C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
187 * CPPSampleData(C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
188 *
189 * void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; }
190 * unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; }
191 * };
192 *
193 * ~~~~~~~~~~~~~
194 *
195 * It also works with the following example:
196 *
197 * ~~~~~~~~~~~~~{.cpp}
198 * CPPSampleData test;
199 * // Some work
200 * C_SAMPLE_DATA* data = test;
201 * // Give "data" to Kodi
202 * ~~~~~~~~~~~~~
203 */
204template<class CPP_CLASS, typename C_STRUCT>
206{
207public:
208 CStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true) {}
209
210 CStructHdl(const CStructHdl& cppClass)
211 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)),
212 m_owner(true)
213 {
214 }
215
216 explicit CStructHdl(const C_STRUCT* cStructure)
217 : m_cStructure(new C_STRUCT(*cStructure)),
218 m_owner(true)
219 {
220 }
221
222 explicit CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
223
224 const CStructHdl& operator=(const CStructHdl& right)
225 {
226 if (this == &right)
227 return *this;
228
229 if (m_cStructure && !m_owner)
230 {
231 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
232 }
233 else
234 {
235 if (m_owner)
236 delete m_cStructure;
237 m_owner = true;
238 m_cStructure = new C_STRUCT(*right.m_cStructure);
239 }
240 return *this;
241 }
242
243 const CStructHdl& operator=(const C_STRUCT& right)
244 {
245 assert(&right);
246
247 if (m_cStructure == &right)
248 return *this;
249
250 if (m_cStructure && !m_owner)
251 {
252 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
253 }
254 else
255 {
256 if (m_owner)
257 delete m_cStructure;
258 m_owner = true;
259 m_cStructure = new C_STRUCT(*right);
260 }
261 return *this;
262 }
263
264 virtual ~CStructHdl()
265 {
266 if (m_owner)
267 delete m_cStructure;
268 }
269
270 operator C_STRUCT*() { return m_cStructure; }
271 operator const C_STRUCT*() const { return m_cStructure; }
272
273 const C_STRUCT* GetCStructure() const { return m_cStructure; }
274
275 C_STRUCT* release()
276 {
277 m_owner = false;
278 return m_cStructure;
279 }
280
281protected:
282 C_STRUCT* m_cStructure = nullptr;
283
284private:
285 bool m_owner = false;
286};
287
288template<class CPP_CLASS, typename C_STRUCT>
290{
291public:
292 DynamicCStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true)
293 {
294 memset(m_cStructure, 0, sizeof(C_STRUCT));
295 }
296
297 DynamicCStructHdl(const DynamicCStructHdl& cppClass)
298 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)),
299 m_owner(true)
300 {
301 CPP_CLASS::AllocResources(cppClass.m_cStructure, m_cStructure);
302 }
303
304 explicit DynamicCStructHdl(const C_STRUCT* cStructure)
305 : m_cStructure(new C_STRUCT(*cStructure)),
306 m_owner(true)
307 {
308 CPP_CLASS::AllocResources(cStructure, m_cStructure);
309 }
310
311 explicit DynamicCStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure)
312 {
313 assert(cStructure);
314 }
315
316 const DynamicCStructHdl& operator=(const DynamicCStructHdl& right)
317 {
318 if (this == &right)
319 return *this;
320
321 CPP_CLASS::FreeResources(m_cStructure);
322 if (m_cStructure && !m_owner)
323 {
324 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
325 }
326 else
327 {
328 if (m_owner)
329 delete m_cStructure;
330 m_owner = true;
331 m_cStructure = new C_STRUCT(*right.m_cStructure);
332 }
333 CPP_CLASS::AllocResources(right.m_cStructure, m_cStructure);
334 return *this;
335 }
336
337 const DynamicCStructHdl& operator=(const C_STRUCT& right)
338 {
339 assert(&right);
340
341 if (m_cStructure == &right)
342 return *this;
343
344 CPP_CLASS::FreeResources(m_cStructure);
345 if (m_cStructure && !m_owner)
346 {
347 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
348 }
349 else
350 {
351 if (m_owner)
352 delete m_cStructure;
353 m_owner = true;
354 m_cStructure = new C_STRUCT(*right);
355 }
356 CPP_CLASS::AllocResources(&right, m_cStructure);
357 return *this;
358 }
359
360 virtual ~DynamicCStructHdl()
361 {
362 if (m_owner)
363 {
364 CPP_CLASS::FreeResources(m_cStructure);
365 delete m_cStructure;
366 }
367 }
368
369 operator C_STRUCT*() { return m_cStructure; }
370 operator const C_STRUCT*() const { return m_cStructure; }
371
372 const C_STRUCT* GetCStructure() const { return m_cStructure; }
373
374 C_STRUCT* release()
375 {
376 m_owner = false;
377 return m_cStructure;
378 }
379
380protected:
381 C_STRUCT* m_cStructure = nullptr;
382
383private:
384 bool m_owner = false;
385};
386
387//==============================================================================
440class ATTR_DLL_LOCAL CSettingValue
441{
442public:
443 explicit CSettingValue(const std::string& settingValue) : str(settingValue) {}
444
445 bool empty() const { return str.empty(); }
446
459
462
464 const std::string& GetString() const { return str; }
465
467 int GetInt() const { return std::atoi(str.c_str()); }
468
470 unsigned int GetUInt() const { return std::atoi(str.c_str()); }
471
473 bool GetBoolean() const { return std::atoi(str.c_str()) > 0; }
474
476 float GetFloat() const { return static_cast<float>(std::atof(str.c_str())); }
477
480 template<typename enumType>
481 enumType GetEnum() const
482 {
483 return static_cast<enumType>(GetInt());
484 }
485
487
488private:
489 const std::string str;
490};
492//------------------------------------------------------------------------------
493
494//==============================================================================
501class ATTR_DLL_LOCAL IInstanceInfo
502{
503public:
504 explicit IInstanceInfo(KODI_ADDON_INSTANCE_STRUCT* instance) : m_instance(instance) {}
505
518
521
523 KODI_ADDON_INSTANCE_TYPE GetType() const { return m_instance->info->type; }
524
529 bool IsType(KODI_ADDON_INSTANCE_TYPE type) const { return m_instance->info->type == type; }
530
532 uint32_t GetNumber() const { return m_instance->info->number; }
533
535 std::string GetID() const { return m_instance->info->id; }
536
538 std::string GetAPIVersion() const { return m_instance->info->version; }
539
541 bool FirstInstance() const { return m_instance->info->first_instance; }
542
544
545 operator KODI_ADDON_INSTANCE_STRUCT*() { return m_instance; }
546
547 operator KODI_ADDON_INSTANCE_STRUCT*() const { return m_instance; }
548
549private:
550 IInstanceInfo() = delete;
551 IInstanceInfo(const IInstanceInfo&) = delete;
552
553 KODI_ADDON_INSTANCE_STRUCT* m_instance;
554};
556//------------------------------------------------------------------------------
557
558//==============================================================================
559/*
560 * Internal class to control various instance types with general parts defined
561 * here.
562 *
563 * Mainly is this currently used to identify requested instance types.
564 */
565class ATTR_DLL_LOCAL IAddonInstance
566{
567public:
568 explicit IAddonInstance(const kodi::addon::IInstanceInfo& instance) : m_instance(instance)
569 {
570 m_instance->functions->instance_setting_change_string = INSTANCE_instance_setting_change_string;
571 m_instance->functions->instance_setting_change_integer =
572 INSTANCE_instance_setting_change_integer;
573 m_instance->functions->instance_setting_change_boolean =
574 INSTANCE_instance_setting_change_boolean;
575 m_instance->functions->instance_setting_change_float = INSTANCE_instance_setting_change_float;
576 }
577 virtual ~IAddonInstance() = default;
578
579 virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo& instance,
580 KODI_ADDON_INSTANCE_HDL& hdl)
581 {
582 return ADDON_STATUS_NOT_IMPLEMENTED;
583 }
584
585 std::string GetInstanceAPIVersion() const { return m_instance->info->version; }
586
587 virtual ADDON_STATUS SetInstanceSetting(const std::string& settingName,
588 const kodi::addon::CSettingValue& settingValue)
589 {
591 }
592
593 inline bool IsInstanceSettingUsingDefault(const std::string& settingName)
594 {
595 return m_instance->info->functions->is_instance_setting_using_default(m_instance->info->kodi,
596 settingName.c_str());
597 }
598
599 inline std::string GetInstanceUserPath(const std::string& append = "")
600 {
601 using namespace kodi::addon;
602
603 char* str = m_instance->info->functions->get_instance_user_path(
604 CPrivateBase::m_interface->toKodi->kodiBase);
605 std::string ret = str;
606 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
607 str);
608 if (!append.empty())
609 {
610 if (append.at(0) != '\\' && append.at(0) != '/')
611#ifdef TARGET_WINDOWS
612 ret.append("\\");
613#else
614 ret.append("/");
615#endif
616 ret.append(append);
617 }
618 return ret;
619 }
620
621 inline bool CheckInstanceSettingString(const std::string& settingName, std::string& settingValue)
622 {
623 char* buffer = nullptr;
624 bool ret = m_instance->info->functions->get_instance_setting_string(
625 m_instance->info->kodi, settingName.c_str(), &buffer);
626 if (buffer)
627 {
628 if (ret)
629 settingValue = buffer;
630 free(buffer);
631 }
632 return ret;
633 }
634
635 inline std::string GetInstanceSettingString(const std::string& settingName,
636 const std::string& defaultValue = "")
637 {
638 std::string settingValue = defaultValue;
639 CheckInstanceSettingString(settingName, settingValue);
640 return settingValue;
641 }
642
643 inline void SetInstanceSettingString(const std::string& settingName,
644 const std::string& settingValue)
645 {
646 m_instance->info->functions->set_instance_setting_string(
647 m_instance->info->kodi, settingName.c_str(), settingValue.c_str());
648 }
649
650 inline bool CheckInstanceSettingInt(const std::string& settingName, int& settingValue)
651 {
652 KODI_ADDON_INSTANCE_FUNC_CB* cb = m_instance->info->functions;
653 return cb->get_instance_setting_int(m_instance->info->kodi, settingName.c_str(), &settingValue);
654 }
655
656 inline int GetInstanceSettingInt(const std::string& settingName, int defaultValue = 0)
657 {
658 int settingValue = defaultValue;
659 CheckInstanceSettingInt(settingName, settingValue);
660 return settingValue;
661 }
662
663 inline void SetInstanceSettingInt(const std::string& settingName, int settingValue)
664 {
665 m_instance->info->functions->set_instance_setting_int(m_instance->info->kodi,
666 settingName.c_str(), settingValue);
667 }
668
669 inline bool CheckInstanceSettingBoolean(const std::string& settingName, bool& settingValue)
670 {
671 return m_instance->info->functions->get_instance_setting_bool(
672 m_instance->info->kodi, settingName.c_str(), &settingValue);
673 }
674
675 inline bool GetInstanceSettingBoolean(const std::string& settingName, bool defaultValue = false)
676 {
677 bool settingValue = defaultValue;
678 CheckInstanceSettingBoolean(settingName, settingValue);
679 return settingValue;
680 }
681
682 inline void SetInstanceSettingBoolean(const std::string& settingName, bool settingValue)
683 {
684 m_instance->info->functions->set_instance_setting_bool(m_instance->info->kodi,
685 settingName.c_str(), settingValue);
686 }
687
688 inline bool CheckInstanceSettingFloat(const std::string& settingName, float& settingValue)
689 {
690 return m_instance->info->functions->get_instance_setting_float(
691 m_instance->info->kodi, settingName.c_str(), &settingValue);
692 }
693
694 inline float GetInstanceSettingFloat(const std::string& settingName, float defaultValue = 0.0f)
695 {
696 float settingValue = defaultValue;
697 CheckInstanceSettingFloat(settingName, settingValue);
698 return settingValue;
699 }
700
701 inline void SetInstanceSettingFloat(const std::string& settingName, float settingValue)
702 {
703 m_instance->info->functions->set_instance_setting_float(m_instance->info->kodi,
704 settingName.c_str(), settingValue);
705 }
706
707 template<typename enumType>
708 inline bool CheckInstanceSettingEnum(const std::string& settingName, enumType& settingValue)
709 {
710 using namespace kodi::addon;
711
712 int settingValueInt = static_cast<int>(settingValue);
713 bool ret = m_instance->info->functions->get_instance_setting_int(
714 m_instance->info->kodi, settingName.c_str(), &settingValueInt);
715 if (ret)
716 settingValue = static_cast<enumType>(settingValueInt);
717 return ret;
718 }
719
720 template<typename enumType>
721 inline enumType GetInstanceSettingEnum(const std::string& settingName,
722 enumType defaultValue = static_cast<enumType>(0))
723 {
724 enumType settingValue = defaultValue;
725 CheckInstanceSettingEnum(settingName, settingValue);
726 return settingValue;
727 }
728
729 template<typename enumType>
730 inline void SetInstanceSettingEnum(const std::string& settingName, enumType settingValue)
731 {
732 m_instance->info->functions->set_instance_setting_int(
733 m_instance->info->kodi, settingName.c_str(), static_cast<int>(settingValue));
734 }
735
736private:
737 static inline ADDON_STATUS INSTANCE_instance_setting_change_string(
738 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, const char* value)
739 {
740 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name, CSettingValue(value));
741 }
742
743 static inline ADDON_STATUS INSTANCE_instance_setting_change_boolean(
744 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, bool value)
745 {
746 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name,
747 CSettingValue(value ? "1" : "0"));
748 }
749
750 static inline ADDON_STATUS INSTANCE_instance_setting_change_integer(
751 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, int value)
752 {
753 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
754 name, CSettingValue(std::to_string(value)));
755 }
756
757 static inline ADDON_STATUS INSTANCE_instance_setting_change_float(
758 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, float value)
759 {
760 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
761 name, CSettingValue(std::to_string(value)));
762 }
763
764 friend class CAddonBase;
765
766 const KODI_ADDON_INSTANCE_STRUCT* m_instance;
767};
768
769//============================================================================
775class ATTR_DLL_LOCAL CAddonBase
776{
777public:
778 //============================================================================
783 {
784 CPrivateBase::m_interface->toAddon->create = nullptr;
785 CPrivateBase::m_interface->toAddon->destroy = ADDONBASE_Destroy;
786 CPrivateBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
787 CPrivateBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
788 CPrivateBase::m_interface->toAddon->setting_change_string = ADDONBASE_setting_change_string;
789 CPrivateBase::m_interface->toAddon->setting_change_boolean = ADDONBASE_setting_change_boolean;
790 CPrivateBase::m_interface->toAddon->setting_change_integer = ADDONBASE_setting_change_integer;
791 CPrivateBase::m_interface->toAddon->setting_change_float = ADDONBASE_setting_change_float;
792 }
793 //----------------------------------------------------------------------------
794
795 //============================================================================
799 virtual ~CAddonBase() = default;
800 //----------------------------------------------------------------------------
801
802 //============================================================================
818 virtual ADDON_STATUS Create() { return ADDON_STATUS_OK; }
819 //----------------------------------------------------------------------------
820
821 //============================================================================
871 virtual ADDON_STATUS SetSetting(const std::string& settingName,
872 const kodi::addon::CSettingValue& settingValue)
873 {
875 }
876 //----------------------------------------------------------------------------
877
878 //==========================================================================
926 KODI_ADDON_INSTANCE_HDL& hdl)
927 {
928 return ADDON_STATUS_NOT_IMPLEMENTED;
929 }
930 //--------------------------------------------------------------------------
931
932 //==========================================================================
945 virtual void DestroyInstance(const IInstanceInfo& instance, const KODI_ADDON_INSTANCE_HDL hdl) {}
946 //--------------------------------------------------------------------------
947
948 /* Background helper for GUI render systems, e.g. Screensaver or Visualization */
949 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
950
951private:
952 static inline void ADDONBASE_Destroy(const KODI_ADDON_HDL hdl)
953 {
954 delete static_cast<CAddonBase*>(hdl);
955 }
956
957 static inline ADDON_STATUS ADDONBASE_CreateInstance(const KODI_ADDON_HDL hdl,
958 struct KODI_ADDON_INSTANCE_STRUCT* instance)
959 {
960 CAddonBase* base = static_cast<CAddonBase*>(hdl);
961
962 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED;
963
964 /* Check about single instance usage:
965 * 1. The kodi side instance pointer must be equal to first one
966 * 2. The addon side instance pointer must be set
967 * 3. And the requested type must be equal with used add-on class
968 */
969 if (CPrivateBase::m_interface->firstKodiInstance == instance &&
970 CPrivateBase::m_interface->globalSingleInstance &&
971 static_cast<IAddonInstance*>(CPrivateBase::m_interface->globalSingleInstance)
972 ->m_instance->info->type == instance->info->type)
973 {
974 /* The handling here is intended for the case of the add-on only one
975 * instance and this is integrated in the add-on base class.
976 */
977 instance->hdl = CPrivateBase::m_interface->globalSingleInstance;
978 status = ADDON_STATUS_OK;
979 }
980 else
981 {
982 /* Here it should use the CreateInstance instance function to allow
983 * creation of several on one addon.
984 */
985
986 IInstanceInfo instanceInfo(instance);
987
988 /* Check first a parent is defined about (e.g. Codec within inputstream) */
989 if (instance->info->parent != nullptr)
990 status = static_cast<IAddonInstance*>(instance->info->parent)
991 ->CreateInstance(instanceInfo, instance->hdl);
992
993 /* if no parent call the main instance creation function to get it */
994 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
995 {
996 status = base->CreateInstance(instanceInfo, instance->hdl);
997 }
998 }
999
1000 if (instance->hdl == nullptr)
1001 {
1002 if (status == ADDON_STATUS_OK)
1003 {
1004 CPrivateBase::m_interface->toKodi->addon_log_msg(
1005 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1006 "kodi::addon::CAddonBase CreateInstance returned an "
1007 "empty instance pointer, but reported OK!");
1009 }
1010 else
1011 {
1012 return status;
1013 }
1014 }
1015
1016 if (static_cast<IAddonInstance*>(instance->hdl)->m_instance->info->type != instance->info->type)
1017 {
1018 CPrivateBase::m_interface->toKodi->addon_log_msg(
1019 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1020 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
1021 delete static_cast<IAddonInstance*>(instance->hdl);
1022 instance->hdl = nullptr;
1024 }
1025
1026 return status;
1027 }
1028
1029 static inline void ADDONBASE_DestroyInstance(const KODI_ADDON_HDL hdl,
1030 struct KODI_ADDON_INSTANCE_STRUCT* instance)
1031 {
1032 CAddonBase* base = static_cast<CAddonBase*>(hdl);
1033
1034 if (CPrivateBase::m_interface->globalSingleInstance == nullptr && instance->hdl != base)
1035 {
1036 IInstanceInfo instanceInfo(instance);
1037 base->DestroyInstance(instanceInfo, instance->hdl);
1038 delete static_cast<IAddonInstance*>(instance->hdl);
1039 }
1040 }
1041
1042 static inline ADDON_STATUS ADDONBASE_setting_change_string(const KODI_ADDON_HDL hdl,
1043 const char* name,
1044 const char* value)
1045 {
1046 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value));
1047 }
1048
1049 static inline ADDON_STATUS ADDONBASE_setting_change_boolean(const KODI_ADDON_HDL hdl,
1050 const char* name,
1051 bool value)
1052 {
1053 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value ? "1" : "0"));
1054 }
1055
1056 static inline ADDON_STATUS ADDONBASE_setting_change_integer(const KODI_ADDON_HDL hdl,
1057 const char* name,
1058 int value)
1059 {
1060 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1061 }
1062
1063 static inline ADDON_STATUS ADDONBASE_setting_change_float(const KODI_ADDON_HDL hdl,
1064 const char* name,
1065 float value)
1066 {
1067 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1068 }
1069};
1070
1071//==============================================================================
1078inline std::string ATTR_DLL_LOCAL GetAddonPath(const std::string& append = "")
1079{
1080 using namespace kodi::addon;
1081
1082 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_addon_path(
1083 CPrivateBase::m_interface->toKodi->kodiBase);
1084 std::string ret = str;
1085 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1086 if (!append.empty())
1087 {
1088 if (append.at(0) != '\\' && append.at(0) != '/')
1089#ifdef TARGET_WINDOWS
1090 ret.append("\\");
1091#else
1092 ret.append("/");
1093#endif
1094 ret.append(append);
1095 }
1096 return ret;
1097}
1098//------------------------------------------------------------------------------
1099
1100//==============================================================================
1115inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "")
1116{
1117 using namespace kodi::addon;
1118
1119 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_lib_path(
1120 CPrivateBase::m_interface->toKodi->kodiBase);
1121 std::string ret = str;
1122 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1123 if (!append.empty())
1124 {
1125 if (append.at(0) != '\\' && append.at(0) != '/')
1126#ifdef TARGET_WINDOWS
1127 ret.append("\\");
1128#else
1129 ret.append("/");
1130#endif
1131 ret.append(append);
1132 }
1133 return ret;
1134}
1135//------------------------------------------------------------------------------
1136
1137//==============================================================================
1147inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "")
1148{
1149 using namespace kodi::addon;
1150
1151 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_user_path(
1152 CPrivateBase::m_interface->toKodi->kodiBase);
1153 std::string ret = str;
1154 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1155 if (!append.empty())
1156 {
1157 if (append.at(0) != '\\' && append.at(0) != '/')
1158#ifdef TARGET_WINDOWS
1159 ret.append("\\");
1160#else
1161 ret.append("/");
1162#endif
1163 ret.append(append);
1164 }
1165 return ret;
1166}
1167//------------------------------------------------------------------------------
1168
1169//==============================================================================
1180inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "")
1181{
1182 using namespace kodi::addon;
1183
1184 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_temp_path(
1185 CPrivateBase::m_interface->toKodi->kodiBase);
1186 std::string ret = str;
1187 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1188 if (!append.empty())
1189 {
1190 if (append.at(0) != '\\' && append.at(0) != '/')
1191#ifdef TARGET_WINDOWS
1192 ret.append("\\");
1193#else
1194 ret.append("/");
1195#endif
1196 ret.append(append);
1197 }
1198 return ret;
1199}
1200//------------------------------------------------------------------------------
1201
1202//==============================================================================
1229inline std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId,
1230 const std::string& defaultStr = "")
1231{
1232 using namespace kodi::addon;
1233
1234 std::string retString = defaultStr;
1235 char* strMsg = CPrivateBase::m_interface->toKodi->kodi_addon->get_localized_string(
1236 CPrivateBase::m_interface->toKodi->kodiBase, labelId);
1237 if (strMsg != nullptr)
1238 {
1239 if (std::strlen(strMsg))
1240 retString = strMsg;
1241 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1242 strMsg);
1243 }
1244 return retString;
1245}
1246//------------------------------------------------------------------------------
1247
1248//##############################################################################
1260
1262//==============================================================================
1278inline bool ATTR_DLL_LOCAL OpenSettings()
1279{
1280 using namespace kodi::addon;
1281 return CPrivateBase::m_interface->toKodi->kodi_addon->open_settings_dialog(
1282 CPrivateBase::m_interface->toKodi->kodiBase);
1283}
1284//------------------------------------------------------------------------------
1285
1286//==============================================================================
1294inline bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string& settingName)
1295{
1296 using namespace kodi::addon;
1297 return CPrivateBase::m_interface->toKodi->kodi_addon->is_setting_using_default(
1298 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str());
1299}
1300//------------------------------------------------------------------------------
1301
1302//==============================================================================
1325inline bool ATTR_DLL_LOCAL CheckSettingString(const std::string& settingName,
1326 std::string& settingValue)
1327{
1328 using namespace kodi::addon;
1329
1330 char* buffer = nullptr;
1331 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_string(
1332 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer);
1333 if (buffer)
1334 {
1335 if (ret)
1336 settingValue = buffer;
1337 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1338 buffer);
1339 }
1340 return ret;
1341}
1342//------------------------------------------------------------------------------
1343
1344//==============================================================================
1363inline std::string ATTR_DLL_LOCAL GetSettingString(const std::string& settingName,
1364 const std::string& defaultValue = "")
1365{
1366 std::string settingValue = defaultValue;
1367 CheckSettingString(settingName, settingValue);
1368 return settingValue;
1369}
1370//------------------------------------------------------------------------------
1371
1372//==============================================================================
1391inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName,
1392 const std::string& settingValue)
1393{
1394 using namespace kodi::addon;
1395
1396 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_string(
1397 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue.c_str());
1398}
1399//------------------------------------------------------------------------------
1400
1401//==============================================================================
1424inline bool ATTR_DLL_LOCAL CheckSettingInt(const std::string& settingName, int& settingValue)
1425{
1426 using namespace kodi::addon;
1427
1428 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1429 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1430}
1431//------------------------------------------------------------------------------
1432
1433//==============================================================================
1452inline int ATTR_DLL_LOCAL GetSettingInt(const std::string& settingName, int defaultValue = 0)
1453{
1454 int settingValue = defaultValue;
1455 CheckSettingInt(settingName, settingValue);
1456 return settingValue;
1457}
1458//------------------------------------------------------------------------------
1459
1460//==============================================================================
1479inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int settingValue)
1480{
1481 using namespace kodi::addon;
1482
1483 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1484 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1485}
1486//------------------------------------------------------------------------------
1487
1488//==============================================================================
1511inline bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string& settingName, bool& settingValue)
1512{
1513 using namespace kodi::addon;
1514
1515 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_bool(
1516 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1517}
1518//------------------------------------------------------------------------------
1519
1520//==============================================================================
1539inline bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string& settingName,
1540 bool defaultValue = false)
1541{
1542 bool settingValue = defaultValue;
1543 CheckSettingBoolean(settingName, settingValue);
1544 return settingValue;
1545}
1546//------------------------------------------------------------------------------
1547
1548//==============================================================================
1567inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, bool settingValue)
1568{
1569 using namespace kodi::addon;
1570
1571 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_bool(
1572 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1573}
1574//------------------------------------------------------------------------------
1575
1576//==============================================================================
1599inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, float& settingValue)
1600{
1601 using namespace kodi::addon;
1602
1603 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_float(
1604 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1605}
1606//------------------------------------------------------------------------------
1607
1608//==============================================================================
1627inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName,
1628 float defaultValue = 0.0f)
1629{
1630 float settingValue = defaultValue;
1631 CheckSettingFloat(settingName, settingValue);
1632 return settingValue;
1633}
1634//------------------------------------------------------------------------------
1635
1636//==============================================================================
1655inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float settingValue)
1656{
1657 using namespace kodi::addon;
1658
1659 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_float(
1660 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1661}
1662//------------------------------------------------------------------------------
1663
1664//==============================================================================
1695template<typename enumType>
1696inline bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string& settingName, enumType& settingValue)
1697{
1698 using namespace kodi::addon;
1699
1700 int settingValueInt = static_cast<int>(settingValue);
1701 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1702 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt);
1703 if (ret)
1704 settingValue = static_cast<enumType>(settingValueInt);
1705 return ret;
1706}
1707//------------------------------------------------------------------------------
1708
1709//==============================================================================
1737template<typename enumType>
1738inline enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string& settingName,
1739 enumType defaultValue = static_cast<enumType>(0))
1740{
1741 enumType settingValue = defaultValue;
1742 CheckSettingEnum(settingName, settingValue);
1743 return settingValue;
1744}
1745//------------------------------------------------------------------------------
1746
1747//==============================================================================
1775template<typename enumType>
1776inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumType settingValue)
1777{
1778 using namespace kodi::addon;
1779
1780 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1781 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(),
1782 static_cast<int>(settingValue));
1783}
1784//------------------------------------------------------------------------------
1785
1788//==============================================================================
1814inline std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string& id)
1815{
1816 using namespace kodi::addon;
1817
1818 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1819
1820 std::string strReturn;
1821 char* strMsg = toKodi->kodi_addon->get_addon_info(toKodi->kodiBase, id.c_str());
1822 if (strMsg != nullptr)
1823 {
1824 if (std::strlen(strMsg))
1825 strReturn = strMsg;
1826 toKodi->free_string(toKodi->kodiBase, strMsg);
1827 }
1828 return strReturn;
1829}
1830//------------------------------------------------------------------------------
1831
1832//==============================================================================
1850inline void* GetInterface(const std::string& name, const std::string& version)
1851{
1852 using namespace kodi::addon;
1853
1854 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1855
1856 return toKodi->kodi_addon->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1857}
1858//----------------------------------------------------------------------------
1859
1860//==============================================================================
1870inline std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
1871{
1872 using namespace kodi::addon;
1873
1874 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_type_version(
1875 CPrivateBase::m_interface->toKodi->kodiBase, type);
1876 std::string ret = str;
1877 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1878 return ret;
1879}
1880//------------------------------------------------------------------------------
1881
1882//============================================================================
1889inline std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
1890{
1891 switch (status)
1892 {
1893 case ADDON_STATUS_OK:
1894 return "OK";
1896 return "Lost Connection";
1898 return "Need Restart";
1900 return "Need Settings";
1902 return "Unknown error";
1904 return "Permanent failure";
1905 case ADDON_STATUS_NOT_IMPLEMENTED:
1906 return "Not implemented";
1907 default:
1908 break;
1909 }
1910 return "Unknown";
1911}
1912//----------------------------------------------------------------------------
1913
1914} /* namespace addon */
1915
1916//==============================================================================
1939inline void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char* format, ...)
1940{
1941 using namespace kodi::addon;
1942
1943 va_list args;
1944 va_start(args, format);
1945 const std::string str = kodi::tools::StringUtils::FormatV(format, args);
1946 va_end(args);
1947 CPrivateBase::m_interface->toKodi->addon_log_msg(CPrivateBase::m_interface->toKodi->kodiBase,
1948 loglevel, str.c_str());
1949}
1950//------------------------------------------------------------------------------
1951
1952} /* namespace kodi */
1953
1954//==============================================================================
2048#define ADDONCREATOR(AddonClass) \
2049 extern "C" ATTR_DLL_EXPORT ADDON_STATUS ADDON_Create(KODI_HANDLE addonInterface) \
2050 { \
2051 using namespace kodi::addon; \
2052 CPrivateBase::m_interface = static_cast<AddonGlobalInterface*>(addonInterface); \
2053 CPrivateBase::m_interface->addonBase = new AddonClass; \
2054 return static_cast<CAddonBase*>(CPrivateBase::m_interface->addonBase)->Create(); \
2055 } \
2056 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \
2057 { \
2058 return kodi::addon::GetTypeVersion(type); \
2059 } \
2060 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \
2061 { \
2062 return kodi::addon::GetTypeMinVersion(type); \
2063 } \
2064 AddonGlobalInterface* kodi::addon::CPrivateBase::m_interface = nullptr;
2065//------------------------------------------------------------------------------
2066
2067#endif /* __cplusplus */
Definition AddonBase.h:776
Definition AddonBase.h:441
Definition AddonBase.h:206
Definition AddonBase.h:290
Definition AddonBase.h:566
Definition AddonBase.h:502
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:470
int GetInt() const
To get settings value as integer.
Definition AddonBase.h:467
bool GetBoolean() const
To get settings value as boolean.
Definition AddonBase.h:473
const std::string & GetString() const
To get settings value as string.
Definition AddonBase.h:464
float GetFloat() const
To get settings value as floating point.
Definition AddonBase.h:476
enumType GetEnum() const
To get settings value as enum.
Definition AddonBase.h:481
uint32_t GetNumber() const
Get optional identification number (usage relate to addon type).
Definition AddonBase.h:532
std::string GetID() const
Get optional identification string (usage relate to addon type).
Definition AddonBase.h:535
KODI_ADDON_INSTANCE_TYPE GetType() const
To get settings value as string.
Definition AddonBase.h:523
bool FirstInstance() const
Check this is first created instance by Kodi.
Definition AddonBase.h:541
bool IsType(KODI_ADDON_INSTANCE_TYPE type) const
Check asked type used on this class.
Definition AddonBase.h:529
std::string GetAPIVersion() const
Get API version from Kodi about instance.
Definition AddonBase.h:538
virtual ADDON_STATUS SetSetting(const std::string &settingName, const kodi::addon::CSettingValue &settingValue)
To inform addon about changed settings values.
Definition AddonBase.h:871
virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo &instance, KODI_ADDON_INSTANCE_HDL &hdl)
Instance created.
Definition AddonBase.h:925
virtual ~CAddonBase()=default
Destructor.
virtual ADDON_STATUS Create()
Main addon creation function.
Definition AddonBase.h:818
CAddonBase()
Addon base class constructor.
Definition AddonBase.h:782
virtual void DestroyInstance(const IInstanceInfo &instance, const KODI_ADDON_INSTANCE_HDL hdl)
Instance destroy.
Definition AddonBase.h:945
std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId, const std::string &defaultStr="")
Returns an addon's localized 'unicode string'.
Definition AddonBase.h:1229
std::string ATTR_DLL_LOCAL GetTempPath(const std::string &append="")
To get a temporary path for the addon.
Definition AddonBase.h:1180
std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
Get to related ADDON_STATUS a human readable text.
Definition AddonBase.h:1889
std::string ATTR_DLL_LOCAL GetLibPath(const std::string &append="")
This function gives OS associated executable binary path of the addon.
Definition AddonBase.h:1115
void * GetInterface(const std::string &name, const std::string &version)
Returns a function table to a named interface.
Definition AddonBase.h:1850
std::string ATTR_DLL_LOCAL GetUserPath(const std::string &append="")
To get the user-related folder of the addon.
Definition AddonBase.h:1147
std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition AddonBase.h:1870
std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string &id)
Returns the value of an addon property as a string.
Definition AddonBase.h:1814
std::string ATTR_DLL_LOCAL GetAddonPath(const std::string &append="")
To get the addon system installation folder.
Definition AddonBase.h:1078
void ATTR_DLL_LOCAL SetSettingInt(const std::string &settingName, int settingValue)
Set integer setting of addon.
Definition AddonBase.h:1479
bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string &settingName, float &settingValue)
Check and get a floating point setting value.
Definition AddonBase.h:1599
bool ATTR_DLL_LOCAL CheckSettingInt(const std::string &settingName, int &settingValue)
Check and get a integer setting value.
Definition AddonBase.h:1424
void ATTR_DLL_LOCAL SetSettingString(const std::string &settingName, const std::string &settingValue)
Set string setting of addon.
Definition AddonBase.h:1391
bool ATTR_DLL_LOCAL OpenSettings()
Opens this Add-Ons settings dialog.
Definition AddonBase.h:1278
void ATTR_DLL_LOCAL SetSettingFloat(const std::string &settingName, float settingValue)
Set floating point setting of addon.
Definition AddonBase.h:1655
bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string &settingName)
Check the given setting name is set to default value.
Definition AddonBase.h:1294
std::string ATTR_DLL_LOCAL GetSettingString(const std::string &settingName, const std::string &defaultValue="")
Get string setting value.
Definition AddonBase.h:1363
bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string &settingName, enumType &settingValue)
Check and get a enum setting value.
Definition AddonBase.h:1696
bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string &settingName, bool &settingValue)
Check and get a boolean setting value.
Definition AddonBase.h:1511
void ATTR_DLL_LOCAL SetSettingEnum(const std::string &settingName, enumType settingValue)
Set enum setting of addon.
Definition AddonBase.h:1776
enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string &settingName, enumType defaultValue=static_cast< enumType >(0))
Get enum setting value.
Definition AddonBase.h:1738
float ATTR_DLL_LOCAL GetSettingFloat(const std::string &settingName, float defaultValue=0.0f)
Get floating point setting value.
Definition AddonBase.h:1627
void ATTR_DLL_LOCAL SetSettingBoolean(const std::string &settingName, bool settingValue)
Set boolean setting of addon.
Definition AddonBase.h:1567
bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string &settingName, bool defaultValue=false)
Get boolean setting value.
Definition AddonBase.h:1539
bool ATTR_DLL_LOCAL CheckSettingString(const std::string &settingName, std::string &settingValue)
Check and get a string setting value.
Definition AddonBase.h:1325
int ATTR_DLL_LOCAL GetSettingInt(const std::string &settingName, int defaultValue=0)
Get integer setting value.
Definition AddonBase.h:1452
static std::string FormatV(PRINTF_FORMAT_STRING const char *fmt, va_list args)
Returns the C++ string pointed by given format list.
Definition StringUtils.h:604
void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char *format,...)
Add a message to Kodi's log.
Definition AddonBase.h:1939
Main structure passed from kodi to addon with basic information needed to create add-on.
Definition addon_base.h:380
Callback function tables from addon to Kodi Set complete from Kodi!
Definition addon_base.h:327
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