summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h')
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h55
1 files changed, 50 insertions, 5 deletions
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
index 42ce2e7..db39f86 100644
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
@@ -43,6 +43,20 @@
43 #define ATTRIBUTE_HIDDEN 43 #define ATTRIBUTE_HIDDEN
44#endif 44#endif
45 45
46#ifdef _MSC_VER
47 #define ATTRIBUTE_FORCEINLINE __forceinline
48#elif defined(__GNUC__)
49 #define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__))
50#elif defined(__CLANG__)
51 #if __has_attribute(__always_inline__)
52 #define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__))
53 #else
54 #define ATTRIBUTE_FORCEINLINE inline
55 #endif
56#else
57 #define ATTRIBUTE_FORCEINLINE inline
58#endif
59
46#include "versions.h" 60#include "versions.h"
47 61
48namespace kodi { namespace addon { class CAddonBase; }} 62namespace kodi { namespace addon { class CAddonBase; }}
@@ -179,6 +193,7 @@ typedef struct KodiToAddonFuncTable_Addon
179 ADDON_STATUS (*create_instance)(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent); 193 ADDON_STATUS (*create_instance)(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent);
180 void (*destroy_instance)(int instanceType, KODI_HANDLE instance); 194 void (*destroy_instance)(int instanceType, KODI_HANDLE instance);
181 ADDON_STATUS (*set_setting)(const char *settingName, const void *settingValue); 195 ADDON_STATUS (*set_setting)(const char *settingName, const void *settingValue);
196 ADDON_STATUS(*create_instance_ex)(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent, const char* version);
182} KodiToAddonFuncTable_Addon; 197} KodiToAddonFuncTable_Addon;
183 198
184/* 199/*
@@ -237,6 +252,11 @@ public:
237 return ADDON_STATUS_NOT_IMPLEMENTED; 252 return ADDON_STATUS_NOT_IMPLEMENTED;
238 } 253 }
239 254
255 virtual ADDON_STATUS CreateInstanceEx(int instanceType, std::string instanceID, KODI_HANDLE instance, KODI_HANDLE& addonInstance, const std::string &version)
256 {
257 return CreateInstance(instanceType, instanceID, instance, addonInstance);
258 }
259
240 const ADDON_TYPE m_type; 260 const ADDON_TYPE m_type;
241}; 261};
242} /* namespace addon */ 262} /* namespace addon */
@@ -278,6 +298,9 @@ public:
278 CAddonBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance; 298 CAddonBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance;
279 CAddonBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance; 299 CAddonBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance;
280 CAddonBase::m_interface->toAddon->set_setting = ADDONBASE_SetSetting; 300 CAddonBase::m_interface->toAddon->set_setting = ADDONBASE_SetSetting;
301 // If version is present, we know that kodi has create_instance_ex implemented
302 if (!CAddonBase::m_strGlobalApiVersion.empty())
303 CAddonBase::m_interface->toAddon->create_instance_ex = ADDONBASE_CreateInstanceEx;
281 } 304 }
282 305
283 virtual ~CAddonBase() = default; 306 virtual ~CAddonBase() = default;
@@ -306,8 +329,14 @@ public:
306 return ADDON_STATUS_UNKNOWN; 329 return ADDON_STATUS_UNKNOWN;
307 } 330 }
308 331
332 virtual ADDON_STATUS CreateInstanceEx(int instanceType, std::string instanceID, KODI_HANDLE instance, KODI_HANDLE& addonInstance, const std::string &version)
333 {
334 return CreateInstance(instanceType, instanceID, instance, addonInstance);
335 }
336
309 /* Global variables of class */ 337 /* Global variables of class */
310 static AddonGlobalInterface* m_interface; // Interface function table to hold addresses on add-on and from kodi 338 static AddonGlobalInterface* m_interface; // Interface function table to hold addresses on add-on and from kodi
339 static std::string m_strGlobalApiVersion;
311 340
312/*private:*/ /* Needed public as long the old call functions becomes used! */ 341/*private:*/ /* Needed public as long the old call functions becomes used! */
313 static inline void ADDONBASE_Destroy() 342 static inline void ADDONBASE_Destroy()
@@ -325,16 +354,21 @@ public:
325 354
326 static inline ADDON_STATUS ADDONBASE_CreateInstance(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent) 355 static inline ADDON_STATUS ADDONBASE_CreateInstance(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent)
327 { 356 {
357 return ADDONBASE_CreateInstanceEx(instanceType, instanceID, instance, addonInstance, parent, "");
358 }
359
360 static inline ADDON_STATUS ADDONBASE_CreateInstanceEx(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent, const char* version)
361 {
328 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED; 362 ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED;
329 if (parent != nullptr) 363 if (parent != nullptr)
330 status = static_cast<IAddonInstance*>(parent)->CreateInstance(instanceType, instanceID, instance, *addonInstance); 364 status = static_cast<IAddonInstance*>(parent)->CreateInstanceEx(instanceType, instanceID, instance, *addonInstance, version);
331 if (status == ADDON_STATUS_NOT_IMPLEMENTED) 365 if (status == ADDON_STATUS_NOT_IMPLEMENTED)
332 status = CAddonBase::m_interface->addonBase->CreateInstance(instanceType, instanceID, instance, *addonInstance); 366 status = CAddonBase::m_interface->addonBase->CreateInstanceEx(instanceType, instanceID, instance, *addonInstance, version);
333 if (*addonInstance == nullptr) 367 if (*addonInstance == nullptr)
334 throw std::logic_error("kodi::addon::CAddonBase CreateInstance returns a empty instance pointer!"); 368 throw std::logic_error("kodi::addon::CAddonBase CreateInstanceEx returns a empty instance pointer!");
335 369
336 if (static_cast<::kodi::addon::IAddonInstance*>(*addonInstance)->m_type != instanceType) 370 if (static_cast<::kodi::addon::IAddonInstance*>(*addonInstance)->m_type != instanceType)
337 throw std::logic_error("kodi::addon::CAddonBase CreateInstance with difference on given and returned instance type!"); 371 throw std::logic_error("kodi::addon::CAddonBase CreateInstanceEx with difference on given and returned instance type!");
338 372
339 return status; 373 return status;
340 } 374 }
@@ -636,6 +670,11 @@ inline void* GetInterface(const std::string &name, const std::string &version)
636 kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \ 670 kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \
637 return kodi::addon::CAddonBase::m_interface->addonBase->Create(); \ 671 return kodi::addon::CAddonBase::m_interface->addonBase->Create(); \
638 } \ 672 } \
673 extern "C" __declspec(dllexport) ADDON_STATUS ADDON_CreateEx(KODI_HANDLE addonInterface, const char* globalApiVersion, void *unused) \
674 { \
675 kodi::addon::CAddonBase::m_strGlobalApiVersion = globalApiVersion; \
676 return ADDON_Create(addonInterface, unused); \
677 } \
639 extern "C" __declspec(dllexport) void ADDON_Destroy() \ 678 extern "C" __declspec(dllexport) void ADDON_Destroy() \
640 { \ 679 { \
641 kodi::addon::CAddonBase::ADDONBASE_Destroy(); \ 680 kodi::addon::CAddonBase::ADDONBASE_Destroy(); \
@@ -652,4 +691,10 @@ inline void* GetInterface(const std::string &name, const std::string &version)
652 { \ 691 { \
653 return kodi::addon::GetTypeVersion(type); \ 692 return kodi::addon::GetTypeVersion(type); \
654 } \ 693 } \
655 AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr; 694 extern "C" __declspec(dllexport) const char* ADDON_GetTypeMinVersion(int type) \
695 { \
696 return kodi::addon::GetTypeMinVersion(type); \
697 } \
698 AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr; \
699 std::string kodi::addon::CAddonBase::m_strGlobalApiVersion;
700