Kodi Development 22.0
for Binary and Script based Add-Ons
 
All Classes Functions Variables Typedefs Enumerations Enumerator Modules Pages
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>
205class CStructHdl
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)), m_owner(true)
212 {
213 }
214
215 explicit CStructHdl(const C_STRUCT* cStructure)
216 : m_cStructure(new C_STRUCT(*cStructure)), m_owner(true)
217 {
218 }
219
220 explicit CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
221
222 const CStructHdl& operator=(const CStructHdl& right)
223 {
224 if (this == &right)
225 return *this;
226
227 if (m_cStructure && !m_owner)
228 {
229 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
230 }
231 else
232 {
233 if (m_owner)
234 delete m_cStructure;
235 m_owner = true;
236 m_cStructure = new C_STRUCT(*right.m_cStructure);
237 }
238 return *this;
239 }
240
241 const CStructHdl& operator=(const C_STRUCT& right)
242 {
243 assert(&right);
244
245 if (m_cStructure == &right)
246 return *this;
247
248 if (m_cStructure && !m_owner)
249 {
250 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
251 }
252 else
253 {
254 if (m_owner)
255 delete m_cStructure;
256 m_owner = true;
257 m_cStructure = new C_STRUCT(*right);
258 }
259 return *this;
260 }
261
262 virtual ~CStructHdl()
263 {
264 if (m_owner)
265 delete m_cStructure;
266 }
267
268 operator C_STRUCT*() { return m_cStructure; }
269 operator const C_STRUCT*() const { return m_cStructure; }
270
271 const C_STRUCT* GetCStructure() const { return m_cStructure; }
272
273 C_STRUCT* release()
274 {
275 m_owner = false;
276 return m_cStructure;
277 }
278
279protected:
280 C_STRUCT* m_cStructure = nullptr;
281
282private:
283 bool m_owner = false;
284};
285
286template<class CPP_CLASS, typename C_STRUCT>
287class DynamicCStructHdl
288{
289public:
290 DynamicCStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true)
291 {
292 memset(m_cStructure, 0, sizeof(C_STRUCT));
293 }
294
295 DynamicCStructHdl(const DynamicCStructHdl& cppClass)
296 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)), m_owner(true)
297 {
298 CPP_CLASS::AllocResources(cppClass.m_cStructure, m_cStructure);
299 }
300
301 explicit DynamicCStructHdl(const C_STRUCT* cStructure)
302 : m_cStructure(new C_STRUCT(*cStructure)), m_owner(true)
303 {
304 CPP_CLASS::AllocResources(cStructure, m_cStructure);
305 }
306
307 explicit DynamicCStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure)
308 {
309 assert(cStructure);
310 }
311
312 const DynamicCStructHdl& operator=(const DynamicCStructHdl& right)
313 {
314 if (this == &right)
315 return *this;
316
317 CPP_CLASS::FreeResources(m_cStructure);
318 if (m_cStructure && !m_owner)
319 {
320 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
321 }
322 else
323 {
324 if (m_owner)
325 delete m_cStructure;
326 m_owner = true;
327 m_cStructure = new C_STRUCT(*right.m_cStructure);
328 }
329 CPP_CLASS::AllocResources(right.m_cStructure, m_cStructure);
330 return *this;
331 }
332
333 const DynamicCStructHdl& operator=(const C_STRUCT& right)
334 {
335 assert(&right);
336
337 if (m_cStructure == &right)
338 return *this;
339
340 CPP_CLASS::FreeResources(m_cStructure);
341 if (m_cStructure && !m_owner)
342 {
343 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
344 }
345 else
346 {
347 if (m_owner)
348 delete m_cStructure;
349 m_owner = true;
350 m_cStructure = new C_STRUCT(*right);
351 }
352 CPP_CLASS::AllocResources(&right, m_cStructure);
353 return *this;
354 }
355
356 virtual ~DynamicCStructHdl()
357 {
358 if (m_owner)
359 {
360 CPP_CLASS::FreeResources(m_cStructure);
361 delete m_cStructure;
362 }
363 }
364
365 operator C_STRUCT*() { return m_cStructure; }
366 operator const C_STRUCT*() const { return m_cStructure; }
367
368 const C_STRUCT* GetCStructure() const { return m_cStructure; }
369
370 C_STRUCT* release()
371 {
372 m_owner = false;
373 return m_cStructure;
374 }
375
376protected:
377 C_STRUCT* m_cStructure = nullptr;
378
379private:
380 bool m_owner = false;
381};
382
383//==============================================================================
436class ATTR_DLL_LOCAL CSettingValue
437{
438public:
439 explicit CSettingValue(const std::string& settingValue) : str(settingValue) {}
440
441 bool empty() const { return str.empty(); }
442
455
458
460 const std::string& GetString() const { return str; }
461
463 int GetInt() const { return std::atoi(str.c_str()); }
464
466 unsigned int GetUInt() const { return std::atoi(str.c_str()); }
467
469 bool GetBoolean() const { return std::atoi(str.c_str()) > 0; }
470
472 float GetFloat() const { return static_cast<float>(std::atof(str.c_str())); }
473
476 template<typename enumType>
477 enumType GetEnum() const
478 {
479 return static_cast<enumType>(GetInt());
480 }
481
483
484private:
485 const std::string str;
486};
487
488//------------------------------------------------------------------------------
489
490//==============================================================================
497class ATTR_DLL_LOCAL IInstanceInfo
498{
499public:
500 explicit IInstanceInfo(KODI_ADDON_INSTANCE_STRUCT* instance) : m_instance(instance) {}
501
514
517
519 KODI_ADDON_INSTANCE_TYPE GetType() const { return m_instance->info->type; }
520
525 bool IsType(KODI_ADDON_INSTANCE_TYPE type) const { return m_instance->info->type == type; }
526
528 uint32_t GetNumber() const { return m_instance->info->number; }
529
531 std::string GetID() const { return m_instance->info->id; }
532
534 std::string GetAPIVersion() const { return m_instance->info->version; }
535
537 bool FirstInstance() const { return m_instance->info->first_instance; }
538
540
541 operator KODI_ADDON_INSTANCE_STRUCT*() { return m_instance; }
542
543 operator KODI_ADDON_INSTANCE_STRUCT*() const { return m_instance; }
544
545private:
546 IInstanceInfo() = delete;
547 IInstanceInfo(const IInstanceInfo&) = delete;
548
549 KODI_ADDON_INSTANCE_STRUCT* m_instance;
550};
551
552//------------------------------------------------------------------------------
553
554//==============================================================================
555/*
556 * Internal class to control various instance types with general parts defined
557 * here.
558 *
559 * Mainly is this currently used to identify requested instance types.
560 */
561class ATTR_DLL_LOCAL IAddonInstance
562{
563public:
564 explicit IAddonInstance(const kodi::addon::IInstanceInfo& instance) : m_instance(instance)
565 {
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;
572 }
573 virtual ~IAddonInstance() = default;
574
575 virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo& instance,
576 KODI_ADDON_INSTANCE_HDL& hdl)
577 {
578 return ADDON_STATUS_NOT_IMPLEMENTED;
579 }
580
581 std::string GetInstanceAPIVersion() const { return m_instance->info->version; }
582
583 virtual ADDON_STATUS SetInstanceSetting(const std::string& settingName,
584 const kodi::addon::CSettingValue& settingValue)
585 {
587 }
588
589 inline bool IsInstanceSettingUsingDefault(const std::string& settingName)
590 {
591 return m_instance->info->functions->is_instance_setting_using_default(m_instance->info->kodi,
592 settingName.c_str());
593 }
594
595 inline std::string GetInstanceUserPath(const std::string& append = "")
596 {
597 using namespace kodi::addon;
598
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,
603 str);
604 if (!append.empty())
605 {
606 if (append.at(0) != '\\' && append.at(0) != '/')
607#ifdef TARGET_WINDOWS
608 ret.append("\\");
609#else
610 ret.append("/");
611#endif
612 ret.append(append);
613 }
614 return ret;
615 }
616
617 inline bool CheckInstanceSettingString(const std::string& settingName, std::string& settingValue)
618 {
619 char* buffer = nullptr;
620 bool ret = m_instance->info->functions->get_instance_setting_string(
621 m_instance->info->kodi, settingName.c_str(), &buffer);
622 if (buffer)
623 {
624 if (ret)
625 settingValue = buffer;
626 free(buffer);
627 }
628 return ret;
629 }
630
631 inline std::string GetInstanceSettingString(const std::string& settingName,
632 const std::string& defaultValue = "")
633 {
634 std::string settingValue = defaultValue;
635 CheckInstanceSettingString(settingName, settingValue);
636 return settingValue;
637 }
638
639 inline void SetInstanceSettingString(const std::string& settingName,
640 const std::string& settingValue)
641 {
642 m_instance->info->functions->set_instance_setting_string(
643 m_instance->info->kodi, settingName.c_str(), settingValue.c_str());
644 }
645
646 inline bool CheckInstanceSettingInt(const std::string& settingName, int& settingValue)
647 {
648 KODI_ADDON_INSTANCE_FUNC_CB* cb = m_instance->info->functions;
649 return cb->get_instance_setting_int(m_instance->info->kodi, settingName.c_str(), &settingValue);
650 }
651
652 inline int GetInstanceSettingInt(const std::string& settingName, int defaultValue = 0)
653 {
654 int settingValue = defaultValue;
655 CheckInstanceSettingInt(settingName, settingValue);
656 return settingValue;
657 }
658
659 inline void SetInstanceSettingInt(const std::string& settingName, int settingValue)
660 {
661 m_instance->info->functions->set_instance_setting_int(m_instance->info->kodi,
662 settingName.c_str(), settingValue);
663 }
664
665 inline bool CheckInstanceSettingBoolean(const std::string& settingName, bool& settingValue)
666 {
667 return m_instance->info->functions->get_instance_setting_bool(
668 m_instance->info->kodi, settingName.c_str(), &settingValue);
669 }
670
671 inline bool GetInstanceSettingBoolean(const std::string& settingName, bool defaultValue = false)
672 {
673 bool settingValue = defaultValue;
674 CheckInstanceSettingBoolean(settingName, settingValue);
675 return settingValue;
676 }
677
678 inline void SetInstanceSettingBoolean(const std::string& settingName, bool settingValue)
679 {
680 m_instance->info->functions->set_instance_setting_bool(m_instance->info->kodi,
681 settingName.c_str(), settingValue);
682 }
683
684 inline bool CheckInstanceSettingFloat(const std::string& settingName, float& settingValue)
685 {
686 return m_instance->info->functions->get_instance_setting_float(
687 m_instance->info->kodi, settingName.c_str(), &settingValue);
688 }
689
690 inline float GetInstanceSettingFloat(const std::string& settingName, float defaultValue = 0.0f)
691 {
692 float settingValue = defaultValue;
693 CheckInstanceSettingFloat(settingName, settingValue);
694 return settingValue;
695 }
696
697 inline void SetInstanceSettingFloat(const std::string& settingName, float settingValue)
698 {
699 m_instance->info->functions->set_instance_setting_float(m_instance->info->kodi,
700 settingName.c_str(), settingValue);
701 }
702
703 template<typename enumType>
704 inline bool CheckInstanceSettingEnum(const std::string& settingName, enumType& settingValue)
705 {
706 using namespace kodi::addon;
707
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);
711 if (ret)
712 settingValue = static_cast<enumType>(settingValueInt);
713 return ret;
714 }
715
716 template<typename enumType>
717 inline enumType GetInstanceSettingEnum(const std::string& settingName,
718 enumType defaultValue = static_cast<enumType>(0))
719 {
720 enumType settingValue = defaultValue;
721 CheckInstanceSettingEnum(settingName, settingValue);
722 return settingValue;
723 }
724
725 template<typename enumType>
726 inline void SetInstanceSettingEnum(const std::string& settingName, enumType settingValue)
727 {
728 m_instance->info->functions->set_instance_setting_int(
729 m_instance->info->kodi, settingName.c_str(), static_cast<int>(settingValue));
730 }
731
732private:
733 static inline ADDON_STATUS INSTANCE_instance_setting_change_string(
734 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, const char* value)
735 {
736 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name, CSettingValue(value));
737 }
738
739 static inline ADDON_STATUS INSTANCE_instance_setting_change_boolean(
740 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, bool value)
741 {
742 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name,
743 CSettingValue(value ? "1" : "0"));
744 }
745
746 static inline ADDON_STATUS INSTANCE_instance_setting_change_integer(
747 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, int value)
748 {
749 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
750 name, CSettingValue(std::to_string(value)));
751 }
752
753 static inline ADDON_STATUS INSTANCE_instance_setting_change_float(
754 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, float value)
755 {
756 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
757 name, CSettingValue(std::to_string(value)));
758 }
759
760 friend class CAddonBase;
761
762 const KODI_ADDON_INSTANCE_STRUCT* m_instance;
763};
764
765//============================================================================
771class ATTR_DLL_LOCAL CAddonBase
772{
773public:
774 //============================================================================
779 {
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;
788 }
789 //----------------------------------------------------------------------------
790
791 //============================================================================
795 virtual ~CAddonBase() = default;
796 //----------------------------------------------------------------------------
797
798 //============================================================================
814 virtual ADDON_STATUS Create() { return ADDON_STATUS_OK; }
815 //----------------------------------------------------------------------------
816
817 //============================================================================
867 virtual ADDON_STATUS SetSetting(const std::string& settingName,
868 const kodi::addon::CSettingValue& settingValue)
869 {
871 }
872 //----------------------------------------------------------------------------
873
874 //==========================================================================
922 KODI_ADDON_INSTANCE_HDL& hdl)
923 {
924 return ADDON_STATUS_NOT_IMPLEMENTED;
925 }
926 //--------------------------------------------------------------------------
927
928 //==========================================================================
941 virtual void DestroyInstance(const IInstanceInfo& instance, const KODI_ADDON_INSTANCE_HDL hdl) {}
942 //--------------------------------------------------------------------------
943
944 /* Background helper for GUI render systems, e.g. Screensaver or Visualization */
945 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
946
947private:
948 static inline void ADDONBASE_Destroy(const KODI_ADDON_HDL hdl)
949 {
950 delete static_cast<CAddonBase*>(hdl);
951 }
952
953 static inline ADDON_STATUS ADDONBASE_CreateInstance(const KODI_ADDON_HDL hdl,
954 struct KODI_ADDON_INSTANCE_STRUCT* instance)
955 {
956 CAddonBase* base = static_cast<CAddonBase*>(hdl);
957
958 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED;
959
960 /* Check about single instance usage:
961 * 1. The kodi side instance pointer must be equal to first one
962 * 2. The addon side instance pointer must be set
963 * 3. And the requested type must be equal with used add-on class
964 */
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)
969 {
970 /* The handling here is intended for the case of the add-on only one
971 * instance and this is integrated in the add-on base class.
972 */
973 instance->hdl = CPrivateBase::m_interface->globalSingleInstance;
974 status = ADDON_STATUS_OK;
975 }
976 else
977 {
978 /* Here it should use the CreateInstance instance function to allow
979 * creation of several on one addon.
980 */
981
982 IInstanceInfo instanceInfo(instance);
983
984 /* Check first a parent is defined about (e.g. Codec within inputstream) */
985 if (instance->info->parent != nullptr)
986 status = static_cast<IAddonInstance*>(instance->info->parent)
987 ->CreateInstance(instanceInfo, instance->hdl);
988
989 /* if no parent call the main instance creation function to get it */
990 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
991 {
992 status = base->CreateInstance(instanceInfo, instance->hdl);
993 }
994 }
995
996 if (instance->hdl == nullptr)
997 {
998 if (status == ADDON_STATUS_OK)
999 {
1000 CPrivateBase::m_interface->toKodi->addon_log_msg(
1001 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1002 "kodi::addon::CAddonBase CreateInstance returned an "
1003 "empty instance pointer, but reported OK!");
1005 }
1006 else
1007 {
1008 return status;
1009 }
1010 }
1011
1012 if (static_cast<IAddonInstance*>(instance->hdl)->m_instance->info->type != instance->info->type)
1013 {
1014 CPrivateBase::m_interface->toKodi->addon_log_msg(
1015 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1016 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
1017 delete static_cast<IAddonInstance*>(instance->hdl);
1018 instance->hdl = nullptr;
1020 }
1021
1022 return status;
1023 }
1024
1025 static inline void ADDONBASE_DestroyInstance(const KODI_ADDON_HDL hdl,
1026 struct KODI_ADDON_INSTANCE_STRUCT* instance)
1027 {
1028 CAddonBase* base = static_cast<CAddonBase*>(hdl);
1029
1030 if (CPrivateBase::m_interface->globalSingleInstance == nullptr && instance->hdl != base)
1031 {
1032 IInstanceInfo instanceInfo(instance);
1033 base->DestroyInstance(instanceInfo, instance->hdl);
1034 delete static_cast<IAddonInstance*>(instance->hdl);
1035 }
1036 }
1037
1038 static inline ADDON_STATUS ADDONBASE_setting_change_string(const KODI_ADDON_HDL hdl,
1039 const char* name,
1040 const char* value)
1041 {
1042 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value));
1043 }
1044
1045 static inline ADDON_STATUS ADDONBASE_setting_change_boolean(const KODI_ADDON_HDL hdl,
1046 const char* name,
1047 bool value)
1048 {
1049 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value ? "1" : "0"));
1050 }
1051
1052 static inline ADDON_STATUS ADDONBASE_setting_change_integer(const KODI_ADDON_HDL hdl,
1053 const char* name,
1054 int value)
1055 {
1056 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1057 }
1058
1059 static inline ADDON_STATUS ADDONBASE_setting_change_float(const KODI_ADDON_HDL hdl,
1060 const char* name,
1061 float value)
1062 {
1063 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1064 }
1065};
1066
1067//==============================================================================
1074inline std::string ATTR_DLL_LOCAL GetAddonPath(const std::string& append = "")
1075{
1076 using namespace kodi::addon;
1077
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())
1083 {
1084 if (append.at(0) != '\\' && append.at(0) != '/')
1085#ifdef TARGET_WINDOWS
1086 ret.append("\\");
1087#else
1088 ret.append("/");
1089#endif
1090 ret.append(append);
1091 }
1092 return ret;
1093}
1094//------------------------------------------------------------------------------
1095
1096//==============================================================================
1111inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "")
1112{
1113 using namespace kodi::addon;
1114
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())
1120 {
1121 if (append.at(0) != '\\' && append.at(0) != '/')
1122#ifdef TARGET_WINDOWS
1123 ret.append("\\");
1124#else
1125 ret.append("/");
1126#endif
1127 ret.append(append);
1128 }
1129 return ret;
1130}
1131//------------------------------------------------------------------------------
1132
1133//==============================================================================
1143inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "")
1144{
1145 using namespace kodi::addon;
1146
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())
1152 {
1153 if (append.at(0) != '\\' && append.at(0) != '/')
1154#ifdef TARGET_WINDOWS
1155 ret.append("\\");
1156#else
1157 ret.append("/");
1158#endif
1159 ret.append(append);
1160 }
1161 return ret;
1162}
1163//------------------------------------------------------------------------------
1164
1165//==============================================================================
1176inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "")
1177{
1178 using namespace kodi::addon;
1179
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())
1185 {
1186 if (append.at(0) != '\\' && append.at(0) != '/')
1187#ifdef TARGET_WINDOWS
1188 ret.append("\\");
1189#else
1190 ret.append("/");
1191#endif
1192 ret.append(append);
1193 }
1194 return ret;
1195}
1196//------------------------------------------------------------------------------
1197
1198//==============================================================================
1225inline std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId,
1226 const std::string& defaultStr = "")
1227{
1228 using namespace kodi::addon;
1229
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)
1234 {
1235 if (std::strlen(strMsg))
1236 retString = strMsg;
1237 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1238 strMsg);
1239 }
1240 return retString;
1241}
1242//------------------------------------------------------------------------------
1243
1244//##############################################################################
1256
1257
1258//==============================================================================
1274inline bool ATTR_DLL_LOCAL OpenSettings()
1275{
1276 using namespace kodi::addon;
1277 return CPrivateBase::m_interface->toKodi->kodi_addon->open_settings_dialog(
1278 CPrivateBase::m_interface->toKodi->kodiBase);
1279}
1280//------------------------------------------------------------------------------
1281
1282//==============================================================================
1290inline bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string& settingName)
1291{
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());
1295}
1296//------------------------------------------------------------------------------
1297
1298//==============================================================================
1321inline bool ATTR_DLL_LOCAL CheckSettingString(const std::string& settingName,
1322 std::string& settingValue)
1323{
1324 using namespace kodi::addon;
1325
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);
1329 if (buffer)
1330 {
1331 if (ret)
1332 settingValue = buffer;
1333 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1334 buffer);
1335 }
1336 return ret;
1337}
1338//------------------------------------------------------------------------------
1339
1340//==============================================================================
1359inline std::string ATTR_DLL_LOCAL GetSettingString(const std::string& settingName,
1360 const std::string& defaultValue = "")
1361{
1362 std::string settingValue = defaultValue;
1363 CheckSettingString(settingName, settingValue);
1364 return settingValue;
1365}
1366//------------------------------------------------------------------------------
1367
1368//==============================================================================
1387inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName,
1388 const std::string& settingValue)
1389{
1390 using namespace kodi::addon;
1391
1392 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_string(
1393 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue.c_str());
1394}
1395//------------------------------------------------------------------------------
1396
1397//==============================================================================
1420inline bool ATTR_DLL_LOCAL CheckSettingInt(const std::string& settingName, int& settingValue)
1421{
1422 using namespace kodi::addon;
1423
1424 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1425 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1426}
1427//------------------------------------------------------------------------------
1428
1429//==============================================================================
1448inline int ATTR_DLL_LOCAL GetSettingInt(const std::string& settingName, int defaultValue = 0)
1449{
1450 int settingValue = defaultValue;
1451 CheckSettingInt(settingName, settingValue);
1452 return settingValue;
1453}
1454//------------------------------------------------------------------------------
1455
1456//==============================================================================
1475inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int settingValue)
1476{
1477 using namespace kodi::addon;
1478
1479 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1480 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1481}
1482//------------------------------------------------------------------------------
1483
1484//==============================================================================
1507inline bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string& settingName, bool& settingValue)
1508{
1509 using namespace kodi::addon;
1510
1511 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_bool(
1512 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1513}
1514//------------------------------------------------------------------------------
1515
1516//==============================================================================
1535inline bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string& settingName,
1536 bool defaultValue = false)
1537{
1538 bool settingValue = defaultValue;
1539 CheckSettingBoolean(settingName, settingValue);
1540 return settingValue;
1541}
1542//------------------------------------------------------------------------------
1543
1544//==============================================================================
1563inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, bool settingValue)
1564{
1565 using namespace kodi::addon;
1566
1567 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_bool(
1568 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1569}
1570//------------------------------------------------------------------------------
1571
1572//==============================================================================
1595inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, float& settingValue)
1596{
1597 using namespace kodi::addon;
1598
1599 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_float(
1600 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1601}
1602//------------------------------------------------------------------------------
1603
1604//==============================================================================
1623inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName,
1624 float defaultValue = 0.0f)
1625{
1626 float settingValue = defaultValue;
1627 CheckSettingFloat(settingName, settingValue);
1628 return settingValue;
1629}
1630//------------------------------------------------------------------------------
1631
1632//==============================================================================
1651inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float settingValue)
1652{
1653 using namespace kodi::addon;
1654
1655 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_float(
1656 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1657}
1658//------------------------------------------------------------------------------
1659
1660//==============================================================================
1691template<typename enumType>
1692inline bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string& settingName, enumType& settingValue)
1693{
1694 using namespace kodi::addon;
1695
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);
1699 if (ret)
1700 settingValue = static_cast<enumType>(settingValueInt);
1701 return ret;
1702}
1703//------------------------------------------------------------------------------
1704
1705//==============================================================================
1733template<typename enumType>
1734inline enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string& settingName,
1735 enumType defaultValue = static_cast<enumType>(0))
1736{
1737 enumType settingValue = defaultValue;
1738 CheckSettingEnum(settingName, settingValue);
1739 return settingValue;
1740}
1741//------------------------------------------------------------------------------
1742
1743//==============================================================================
1771template<typename enumType>
1772inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumType settingValue)
1773{
1774 using namespace kodi::addon;
1775
1776 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1777 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(),
1778 static_cast<int>(settingValue));
1779}
1780//------------------------------------------------------------------------------
1781
1783
1784//==============================================================================
1810inline std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string& id)
1811{
1812 using namespace kodi::addon;
1813
1814 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1815
1816 std::string strReturn;
1817 char* strMsg = toKodi->kodi_addon->get_addon_info(toKodi->kodiBase, id.c_str());
1818 if (strMsg != nullptr)
1819 {
1820 if (std::strlen(strMsg))
1821 strReturn = strMsg;
1822 toKodi->free_string(toKodi->kodiBase, strMsg);
1823 }
1824 return strReturn;
1825}
1826//------------------------------------------------------------------------------
1827
1828//==============================================================================
1846inline void* GetInterface(const std::string& name, const std::string& version)
1847{
1848 using namespace kodi::addon;
1849
1850 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1851
1852 return toKodi->kodi_addon->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1853}
1854//----------------------------------------------------------------------------
1855
1856//==============================================================================
1866inline std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
1867{
1868 using namespace kodi::addon;
1869
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);
1874 return ret;
1875}
1876//------------------------------------------------------------------------------
1877
1878//============================================================================
1885inline std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
1886{
1887 switch (status)
1888 {
1889 case ADDON_STATUS_OK:
1890 return "OK";
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";
1903 default:
1904 break;
1905 }
1906 return "Unknown";
1907}
1908//----------------------------------------------------------------------------
1909
1910} /* namespace addon */
1911
1912//==============================================================================
1935inline void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char* format, ...)
1936{
1937 using namespace kodi::addon;
1938
1939 va_list args;
1940 va_start(args, format);
1941 const std::string str = kodi::tools::StringUtils::FormatV(format, args);
1942 va_end(args);
1943 CPrivateBase::m_interface->toKodi->addon_log_msg(CPrivateBase::m_interface->toKodi->kodiBase,
1944 loglevel, str.c_str());
1945}
1946//------------------------------------------------------------------------------
1947
1948} /* namespace kodi */
1949
1950//==============================================================================
2044#define ADDONCREATOR(AddonClass) \
2045 extern "C" ATTR_DLL_EXPORT ADDON_STATUS ADDON_Create(KODI_HANDLE addonInterface) \
2046 { \
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(); \
2051 } \
2052 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \
2053 { \
2054 return kodi::addon::GetTypeVersion(type); \
2055 } \
2056 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \
2057 { \
2058 return kodi::addon::GetTypeMinVersion(type); \
2059 } \
2060 AddonGlobalInterface* kodi::addon::CPrivateBase::m_interface = nullptr;
2061//------------------------------------------------------------------------------
2062
2063#endif /* __cplusplus */
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
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: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