Kodi Development 23.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 <cstdio>
22#include <cstdlib>
23#include <cstring>
24#include <ctime>
25#include <memory>
26#include <stdexcept>
27#include <string>
28#include <vector>
29
30namespace kodi
31{
32
33namespace gui
34{
35struct IRenderHelper;
36} /* namespace gui */
37
38//==============================================================================
62using HardwareContext = ADDON_HARDWARE_CONTEXT;
64//------------------------------------------------------------------------------
65
66namespace addon
67{
68
73struct ATTR_DLL_LOCAL CPrivateBase
74{
75 // Interface function table to hold addresses on add-on and from kodi
76 static AddonGlobalInterface* m_interface;
77};
78
82inline char* AllocAndCopyString(const char* source)
83{
84 if (source)
85 {
86 const size_t len{strlen(source) + 1};
87 char* target = new char[len];
88 memcpy(target, source, len);
89 return target;
90 }
91 return nullptr;
92}
93
97inline void FreeString(const char* str)
98{
99 delete[] str;
100}
101
105inline void ReallocAndCopyString(const char** stringToRealloc, const char* stringToCopy)
106{
107 FreeString(*stringToRealloc);
108 *stringToRealloc = AllocAndCopyString(stringToCopy);
109}
110
114template<typename CPP_CLASS, typename C_STRUCT>
115inline static C_STRUCT** AllocAndCopyPointerArray(std::vector<CPP_CLASS>& sourceVector,
116 unsigned int& targetArraySize)
117{
118 targetArraySize = static_cast<unsigned int>(sourceVector.size());
119 if (targetArraySize > 0)
120 {
121 C_STRUCT** targetArray = new C_STRUCT* [targetArraySize] {};
122
123 unsigned int i{0};
124 for (auto& entry : sourceVector)
125 {
126 // Assign data to target array. Take pointer ownership.
127 C_STRUCT** arrayElem{&targetArray[i]};
128 *arrayElem = entry.release();
129 ++i;
130 }
131 return targetArray;
132 }
133 return nullptr;
134}
135
139template<typename CPP_CLASS, typename C_STRUCT>
140inline static void FreeDynamicPointerArray(C_STRUCT** targetArray, unsigned int targetArraySize)
141{
142 for (unsigned int i = 0; i < targetArraySize; ++i)
143 {
144 C_STRUCT** arrayElem{&targetArray[i]};
145 CPP_CLASS::FreeResources(*arrayElem);
146 delete *arrayElem;
147 }
148 delete[] targetArray;
149}
150
154template<typename CPP_CLASS, typename C_STRUCT>
155inline static void FreeStaticPointerArray(C_STRUCT** targetArray, unsigned int targetArraySize)
156{
157 for (unsigned int i = 0; i < targetArraySize; ++i)
158 {
159 C_STRUCT** arrayElem{&targetArray[i]};
160 delete *arrayElem;
161 }
162 delete[] targetArray;
163}
164
165/*
166 * Internally used helper class to manage processing of a "C" structure in "CPP"
167 * class.
168 *
169 * At constant, the "C" structure is copied, otherwise the given pointer is
170 * superseded and is changeable.
171 *
172 * -----------------------------------------------------------------------------
173 *
174 * Example:
175 *
176 * ~~~~~~~~~~~~~{.cpp}
177 * extern "C" typedef struct C_SAMPLE_DATA
178 * {
179 * unsigned int iUniqueId;
180 * } C_SAMPLE_DATA;
181 *
182 * class CPPSampleData : public CStructHdl<CPPSampleData, C_SAMPLE_DATA>
183 * {
184 * public:
185 * CPPSampleData() = default;
186 * CPPSampleData(const CPPSampleData& sample) : CStructHdl(sample) { }
187 * CPPSampleData(const C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
188 * CPPSampleData(C_SAMPLE_DATA* sample) : CStructHdl(sample) { }
189 *
190 * void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; }
191 * unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; }
192 * };
193 *
194 * ~~~~~~~~~~~~~
195 *
196 * It also works with the following example:
197 *
198 * ~~~~~~~~~~~~~{.cpp}
199 * CPPSampleData test;
200 * // Some work
201 * C_SAMPLE_DATA* data = test;
202 * // Give "data" to Kodi
203 * ~~~~~~~~~~~~~
204 */
205template<class CPP_CLASS, typename C_STRUCT>
207{
208public:
209 CStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true) {}
210
211 CStructHdl(const CStructHdl& cppClass)
212 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)),
213 m_owner(true)
214 {
215 }
216
217 explicit CStructHdl(const C_STRUCT* cStructure)
218 : m_cStructure(new C_STRUCT(*cStructure)),
219 m_owner(true)
220 {
221 }
222
223 explicit CStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure) { assert(cStructure); }
224
225 const CStructHdl& operator=(const CStructHdl& right)
226 {
227 if (this == &right)
228 return *this;
229
230 if (m_cStructure && !m_owner)
231 {
232 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
233 }
234 else
235 {
236 if (m_owner)
237 delete m_cStructure;
238 m_owner = true;
239 m_cStructure = new C_STRUCT(*right.m_cStructure);
240 }
241 return *this;
242 }
243
244 const CStructHdl& operator=(const C_STRUCT& right)
245 {
246 assert(&right);
247
248 if (m_cStructure == &right)
249 return *this;
250
251 if (m_cStructure && !m_owner)
252 {
253 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
254 }
255 else
256 {
257 if (m_owner)
258 delete m_cStructure;
259 m_owner = true;
260 m_cStructure = new C_STRUCT(*right);
261 }
262 return *this;
263 }
264
265 virtual ~CStructHdl()
266 {
267 if (m_owner)
268 delete m_cStructure;
269 }
270
271 operator C_STRUCT*() { return m_cStructure; }
272 operator const C_STRUCT*() const { return m_cStructure; }
273
274 const C_STRUCT* GetCStructure() const { return m_cStructure; }
275
276 C_STRUCT* release()
277 {
278 m_owner = false;
279 return m_cStructure;
280 }
281
282protected:
283 C_STRUCT* m_cStructure = nullptr;
284
285private:
286 bool m_owner = false;
287};
288
289template<class CPP_CLASS, typename C_STRUCT>
291{
292public:
293 DynamicCStructHdl() : m_cStructure(new C_STRUCT()), m_owner(true)
294 {
295 memset(m_cStructure, 0, sizeof(C_STRUCT));
296 }
297
298 DynamicCStructHdl(const DynamicCStructHdl& cppClass)
299 : m_cStructure(new C_STRUCT(*cppClass.m_cStructure)),
300 m_owner(true)
301 {
302 CPP_CLASS::AllocResources(cppClass.m_cStructure, m_cStructure);
303 }
304
305 explicit DynamicCStructHdl(const C_STRUCT* cStructure)
306 : m_cStructure(new C_STRUCT(*cStructure)),
307 m_owner(true)
308 {
309 CPP_CLASS::AllocResources(cStructure, m_cStructure);
310 }
311
312 explicit DynamicCStructHdl(C_STRUCT* cStructure) : m_cStructure(cStructure)
313 {
314 assert(cStructure);
315 }
316
317 const DynamicCStructHdl& operator=(const DynamicCStructHdl& right)
318 {
319 if (this == &right)
320 return *this;
321
322 CPP_CLASS::FreeResources(m_cStructure);
323 if (m_cStructure && !m_owner)
324 {
325 memcpy(m_cStructure, right.m_cStructure, sizeof(C_STRUCT));
326 }
327 else
328 {
329 if (m_owner)
330 delete m_cStructure;
331 m_owner = true;
332 m_cStructure = new C_STRUCT(*right.m_cStructure);
333 }
334 CPP_CLASS::AllocResources(right.m_cStructure, m_cStructure);
335 return *this;
336 }
337
338 const DynamicCStructHdl& operator=(const C_STRUCT& right)
339 {
340 assert(&right);
341
342 if (m_cStructure == &right)
343 return *this;
344
345 CPP_CLASS::FreeResources(m_cStructure);
346 if (m_cStructure && !m_owner)
347 {
348 memcpy(m_cStructure, &right, sizeof(C_STRUCT));
349 }
350 else
351 {
352 if (m_owner)
353 delete m_cStructure;
354 m_owner = true;
355 m_cStructure = new C_STRUCT(*right);
356 }
357 CPP_CLASS::AllocResources(&right, m_cStructure);
358 return *this;
359 }
360
361 virtual ~DynamicCStructHdl()
362 {
363 if (m_owner)
364 {
365 CPP_CLASS::FreeResources(m_cStructure);
366 delete m_cStructure;
367 }
368 }
369
370 operator C_STRUCT*() { return m_cStructure; }
371 operator const C_STRUCT*() const { return m_cStructure; }
372
373 const C_STRUCT* GetCStructure() const { return m_cStructure; }
374
375 C_STRUCT* release()
376 {
377 m_owner = false;
378 return m_cStructure;
379 }
380
381protected:
382 C_STRUCT* m_cStructure = nullptr;
383
384private:
385 bool m_owner = false;
386};
387
388//==============================================================================
441class ATTR_DLL_LOCAL CSettingValue
442{
443public:
444 explicit CSettingValue(const std::string& settingValue) : str(settingValue) {}
445
446 bool empty() const { return str.empty(); }
447
460
463
465 const std::string& GetString() const { return str; }
466
468 int GetInt() const { return std::atoi(str.c_str()); }
469
471 unsigned int GetUInt() const { return std::atoi(str.c_str()); }
472
474 bool GetBoolean() const { return std::atoi(str.c_str()) > 0; }
475
477 float GetFloat() const { return static_cast<float>(std::atof(str.c_str())); }
478
481 template<typename enumType>
482 enumType GetEnum() const
483 {
484 return static_cast<enumType>(GetInt());
485 }
486
488
489private:
490 const std::string str;
491};
493//------------------------------------------------------------------------------
494
495//==============================================================================
502class ATTR_DLL_LOCAL IInstanceInfo
503{
504public:
505 explicit IInstanceInfo(KODI_ADDON_INSTANCE_STRUCT* instance) : m_instance(instance) {}
506
519
522
524 KODI_ADDON_INSTANCE_TYPE GetType() const { return m_instance->info->type; }
525
530 bool IsType(KODI_ADDON_INSTANCE_TYPE type) const { return m_instance->info->type == type; }
531
533 uint32_t GetNumber() const { return m_instance->info->number; }
534
536 std::string GetID() const { return m_instance->info->id; }
537
539 std::string GetAPIVersion() const { return m_instance->info->version; }
540
542 bool FirstInstance() const { return m_instance->info->first_instance; }
543
545
546 operator KODI_ADDON_INSTANCE_STRUCT*() { return m_instance; }
547
548 operator KODI_ADDON_INSTANCE_STRUCT*() const { return m_instance; }
549
550private:
551 IInstanceInfo() = delete;
552 IInstanceInfo(const IInstanceInfo&) = delete;
553
554 KODI_ADDON_INSTANCE_STRUCT* m_instance;
555};
557//------------------------------------------------------------------------------
558
559//==============================================================================
560/*
561 * Internal class to control various instance types with general parts defined
562 * here.
563 *
564 * Mainly is this currently used to identify requested instance types.
565 */
566class ATTR_DLL_LOCAL IAddonInstance
567{
568public:
569 explicit IAddonInstance(const kodi::addon::IInstanceInfo& instance) : m_instance(instance)
570 {
571 m_instance->functions->instance_setting_change_string = INSTANCE_instance_setting_change_string;
572 m_instance->functions->instance_setting_change_integer =
573 INSTANCE_instance_setting_change_integer;
574 m_instance->functions->instance_setting_change_boolean =
575 INSTANCE_instance_setting_change_boolean;
576 m_instance->functions->instance_setting_change_float = INSTANCE_instance_setting_change_float;
577 }
578 virtual ~IAddonInstance() = default;
579
580 virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo& instance,
581 KODI_ADDON_INSTANCE_HDL& hdl)
582 {
583 return ADDON_STATUS_NOT_IMPLEMENTED;
584 }
585
586 std::string GetInstanceAPIVersion() const { return m_instance->info->version; }
587
592 bool IsInstanceAPIVersionAtLeast(int major, int minor, int patch) const
593 {
594 int version[3] = {0, 0, 0};
595 std::sscanf(GetInstanceAPIVersion().c_str(), "%d.%d.%d", &version[0], &version[1], &version[2]);
596 const int wanted[3] = {major, minor, patch};
597 for (unsigned int i = 0; i < 3; ++i)
598 {
599 if (version[i] != wanted[i])
600 return version[i] > wanted[i];
601 }
602 return true;
603 }
604
605 virtual ADDON_STATUS SetInstanceSetting(const std::string& settingName,
606 const kodi::addon::CSettingValue& settingValue)
607 {
609 }
610
611 inline bool IsInstanceSettingUsingDefault(const std::string& settingName)
612 {
613 return m_instance->info->functions->is_instance_setting_using_default(m_instance->info->kodi,
614 settingName.c_str());
615 }
616
617 inline std::string GetInstanceUserPath(const std::string& append = "")
618 {
619 using namespace kodi::addon;
620
621 char* str = m_instance->info->functions->get_instance_user_path(
622 CPrivateBase::m_interface->toKodi->kodiBase);
623 std::string ret = str;
624 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
625 str);
626 if (!append.empty())
627 {
628 if (append.at(0) != '\\' && append.at(0) != '/')
629#ifdef TARGET_WINDOWS
630 ret.append("\\");
631#else
632 ret.append("/");
633#endif
634 ret.append(append);
635 }
636 return ret;
637 }
638
639 inline bool CheckInstanceSettingString(const std::string& settingName, std::string& settingValue)
640 {
641 char* buffer = nullptr;
642 bool ret = m_instance->info->functions->get_instance_setting_string(
643 m_instance->info->kodi, settingName.c_str(), &buffer);
644 if (buffer)
645 {
646 if (ret)
647 settingValue = buffer;
648 free(buffer);
649 }
650 return ret;
651 }
652
653 inline std::string GetInstanceSettingString(const std::string& settingName,
654 const std::string& defaultValue = "")
655 {
656 std::string settingValue = defaultValue;
657 CheckInstanceSettingString(settingName, settingValue);
658 return settingValue;
659 }
660
661 inline void SetInstanceSettingString(const std::string& settingName,
662 const std::string& settingValue)
663 {
664 m_instance->info->functions->set_instance_setting_string(
665 m_instance->info->kodi, settingName.c_str(), settingValue.c_str());
666 }
667
668 inline bool CheckInstanceSettingInt(const std::string& settingName, int& settingValue)
669 {
670 KODI_ADDON_INSTANCE_FUNC_CB* cb = m_instance->info->functions;
671 return cb->get_instance_setting_int(m_instance->info->kodi, settingName.c_str(), &settingValue);
672 }
673
674 inline int GetInstanceSettingInt(const std::string& settingName, int defaultValue = 0)
675 {
676 int settingValue = defaultValue;
677 CheckInstanceSettingInt(settingName, settingValue);
678 return settingValue;
679 }
680
681 inline void SetInstanceSettingInt(const std::string& settingName, int settingValue)
682 {
683 m_instance->info->functions->set_instance_setting_int(m_instance->info->kodi,
684 settingName.c_str(), settingValue);
685 }
686
687 inline bool CheckInstanceSettingBoolean(const std::string& settingName, bool& settingValue)
688 {
689 return m_instance->info->functions->get_instance_setting_bool(
690 m_instance->info->kodi, settingName.c_str(), &settingValue);
691 }
692
693 inline bool GetInstanceSettingBoolean(const std::string& settingName, bool defaultValue = false)
694 {
695 bool settingValue = defaultValue;
696 CheckInstanceSettingBoolean(settingName, settingValue);
697 return settingValue;
698 }
699
700 inline void SetInstanceSettingBoolean(const std::string& settingName, bool settingValue)
701 {
702 m_instance->info->functions->set_instance_setting_bool(m_instance->info->kodi,
703 settingName.c_str(), settingValue);
704 }
705
706 inline bool CheckInstanceSettingFloat(const std::string& settingName, float& settingValue)
707 {
708 return m_instance->info->functions->get_instance_setting_float(
709 m_instance->info->kodi, settingName.c_str(), &settingValue);
710 }
711
712 inline float GetInstanceSettingFloat(const std::string& settingName, float defaultValue = 0.0f)
713 {
714 float settingValue = defaultValue;
715 CheckInstanceSettingFloat(settingName, settingValue);
716 return settingValue;
717 }
718
719 inline void SetInstanceSettingFloat(const std::string& settingName, float settingValue)
720 {
721 m_instance->info->functions->set_instance_setting_float(m_instance->info->kodi,
722 settingName.c_str(), settingValue);
723 }
724
725 template<typename enumType>
726 inline bool CheckInstanceSettingEnum(const std::string& settingName, enumType& settingValue)
727 {
728 using namespace kodi::addon;
729
730 int settingValueInt = static_cast<int>(settingValue);
731 bool ret = m_instance->info->functions->get_instance_setting_int(
732 m_instance->info->kodi, settingName.c_str(), &settingValueInt);
733 if (ret)
734 settingValue = static_cast<enumType>(settingValueInt);
735 return ret;
736 }
737
738 template<typename enumType>
739 inline enumType GetInstanceSettingEnum(const std::string& settingName,
740 enumType defaultValue = static_cast<enumType>(0))
741 {
742 enumType settingValue = defaultValue;
743 CheckInstanceSettingEnum(settingName, settingValue);
744 return settingValue;
745 }
746
747 template<typename enumType>
748 inline void SetInstanceSettingEnum(const std::string& settingName, enumType settingValue)
749 {
750 m_instance->info->functions->set_instance_setting_int(
751 m_instance->info->kodi, settingName.c_str(), static_cast<int>(settingValue));
752 }
753
754private:
755 static inline ADDON_STATUS INSTANCE_instance_setting_change_string(
756 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, const char* value)
757 {
758 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name, CSettingValue(value));
759 }
760
761 static inline ADDON_STATUS INSTANCE_instance_setting_change_boolean(
762 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, bool value)
763 {
764 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(name,
765 CSettingValue(value ? "1" : "0"));
766 }
767
768 static inline ADDON_STATUS INSTANCE_instance_setting_change_integer(
769 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, int value)
770 {
771 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
772 name, CSettingValue(std::to_string(value)));
773 }
774
775 static inline ADDON_STATUS INSTANCE_instance_setting_change_float(
776 const KODI_ADDON_INSTANCE_HDL hdl, const char* name, float value)
777 {
778 return static_cast<IAddonInstance*>(hdl)->SetInstanceSetting(
779 name, CSettingValue(std::to_string(value)));
780 }
781
782 friend class CAddonBase;
783
784 const KODI_ADDON_INSTANCE_STRUCT* m_instance;
785};
786
787//============================================================================
793class ATTR_DLL_LOCAL CAddonBase
794{
795public:
796 //============================================================================
801 {
802 CPrivateBase::m_interface->toAddon->create = nullptr;
803 CPrivateBase::m_interface->toAddon->destroy = ADDONBASE_Destroy;
804 CPrivateBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
805 CPrivateBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
806 CPrivateBase::m_interface->toAddon->setting_change_string = ADDONBASE_setting_change_string;
807 CPrivateBase::m_interface->toAddon->setting_change_boolean = ADDONBASE_setting_change_boolean;
808 CPrivateBase::m_interface->toAddon->setting_change_integer = ADDONBASE_setting_change_integer;
809 CPrivateBase::m_interface->toAddon->setting_change_float = ADDONBASE_setting_change_float;
810 }
811 //----------------------------------------------------------------------------
812
813 //============================================================================
817 virtual ~CAddonBase() = default;
818 //----------------------------------------------------------------------------
819
820 //============================================================================
836 virtual ADDON_STATUS Create() { return ADDON_STATUS_OK; }
837 //----------------------------------------------------------------------------
838
839 //============================================================================
889 virtual ADDON_STATUS SetSetting(const std::string& settingName,
890 const kodi::addon::CSettingValue& settingValue)
891 {
893 }
894 //----------------------------------------------------------------------------
895
896 //==========================================================================
944 KODI_ADDON_INSTANCE_HDL& hdl)
945 {
946 return ADDON_STATUS_NOT_IMPLEMENTED;
947 }
948 //--------------------------------------------------------------------------
949
950 //==========================================================================
963 virtual void DestroyInstance(const IInstanceInfo& instance, const KODI_ADDON_INSTANCE_HDL hdl) {}
964 //--------------------------------------------------------------------------
965
966 /* Background helper for GUI render systems, e.g. Screensaver or Visualization */
967 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
968
969private:
970 static inline void ADDONBASE_Destroy(const KODI_ADDON_HDL hdl)
971 {
972 delete static_cast<CAddonBase*>(hdl);
973 }
974
975 static inline ADDON_STATUS ADDONBASE_CreateInstance(const KODI_ADDON_HDL hdl,
976 struct KODI_ADDON_INSTANCE_STRUCT* instance)
977 {
978 CAddonBase* base = static_cast<CAddonBase*>(hdl);
979
980 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED;
981
982 /* Check about single instance usage:
983 * 1. The kodi side instance pointer must be equal to first one
984 * 2. The addon side instance pointer must be set
985 * 3. And the requested type must be equal with used add-on class
986 */
987 if (CPrivateBase::m_interface->firstKodiInstance == instance &&
988 CPrivateBase::m_interface->globalSingleInstance &&
989 static_cast<IAddonInstance*>(CPrivateBase::m_interface->globalSingleInstance)
990 ->m_instance->info->type == instance->info->type)
991 {
992 /* The handling here is intended for the case of the add-on only one
993 * instance and this is integrated in the add-on base class.
994 */
995 instance->hdl = CPrivateBase::m_interface->globalSingleInstance;
996 status = ADDON_STATUS_OK;
997 }
998 else
999 {
1000 /* Here it should use the CreateInstance instance function to allow
1001 * creation of several on one addon.
1002 */
1003
1004 IInstanceInfo instanceInfo(instance);
1005
1006 /* Check first a parent is defined about (e.g. Codec within inputstream) */
1007 if (instance->info->parent != nullptr)
1008 status = static_cast<IAddonInstance*>(instance->info->parent)
1009 ->CreateInstance(instanceInfo, instance->hdl);
1010
1011 /* if no parent call the main instance creation function to get it */
1012 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
1013 {
1014 status = base->CreateInstance(instanceInfo, instance->hdl);
1015 }
1016 }
1017
1018 if (instance->hdl == nullptr)
1019 {
1020 if (status == ADDON_STATUS_OK)
1021 {
1022 CPrivateBase::m_interface->toKodi->addon_log_msg(
1023 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1024 "kodi::addon::CAddonBase CreateInstance returned an "
1025 "empty instance pointer, but reported OK!");
1027 }
1028 else
1029 {
1030 return status;
1031 }
1032 }
1033
1034 if (static_cast<IAddonInstance*>(instance->hdl)->m_instance->info->type != instance->info->type)
1035 {
1036 CPrivateBase::m_interface->toKodi->addon_log_msg(
1037 CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL,
1038 "kodi::addon::CAddonBase CreateInstance difference between given and returned");
1039 delete static_cast<IAddonInstance*>(instance->hdl);
1040 instance->hdl = nullptr;
1042 }
1043
1044 return status;
1045 }
1046
1047 static inline void ADDONBASE_DestroyInstance(const KODI_ADDON_HDL hdl,
1048 struct KODI_ADDON_INSTANCE_STRUCT* instance)
1049 {
1050 CAddonBase* base = static_cast<CAddonBase*>(hdl);
1051
1052 if (CPrivateBase::m_interface->globalSingleInstance == nullptr && instance->hdl != base)
1053 {
1054 IInstanceInfo instanceInfo(instance);
1055 base->DestroyInstance(instanceInfo, instance->hdl);
1056 delete static_cast<IAddonInstance*>(instance->hdl);
1057 }
1058 }
1059
1060 static inline ADDON_STATUS ADDONBASE_setting_change_string(const KODI_ADDON_HDL hdl,
1061 const char* name,
1062 const char* value)
1063 {
1064 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value));
1065 }
1066
1067 static inline ADDON_STATUS ADDONBASE_setting_change_boolean(const KODI_ADDON_HDL hdl,
1068 const char* name,
1069 bool value)
1070 {
1071 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(value ? "1" : "0"));
1072 }
1073
1074 static inline ADDON_STATUS ADDONBASE_setting_change_integer(const KODI_ADDON_HDL hdl,
1075 const char* name,
1076 int value)
1077 {
1078 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1079 }
1080
1081 static inline ADDON_STATUS ADDONBASE_setting_change_float(const KODI_ADDON_HDL hdl,
1082 const char* name,
1083 float value)
1084 {
1085 return static_cast<CAddonBase*>(hdl)->SetSetting(name, CSettingValue(std::to_string(value)));
1086 }
1087};
1088
1089//==============================================================================
1096inline std::string ATTR_DLL_LOCAL GetAddonPath(const std::string& append = "")
1097{
1098 using namespace kodi::addon;
1099
1100 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_addon_path(
1101 CPrivateBase::m_interface->toKodi->kodiBase);
1102 std::string ret = str;
1103 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1104 if (!append.empty())
1105 {
1106 if (append.at(0) != '\\' && append.at(0) != '/')
1107#ifdef TARGET_WINDOWS
1108 ret.append("\\");
1109#else
1110 ret.append("/");
1111#endif
1112 ret.append(append);
1113 }
1114 return ret;
1115}
1116//------------------------------------------------------------------------------
1117
1118//==============================================================================
1133inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "")
1134{
1135 using namespace kodi::addon;
1136
1137 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_lib_path(
1138 CPrivateBase::m_interface->toKodi->kodiBase);
1139 std::string ret = str;
1140 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1141 if (!append.empty())
1142 {
1143 if (append.at(0) != '\\' && append.at(0) != '/')
1144#ifdef TARGET_WINDOWS
1145 ret.append("\\");
1146#else
1147 ret.append("/");
1148#endif
1149 ret.append(append);
1150 }
1151 return ret;
1152}
1153//------------------------------------------------------------------------------
1154
1155//==============================================================================
1165inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "")
1166{
1167 using namespace kodi::addon;
1168
1169 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_user_path(
1170 CPrivateBase::m_interface->toKodi->kodiBase);
1171 std::string ret = str;
1172 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1173 if (!append.empty())
1174 {
1175 if (append.at(0) != '\\' && append.at(0) != '/')
1176#ifdef TARGET_WINDOWS
1177 ret.append("\\");
1178#else
1179 ret.append("/");
1180#endif
1181 ret.append(append);
1182 }
1183 return ret;
1184}
1185//------------------------------------------------------------------------------
1186
1187//==============================================================================
1198inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "")
1199{
1200 using namespace kodi::addon;
1201
1202 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_temp_path(
1203 CPrivateBase::m_interface->toKodi->kodiBase);
1204 std::string ret = str;
1205 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1206 if (!append.empty())
1207 {
1208 if (append.at(0) != '\\' && append.at(0) != '/')
1209#ifdef TARGET_WINDOWS
1210 ret.append("\\");
1211#else
1212 ret.append("/");
1213#endif
1214 ret.append(append);
1215 }
1216 return ret;
1217}
1218//------------------------------------------------------------------------------
1219
1220//==============================================================================
1247inline std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId,
1248 const std::string& defaultStr = "")
1249{
1250 using namespace kodi::addon;
1251
1252 std::string retString = defaultStr;
1253 char* strMsg = CPrivateBase::m_interface->toKodi->kodi_addon->get_localized_string(
1254 CPrivateBase::m_interface->toKodi->kodiBase, labelId);
1255 if (strMsg != nullptr)
1256 {
1257 if (std::strlen(strMsg))
1258 retString = strMsg;
1259 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1260 strMsg);
1261 }
1262 return retString;
1263}
1264//------------------------------------------------------------------------------
1265
1266//##############################################################################
1278
1280//==============================================================================
1296inline bool ATTR_DLL_LOCAL OpenSettings()
1297{
1298 using namespace kodi::addon;
1299 return CPrivateBase::m_interface->toKodi->kodi_addon->open_settings_dialog(
1300 CPrivateBase::m_interface->toKodi->kodiBase);
1301}
1302//------------------------------------------------------------------------------
1303
1304//==============================================================================
1312inline bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string& settingName)
1313{
1314 using namespace kodi::addon;
1315 return CPrivateBase::m_interface->toKodi->kodi_addon->is_setting_using_default(
1316 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str());
1317}
1318//------------------------------------------------------------------------------
1319
1320//==============================================================================
1343inline bool ATTR_DLL_LOCAL CheckSettingString(const std::string& settingName,
1344 std::string& settingValue)
1345{
1346 using namespace kodi::addon;
1347
1348 char* buffer = nullptr;
1349 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_string(
1350 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer);
1351 if (buffer)
1352 {
1353 if (ret)
1354 settingValue = buffer;
1355 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase,
1356 buffer);
1357 }
1358 return ret;
1359}
1360//------------------------------------------------------------------------------
1361
1362//==============================================================================
1381inline std::string ATTR_DLL_LOCAL GetSettingString(const std::string& settingName,
1382 const std::string& defaultValue = "")
1383{
1384 std::string settingValue = defaultValue;
1385 CheckSettingString(settingName, settingValue);
1386 return settingValue;
1387}
1388//------------------------------------------------------------------------------
1389
1390//==============================================================================
1409inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName,
1410 const std::string& settingValue)
1411{
1412 using namespace kodi::addon;
1413
1414 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_string(
1415 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue.c_str());
1416}
1417//------------------------------------------------------------------------------
1418
1419//==============================================================================
1442inline bool ATTR_DLL_LOCAL CheckSettingInt(const std::string& settingName, int& settingValue)
1443{
1444 using namespace kodi::addon;
1445
1446 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1447 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1448}
1449//------------------------------------------------------------------------------
1450
1451//==============================================================================
1470inline int ATTR_DLL_LOCAL GetSettingInt(const std::string& settingName, int defaultValue = 0)
1471{
1472 int settingValue = defaultValue;
1473 CheckSettingInt(settingName, settingValue);
1474 return settingValue;
1475}
1476//------------------------------------------------------------------------------
1477
1478//==============================================================================
1497inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int settingValue)
1498{
1499 using namespace kodi::addon;
1500
1501 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1502 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1503}
1504//------------------------------------------------------------------------------
1505
1506//==============================================================================
1529inline bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string& settingName, bool& settingValue)
1530{
1531 using namespace kodi::addon;
1532
1533 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_bool(
1534 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1535}
1536//------------------------------------------------------------------------------
1537
1538//==============================================================================
1557inline bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string& settingName,
1558 bool defaultValue = false)
1559{
1560 bool settingValue = defaultValue;
1561 CheckSettingBoolean(settingName, settingValue);
1562 return settingValue;
1563}
1564//------------------------------------------------------------------------------
1565
1566//==============================================================================
1585inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, bool settingValue)
1586{
1587 using namespace kodi::addon;
1588
1589 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_bool(
1590 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1591}
1592//------------------------------------------------------------------------------
1593
1594//==============================================================================
1617inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, float& settingValue)
1618{
1619 using namespace kodi::addon;
1620
1621 return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_float(
1622 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue);
1623}
1624//------------------------------------------------------------------------------
1625
1626//==============================================================================
1645inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName,
1646 float defaultValue = 0.0f)
1647{
1648 float settingValue = defaultValue;
1649 CheckSettingFloat(settingName, settingValue);
1650 return settingValue;
1651}
1652//------------------------------------------------------------------------------
1653
1654//==============================================================================
1673inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float settingValue)
1674{
1675 using namespace kodi::addon;
1676
1677 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_float(
1678 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue);
1679}
1680//------------------------------------------------------------------------------
1681
1682//==============================================================================
1713template<typename enumType>
1714inline bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string& settingName, enumType& settingValue)
1715{
1716 using namespace kodi::addon;
1717
1718 int settingValueInt = static_cast<int>(settingValue);
1719 bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int(
1720 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt);
1721 if (ret)
1722 settingValue = static_cast<enumType>(settingValueInt);
1723 return ret;
1724}
1725//------------------------------------------------------------------------------
1726
1727//==============================================================================
1755template<typename enumType>
1756inline enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string& settingName,
1757 enumType defaultValue = static_cast<enumType>(0))
1758{
1759 enumType settingValue = defaultValue;
1760 CheckSettingEnum(settingName, settingValue);
1761 return settingValue;
1762}
1763//------------------------------------------------------------------------------
1764
1765//==============================================================================
1793template<typename enumType>
1794inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumType settingValue)
1795{
1796 using namespace kodi::addon;
1797
1798 CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int(
1799 CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(),
1800 static_cast<int>(settingValue));
1801}
1802//------------------------------------------------------------------------------
1803
1806//==============================================================================
1832inline std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string& id)
1833{
1834 using namespace kodi::addon;
1835
1836 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1837
1838 std::string strReturn;
1839 char* strMsg = toKodi->kodi_addon->get_addon_info(toKodi->kodiBase, id.c_str());
1840 if (strMsg != nullptr)
1841 {
1842 if (std::strlen(strMsg))
1843 strReturn = strMsg;
1844 toKodi->free_string(toKodi->kodiBase, strMsg);
1845 }
1846 return strReturn;
1847}
1848//------------------------------------------------------------------------------
1849
1850//==============================================================================
1868inline void* GetInterface(const std::string& name, const std::string& version)
1869{
1870 using namespace kodi::addon;
1871
1872 AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi;
1873
1874 return toKodi->kodi_addon->get_interface(toKodi->kodiBase, name.c_str(), version.c_str());
1875}
1876//----------------------------------------------------------------------------
1877
1878//==============================================================================
1888inline std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
1889{
1890 using namespace kodi::addon;
1891
1892 char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_type_version(
1893 CPrivateBase::m_interface->toKodi->kodiBase, type);
1894 std::string ret = str;
1895 CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str);
1896 return ret;
1897}
1898//------------------------------------------------------------------------------
1899
1900//============================================================================
1907inline std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
1908{
1909 switch (status)
1910 {
1911 case ADDON_STATUS_OK:
1912 return "OK";
1914 return "Lost Connection";
1916 return "Need Restart";
1918 return "Need Settings";
1920 return "Unknown error";
1922 return "Permanent failure";
1923 case ADDON_STATUS_NOT_IMPLEMENTED:
1924 return "Not implemented";
1925 default:
1926 break;
1927 }
1928 return "Unknown";
1929}
1930//----------------------------------------------------------------------------
1931
1932} /* namespace addon */
1933
1934//==============================================================================
1957inline void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char* format, ...)
1958{
1959 using namespace kodi::addon;
1960
1961 va_list args;
1962 va_start(args, format);
1963 const std::string str = kodi::tools::StringUtils::FormatV(format, args);
1964 va_end(args);
1965 CPrivateBase::m_interface->toKodi->addon_log_msg(CPrivateBase::m_interface->toKodi->kodiBase,
1966 loglevel, str.c_str());
1967}
1968//------------------------------------------------------------------------------
1969
1970} /* namespace kodi */
1971
1972//==============================================================================
2066#define ADDONCREATOR(AddonClass) \
2067 extern "C" ATTR_DLL_EXPORT ADDON_STATUS ADDON_Create(KODI_HANDLE addonInterface) \
2068 { \
2069 using namespace kodi::addon; \
2070 CPrivateBase::m_interface = static_cast<AddonGlobalInterface*>(addonInterface); \
2071 CPrivateBase::m_interface->addonBase = new AddonClass; \
2072 return static_cast<CAddonBase*>(CPrivateBase::m_interface->addonBase)->Create(); \
2073 } \
2074 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \
2075 { \
2076 return kodi::addon::GetTypeVersion(type); \
2077 } \
2078 extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \
2079 { \
2080 return kodi::addon::GetTypeMinVersion(type); \
2081 } \
2082 AddonGlobalInterface* kodi::addon::CPrivateBase::m_interface = nullptr;
2083//------------------------------------------------------------------------------
2084
2085#endif /* __cplusplus */
Definition AddonBase.h:794
Definition AddonBase.h:442
Definition AddonBase.h:207
Definition AddonBase.h:291
Definition AddonBase.h:567
bool IsInstanceAPIVersionAtLeast(int major, int minor, int patch) const
Whether Kodi's API for this instance is at least the given version.
Definition AddonBase.h:592
Definition AddonBase.h:503
ADDON_LOG
Definition addon_base.h:183
@ ADDON_LOG_FATAL
4 : To notify fatal unrecoverable errors, which can may also indicate upcoming crashes.
Definition addon_base.h:198
ADDON_STATUS
Definition addon_base.h:139
@ ADDON_STATUS_NEED_SETTINGS
Necessary settings are not yet set.
Definition addon_base.h:150
@ ADDON_STATUS_LOST_CONNECTION
A needed connection was lost.
Definition addon_base.h:144
@ ADDON_STATUS_OK
For everything OK and no error.
Definition addon_base.h:141
@ ADDON_STATUS_NEED_RESTART
Addon needs a restart inside Kodi.
Definition addon_base.h:147
@ ADDON_STATUS_UNKNOWN
Unknown and incomprehensible error.
Definition addon_base.h:153
@ ADDON_STATUS_PERMANENT_FAILURE
Permanent failure, like failing to resolve methods.
Definition addon_base.h:156
unsigned int GetUInt() const
To get settings value as unsigned integer.
Definition AddonBase.h:471
int GetInt() const
To get settings value as integer.
Definition AddonBase.h:468
bool GetBoolean() const
To get settings value as boolean.
Definition AddonBase.h:474
const std::string & GetString() const
To get settings value as string.
Definition AddonBase.h:465
float GetFloat() const
To get settings value as floating point.
Definition AddonBase.h:477
enumType GetEnum() const
To get settings value as enum.
Definition AddonBase.h:482
uint32_t GetNumber() const
Get optional identification number (usage relate to addon type).
Definition AddonBase.h:533
std::string GetID() const
Get optional identification string (usage relate to addon type).
Definition AddonBase.h:536
KODI_ADDON_INSTANCE_TYPE GetType() const
To get settings value as string.
Definition AddonBase.h:524
bool FirstInstance() const
Check this is first created instance by Kodi.
Definition AddonBase.h:542
bool IsType(KODI_ADDON_INSTANCE_TYPE type) const
Check asked type used on this class.
Definition AddonBase.h:530
std::string GetAPIVersion() const
Get API version from Kodi about instance.
Definition AddonBase.h:539
virtual ADDON_STATUS SetSetting(const std::string &settingName, const kodi::addon::CSettingValue &settingValue)
To inform addon about changed settings values.
Definition AddonBase.h:889
virtual ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo &instance, KODI_ADDON_INSTANCE_HDL &hdl)
Instance created.
Definition AddonBase.h:943
virtual ~CAddonBase()=default
Destructor.
virtual ADDON_STATUS Create()
Main addon creation function.
Definition AddonBase.h:836
CAddonBase()
Addon base class constructor.
Definition AddonBase.h:800
virtual void DestroyInstance(const IInstanceInfo &instance, const KODI_ADDON_INSTANCE_HDL hdl)
Instance destroy.
Definition AddonBase.h:963
std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId, const std::string &defaultStr="")
Returns an addon's localized 'unicode string'.
Definition AddonBase.h:1247
std::string ATTR_DLL_LOCAL GetTempPath(const std::string &append="")
To get a temporary path for the addon.
Definition AddonBase.h:1198
std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status)
Get to related ADDON_STATUS a human readable text.
Definition AddonBase.h:1907
std::string ATTR_DLL_LOCAL GetLibPath(const std::string &append="")
This function gives OS associated executable binary path of the addon.
Definition AddonBase.h:1133
void * GetInterface(const std::string &name, const std::string &version)
Returns a function table to a named interface.
Definition AddonBase.h:1868
std::string ATTR_DLL_LOCAL GetUserPath(const std::string &append="")
To get the user-related folder of the addon.
Definition AddonBase.h:1165
std::string ATTR_DLL_LOCAL GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition AddonBase.h:1888
std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string &id)
Returns the value of an addon property as a string.
Definition AddonBase.h:1832
std::string ATTR_DLL_LOCAL GetAddonPath(const std::string &append="")
To get the addon system installation folder.
Definition AddonBase.h:1096
void ATTR_DLL_LOCAL SetSettingInt(const std::string &settingName, int settingValue)
Set integer setting of addon.
Definition AddonBase.h:1497
bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string &settingName, float &settingValue)
Check and get a floating point setting value.
Definition AddonBase.h:1617
bool ATTR_DLL_LOCAL CheckSettingInt(const std::string &settingName, int &settingValue)
Check and get a integer setting value.
Definition AddonBase.h:1442
void ATTR_DLL_LOCAL SetSettingString(const std::string &settingName, const std::string &settingValue)
Set string setting of addon.
Definition AddonBase.h:1409
bool ATTR_DLL_LOCAL OpenSettings()
Opens this Add-Ons settings dialog.
Definition AddonBase.h:1296
void ATTR_DLL_LOCAL SetSettingFloat(const std::string &settingName, float settingValue)
Set floating point setting of addon.
Definition AddonBase.h:1673
bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string &settingName)
Check the given setting name is set to default value.
Definition AddonBase.h:1312
std::string ATTR_DLL_LOCAL GetSettingString(const std::string &settingName, const std::string &defaultValue="")
Get string setting value.
Definition AddonBase.h:1381
bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string &settingName, enumType &settingValue)
Check and get a enum setting value.
Definition AddonBase.h:1714
bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string &settingName, bool &settingValue)
Check and get a boolean setting value.
Definition AddonBase.h:1529
void ATTR_DLL_LOCAL SetSettingEnum(const std::string &settingName, enumType settingValue)
Set enum setting of addon.
Definition AddonBase.h:1794
enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string &settingName, enumType defaultValue=static_cast< enumType >(0))
Get enum setting value.
Definition AddonBase.h:1756
float ATTR_DLL_LOCAL GetSettingFloat(const std::string &settingName, float defaultValue=0.0f)
Get floating point setting value.
Definition AddonBase.h:1645
void ATTR_DLL_LOCAL SetSettingBoolean(const std::string &settingName, bool settingValue)
Set boolean setting of addon.
Definition AddonBase.h:1585
bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string &settingName, bool defaultValue=false)
Get boolean setting value.
Definition AddonBase.h:1557
bool ATTR_DLL_LOCAL CheckSettingString(const std::string &settingName, std::string &settingValue)
Check and get a string setting value.
Definition AddonBase.h:1343
int ATTR_DLL_LOCAL GetSettingInt(const std::string &settingName, int defaultValue=0)
Get integer setting value.
Definition AddonBase.h:1470
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:1957
Main structure passed from kodi to addon with basic information needed to create add-on.
Definition addon_base.h:381
Callback function tables from addon to Kodi Set complete from Kodi!
Definition addon_base.h:328
Definition addon_base.h:221
Definition addon_base.h:269
Internal used structure to have stored C API data above and available for everything below.
Definition AddonBase.h:74