aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlwin Esch <alwin.esch@web.de>2017-05-30 01:41:37 +0200
committerGitHub <noreply@github.com>2017-05-30 01:41:37 +0200
commit22294382f070ee420c9d8c0b841d7024b96e1720 (patch)
tree629d16e40020f7dc8bdb2da4f492173545dabe19
parentf717612ef251ddaff9a682c62f078c1a1d08c444 (diff)
parentf97e6e6e8ae7a7d239959c915422fdfdef3a43b4 (diff)
Merge pull request #12187 from AlwinEsch/add-callbacks
[addons] add general addon callback functions to new style
-rw-r--r--addons/kodi.binary.global.general/addon.xml.in7
-rw-r--r--system/addon-manifest.xml1
-rw-r--r--xbmc/addons/AddonDll.cpp3
-rw-r--r--xbmc/addons/interfaces/CMakeLists.txt6
-rw-r--r--xbmc/addons/interfaces/General.cpp225
-rw-r--r--xbmc/addons/interfaces/General.h63
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h28
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h376
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h18
9 files changed, 722 insertions, 5 deletions
diff --git a/addons/kodi.binary.global.general/addon.xml.in b/addons/kodi.binary.global.general/addon.xml.in
new file mode 100644
index 0000000000..119c803363
--- /dev/null
+++ b/addons/kodi.binary.global.general/addon.xml.in
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<addon id="kodi.binary.global.general" version="@ADDON_GLOBAL_VERSION_GENERAL@" provider-name="Team Kodi">
+ <backwards-compatibility abi="@ADDON_GLOBAL_VERSION_GENERAL_MIN@"/>
+ <requires>
+ <import addon="xbmc.core" version="0.1.0"/>
+ </requires>
+</addon>
diff --git a/system/addon-manifest.xml b/system/addon-manifest.xml
index 2ae2975eaf..0f034bd30d 100644
--- a/system/addon-manifest.xml
+++ b/system/addon-manifest.xml
@@ -4,6 +4,7 @@
<addon>game.controller.default</addon>
<addon>kodi.binary.global.audioengine</addon>
<addon>kodi.binary.global.main</addon>
+ <addon>kodi.binary.global.general</addon>
<addon>kodi.binary.global.gui</addon>
<addon>kodi.binary.instance.adsp</addon>
<addon>kodi.binary.instance.audiodecoder</addon>
diff --git a/xbmc/addons/AddonDll.cpp b/xbmc/addons/AddonDll.cpp
index 00a147427c..1fd7f189fa 100644
--- a/xbmc/addons/AddonDll.cpp
+++ b/xbmc/addons/AddonDll.cpp
@@ -38,6 +38,7 @@
// Global addon callback handle classes
#include "addons/interfaces/AudioEngine.h"
+#include "addons/interfaces/General.h"
namespace ADDON
{
@@ -563,6 +564,7 @@ bool CAddonDll::InitInterface(KODI_HANDLE firstKodiInstance)
// Related parts becomes set from addon headers.
m_interface.toAddon = (KodiToAddonFuncTable_Addon*) calloc(1, sizeof(KodiToAddonFuncTable_Addon));
+ Interface_General::Init(&m_interface);
Interface_AudioEngine::Init(&m_interface);
return true;
@@ -571,6 +573,7 @@ bool CAddonDll::InitInterface(KODI_HANDLE firstKodiInstance)
void CAddonDll::DeInitInterface()
{
Interface_AudioEngine::DeInit(&m_interface);
+ Interface_General::DeInit(&m_interface);
if (m_interface.libBasePath)
free((char*)m_interface.libBasePath);
diff --git a/xbmc/addons/interfaces/CMakeLists.txt b/xbmc/addons/interfaces/CMakeLists.txt
index f662cf460b..53d149975e 100644
--- a/xbmc/addons/interfaces/CMakeLists.txt
+++ b/xbmc/addons/interfaces/CMakeLists.txt
@@ -1,7 +1,9 @@
set(SOURCES AddonInterfaces.cpp
- AudioEngine.cpp)
+ AudioEngine.cpp
+ General.cpp)
set(HEADERS AddonInterfaces.h
- AudioEngine.h)
+ AudioEngine.h
+ General.h)
core_add_library(addonsBinaryInterfaces)
diff --git a/xbmc/addons/interfaces/General.cpp b/xbmc/addons/interfaces/General.cpp
new file mode 100644
index 0000000000..0779732401
--- /dev/null
+++ b/xbmc/addons/interfaces/General.cpp
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2005-2017 Team Kodi
+ * http://kodi.tv
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with KODI; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "General.h"
+
+#include "addons/kodi-addon-dev-kit/include/kodi/General.h"
+
+#include "Application.h"
+#include "addons/AddonDll.h"
+#include "addons/GUIDialogAddonSettings.h"
+#include "dialogs/GUIDialogKaiToast.h"
+#include "utils/CharsetConverter.h"
+#include "utils/log.h"
+#include "utils/LangCodeExpander.h"
+#include "utils/StringUtils.h"
+
+using namespace kodi; // addon-dev-kit namespace
+
+namespace ADDON
+{
+
+void Interface_General::Init(AddonGlobalInterface* addonInterface)
+{
+ addonInterface->toKodi->kodi = static_cast<AddonToKodiFuncTable_kodi*>(malloc(sizeof(AddonToKodiFuncTable_kodi)));
+
+ addonInterface->toKodi->kodi->open_settings_dialog = open_settings_dialog;
+ addonInterface->toKodi->kodi->get_localized_string = get_localized_string;
+ addonInterface->toKodi->kodi->unknown_to_utf8 = unknown_to_utf8;
+ addonInterface->toKodi->kodi->get_language = get_language;
+ addonInterface->toKodi->kodi->queue_notification = queue_notification;
+}
+
+void Interface_General::DeInit(AddonGlobalInterface* addonInterface)
+{
+ if (addonInterface->toKodi && /* <-- needed as long as the old addon way is used */
+ addonInterface->toKodi->kodi)
+ {
+ free(addonInterface->toKodi->kodi);
+ addonInterface->toKodi->kodi = nullptr;
+ }
+}
+
+bool Interface_General::open_settings_dialog(void* kodiBase)
+{
+ CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
+ if (addon == nullptr)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - invalid data (addon='%p')", __FUNCTION__, addon);
+ return false;
+ }
+
+ // show settings dialog
+ AddonPtr addonInfo;
+ if (CAddonMgr::GetInstance().GetAddon(addon->ID(), addonInfo))
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - Could not get addon information for '%s'", __FUNCTION__, addon->ID().c_str());
+ return false;
+ }
+
+ return CGUIDialogAddonSettings::ShowAndGetInput(addonInfo);
+}
+
+char* Interface_General::get_localized_string(void* kodiBase, long dwCode)
+{
+ CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
+ if (!addon)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - invalid data (addon='%p')", __FUNCTION__, addon);
+ return nullptr;
+ }
+
+ if (g_application.m_bStop)
+ return nullptr;
+
+ std::string string;
+ if ((dwCode >= 30000 && dwCode <= 30999) || (dwCode >= 32000 && dwCode <= 32999))
+ string = g_localizeStrings.GetAddonString(addon->ID(), dwCode).c_str();
+ else
+ string = g_localizeStrings.Get(dwCode).c_str();
+
+ char* buffer = strdup(string.c_str());
+ return buffer;
+}
+
+char* Interface_General::unknown_to_utf8(void* kodiBase, const char* source, bool* ret, bool failOnBadChar)
+{
+ CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
+ if (!addon || !source || !ret)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - invalid data (addon='%p', source='%p', ret='%p')", __FUNCTION__, addon, source, ret);
+ return nullptr;
+ }
+
+ std::string string;
+ *ret = g_charsetConverter.unknownToUTF8(source, string, failOnBadChar);
+ char* buffer = strdup(string.c_str());
+ return buffer;
+}
+
+char* Interface_General::get_language(void* kodiBase, int format, bool region)
+{
+ CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
+ if (!addon)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - invalid data (addon='%p')", __FUNCTION__, addon);
+ return nullptr;
+ }
+
+ std::string string = g_langInfo.GetEnglishLanguageName();
+ switch (format)
+ {
+ case LANG_FMT_ISO_639_1:
+ {
+ std::string langCode;
+ g_LangCodeExpander.ConvertToISO6391(string, langCode);
+ string = langCode;
+ if (region)
+ {
+ std::string region2Code;
+ g_LangCodeExpander.ConvertToISO6391(g_langInfo.GetRegionLocale(), region2Code);
+ if (!region2Code.empty())
+ string += "-" + region2Code;
+ }
+ break;
+ }
+ case LANG_FMT_ISO_639_2:
+ {
+ std::string langCode;
+ g_LangCodeExpander.ConvertToISO6392T(string, langCode);
+ string = langCode;
+ if (region)
+ {
+ std::string region3Code;
+ g_LangCodeExpander.ConvertToISO6392T(g_langInfo.GetRegionLocale(), region3Code);
+ if (!region3Code.empty())
+ string += "-" + region3Code;
+ }
+ break;
+ }
+ case LANG_FMT_ENGLISH_NAME:
+ default:
+ {
+ if (region)
+ string += "-" + g_langInfo.GetCurrentRegion();
+ break;
+ }
+ }
+
+ char* buffer = strdup(string.c_str());
+ return buffer;
+}
+
+bool Interface_General::queue_notification(void* kodiBase, int type, const char* header,
+ const char* message, const char* imageFile,
+ unsigned int displayTime, bool withSound,
+ unsigned int messageTime)
+{
+ CAddonDll* addon = static_cast<CAddonDll*>(kodiBase);
+ if (addon == nullptr || message == nullptr)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - invalid data (addon='%p', message='%p')", __FUNCTION__, addon, message);
+ return false;
+ }
+
+ std::string usedHeader;
+ if (header && strlen(header) > 0)
+ usedHeader = header;
+ else
+ usedHeader = addon->Name();
+
+ if (type != QUEUE_OWN_STYLE)
+ {
+ CGUIDialogKaiToast::eMessageType usedType;
+ switch (type)
+ {
+ case QUEUE_WARNING:
+ usedType = CGUIDialogKaiToast::Warning;
+ withSound = true;
+ CLog::Log(LOGDEBUG, "Interface_General::%s - %s - Warning Message: '%s'", __FUNCTION__, addon->Name().c_str(), message);
+ break;
+ case QUEUE_ERROR:
+ usedType = CGUIDialogKaiToast::Error;
+ withSound = true;
+ CLog::Log(LOGDEBUG, "Interface_General::%s - %s - Error Message : '%s'", __FUNCTION__, addon->Name().c_str(), message);
+ break;
+ case QUEUE_INFO:
+ default:
+ usedType = CGUIDialogKaiToast::Info;
+ withSound = false;
+ CLog::Log(LOGDEBUG, "Interface_General::%s - %s - Info Message : '%s'", __FUNCTION__, addon->Name().c_str(), message);
+ break;
+ }
+
+ if (imageFile && strlen(imageFile) > 0)
+ {
+ CLog::Log(LOGERROR, "Interface_General::%s - To use given image file '%s' must be type value set to 'QUEUE_OWN_STYLE'", __FUNCTION__, imageFile);
+ }
+
+ CGUIDialogKaiToast::QueueNotification(usedType, usedHeader, message, 3000, withSound);
+ }
+ else
+ {
+ CGUIDialogKaiToast::QueueNotification(imageFile, usedHeader, message, displayTime, withSound, messageTime);
+ }
+ return true;
+}
+
+} /* namespace ADDON */
diff --git a/xbmc/addons/interfaces/General.h b/xbmc/addons/interfaces/General.h
new file mode 100644
index 0000000000..b5b8f624b5
--- /dev/null
+++ b/xbmc/addons/interfaces/General.h
@@ -0,0 +1,63 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2017 Team Kodi
+ * http://kodi.tv
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with KODI; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+extern "C"
+{
+
+struct AddonGlobalInterface;
+
+namespace ADDON
+{
+
+ /*!
+ * @brief Global general Add-on to Kodi callback functions
+ *
+ * To hold general functions not related to a instance type and usable for
+ * every add-on type.
+ *
+ * Related add-on header is "./xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h"
+ */
+ struct Interface_General
+ {
+ static void Init(AddonGlobalInterface* addonInterface);
+ static void DeInit(AddonGlobalInterface* addonInterface);
+
+ /*!
+ * @brief callback functions from add-on to kodi
+ *
+ * @note To add a new function use the "_" style to directly identify an
+ * add-on callback function. Everything with CamelCase is only to be used
+ * in Kodi.
+ *
+ * The parameter `kodiBase` is used to become the pointer for a `CAddonDll`
+ * class.
+ */
+ //@{
+ static bool open_settings_dialog(void* kodiBase);
+ static char* get_localized_string(void* kodiBase, long dwCode);
+ static char* unknown_to_utf8(void* kodiBase, const char* source, bool* ret, bool failOnBadChar);
+ static char* get_language(void* kodiBase, int format, bool region);
+ static bool queue_notification(void* kodiBase, int type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime);
+ //@}
+ };
+
+} /* namespace ADDON */
+} /* extern "C" */
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 d022576cda..3145049c07 100644
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h
@@ -143,6 +143,7 @@ typedef ADDON_HANDLE_STRUCT *ADDON_HANDLE;
* Callback function tables from addon to Kodi
* Set complete from Kodi!
*/
+struct AddonToKodiFuncTable_kodi;
struct AddonToKodiFuncTable_kodi_audioengine;
typedef struct AddonToKodiFuncTable_Addon
{
@@ -158,6 +159,7 @@ typedef struct AddonToKodiFuncTable_Addon
bool (*get_setting)(void* kodiBase, const char* settingName, void *settingValue);
bool (*set_setting)(void* kodiBase, const char* settingName, const char* settingValue);
+ AddonToKodiFuncTable_kodi* kodi;
AddonToKodiFuncTable_kodi_audioengine* kodi_audioengine;
} AddonToKodiFuncTable_Addon;
@@ -349,11 +351,22 @@ public:
//==============================================================================
namespace kodi {
///
-inline std::string GetAddonPath()
+inline std::string GetAddonPath(const std::string& append = "")
{
char* str = ::kodi::addon::CAddonBase::m_interface->toKodi->get_addon_path(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase);
std::string ret = str;
::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, str);
+ if (!append.empty())
+ {
+ if (append.at(0) != '\\' &&
+ append.at(0) != '/')
+#ifdef TARGET_WINDOWS
+ ret.append("\\");
+#else
+ ret.append("/");
+#endif
+ ret.append(append);
+ }
return ret;
}
} /* namespace kodi */
@@ -362,11 +375,22 @@ inline std::string GetAddonPath()
//==============================================================================
namespace kodi {
///
-inline std::string GetBaseUserPath()
+inline std::string GetBaseUserPath(const std::string& append = "")
{
char* str = ::kodi::addon::CAddonBase::m_interface->toKodi->get_base_user_path(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase);
std::string ret = str;
::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, str);
+ if (!append.empty())
+ {
+ if (append.at(0) != '\\' &&
+ append.at(0) != '/')
+#ifdef TARGET_WINDOWS
+ ret.append("\\");
+#else
+ ret.append("/");
+#endif
+ ret.append(append);
+ }
return ret;
}
} /* namespace kodi */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h
new file mode 100644
index 0000000000..50718af8ab
--- /dev/null
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/General.h
@@ -0,0 +1,376 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2017 Team Kodi
+ * http://kodi.tv
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kodi; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "AddonBase.h"
+
+/*
+ * For interface between add-on and kodi.
+ *
+ * This structure defines the addresses of functions stored inside Kodi which
+ * are then available for the add-on to call
+ *
+ * All function pointers there are used by the C++ interface functions below.
+ * You find the set of them on xbmc/addons/interfaces/General.cpp
+ *
+ * Note: For add-on development itself this is not needed
+ */
+typedef struct AddonToKodiFuncTable_kodi
+{
+ bool (*open_settings_dialog)(void* kodiBase);
+ char* (*unknown_to_utf8)(void* kodiBase, const char* source, bool* ret, bool failOnBadChar);
+ char* (*get_localized_string)(void* kodiBase, long dwCode);
+ char* (*get_language)(void* kodiBase, int format, bool region);
+ bool (*queue_notification)(void* kodiBase, int type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime);
+} AddonToKodiFuncTable_kodi;
+
+//==============================================================================
+/// \ingroup cpp_kodi_Defs
+/// @brief For kodi::QueueNotification() used message types
+///
+typedef enum QueueMsg
+{
+ /// Show info notification message
+ QUEUE_INFO,
+ /// Show warning notification message
+ QUEUE_WARNING,
+ /// Show error notification message
+ QUEUE_ERROR,
+ /// Show with own given image and parts if set on values
+ QUEUE_OWN_STYLE
+} QueueMsg;
+//------------------------------------------------------------------------------
+
+//==============================================================================
+/// \ingroup cpp_kodi_Defs
+/// @brief Format codes to get string from them.
+///
+typedef enum LangFormats
+{
+ /// two letter code as defined in ISO 639-1
+ LANG_FMT_ISO_639_1,
+ /// three letter code as defined in ISO 639-2/T or ISO 639-2/B
+ LANG_FMT_ISO_639_2,
+ /// full language name in English
+ LANG_FMT_ENGLISH_NAME
+} LangFormats;
+//------------------------------------------------------------------------------
+
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Opens this Add-Ons settings dialog.
+///
+/// @return true if settings were changed and the dialog confirmed, false otherwise.
+///
+///
+/// --------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ..
+/// kodi::OpenSettings();
+/// ..
+/// ~~~~~~~~~~~~~
+///
+inline bool OpenSettings()
+{
+ return ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->open_settings_dialog(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase);
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Returns an addon's localized 'unicode string'.
+///
+/// @param[in] labelId string you want to localize
+/// @param[in] defaultStr [opt] The default message, also helps to identify
+/// the code that is used <em>(default is
+/// <b><c>empty</c></b>)</em>
+/// @return The localized message, or default if the add-on
+/// helper fails to return a message
+///
+/// @note Label id's \b 30000 to \b 30999 and \b 32000 to \b 32999 are related
+/// to the add-on's own included strings from
+/// <b>./resources/language/resource.language.??_??/strings.po</b>
+/// All other strings are from Kodi core language files.
+///
+///
+/// ------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// std::string str = kodi::GetLocalizedString(30005, "Use me as default");
+/// ...
+/// ~~~~~~~~~~~~~
+///
+inline std::string GetLocalizedString(uint32_t labelId, const std::string& defaultStr = "")
+{
+ std::string retString = defaultStr;
+ char* strMsg = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_localized_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, labelId);
+ if (strMsg != nullptr)
+ {
+ if (std::strlen(strMsg))
+ retString = strMsg;
+ ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, strMsg);
+ }
+ return retString;
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Translate a string with an unknown encoding to UTF8.
+///
+/// @param[in] stringSrc The string to translate.
+/// @param[out] utf8StringDst The translated string.
+/// @param[in] failOnBadChar [opt] returns failed if bad character is inside <em>(default is <b><c>false</c></b>)</em>
+/// @return true if OK
+///
+///
+/// ------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// std::string ret;
+/// if (!kodi::UnknownToUTF8("test string", ret, true))
+/// fprintf(stderr, "Translation to UTF8 failed!\n");
+/// ...
+/// ~~~~~~~~~~~~~
+///
+inline bool UnknownToUTF8(const std::string& stringSrc, std::string& utf8StringDst, bool failOnBadChar = false)
+{
+ bool ret = false;
+ char* retString = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->unknown_to_utf8(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase,
+ stringSrc.c_str(), &ret, failOnBadChar);
+ if (retString != nullptr)
+ {
+ if (ret)
+ utf8StringDst = retString;
+ ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, retString);
+ }
+ return ret;
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Returns the active language as a string.
+///
+/// @param[in] format Used format of the returned language string
+/// | enum code: | Description: |
+/// |----------------------:|------------------------------------------------------------|
+/// | LANG_FMT_ENGLISH_NAME | full language name in English (Default) |
+/// | LANG_FMT_ISO_639_1 | two letter code as defined in ISO 639-1 |
+/// | LANG_FMT_ISO_639_2 | three letter code as defined in ISO 639-2/T or ISO 639-2/B |
+/// @param[in] region [opt] append the region delimited by "-" of the language (setting) to the returned language string <em>(default is <b><c>false</c></b>)</em>
+/// @return active language
+///
+///
+/// ------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// std::string language = kodi::GetLanguage(LANG_FMT_ISO_639_1, false);
+/// ...
+/// ~~~~~~~~~~~~~
+///
+inline std::string GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME, bool region = false)
+{
+ std::string language;
+ char* retString = ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->get_language(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, format, region);
+ if (retString != nullptr)
+ {
+ if (std::strlen(retString))
+ language = retString;
+ ::kodi::addon::CAddonBase::m_interface->toKodi->free_string(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, retString);
+ }
+ return language;
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Writes the C string pointed by format in the GUI. If format includes
+/// format specifiers (subsequences beginning with %), the additional arguments
+/// following format are formatted and inserted in the resulting string replacing
+/// their respective specifiers.
+///
+/// After the format parameter, the function expects at least as many additional
+/// arguments as specified by format.
+///
+/// @param[in] type The message type.
+/// | enum code: | Description: |
+/// |---------------:|-----------------------------------|
+/// | QUEUE_INFO | Show info notification message |
+/// | QUEUE_WARNING | Show warning notification message |
+/// | QUEUE_ERROR | Show error notification message |
+/// @param[in] format The format of the message to pass to display in Kodi.
+/// C string that contains the text to be written to the stream.
+/// It can optionally contain embedded format specifiers that are
+/// replaced by the values specified in subsequent additional
+/// arguments and formatted as requested.
+/// | specifier | Output | Example
+/// |------------|----------------------------------------------------|------------
+/// | d or i | Signed decimal integer | 392
+/// | u | Unsigned decimal integer | 7235
+/// | o | Unsigned octal | 610
+/// | x | Unsigned hexadecimal integer | 7fa
+/// | X | Unsigned hexadecimal integer (uppercase) | 7FA
+/// | f | Decimal floating point, lowercase | 392.65
+/// | F | Decimal floating point, uppercase | 392.65
+/// | e | Scientific notation (mantissa/exponent), lowercase | 3.9265e+2
+/// | E | Scientific notation (mantissa/exponent), uppercase | 3.9265E+2
+/// | g | Use the shortest representation: %e or %f | 392.65
+/// | G | Use the shortest representation: %E or %F | 392.65
+/// | a | Hexadecimal floating point, lowercase | -0xc.90fep-2
+/// | A | Hexadecimal floating point, uppercase | -0XC.90FEP-2
+/// | c | Character | a
+/// | s | String of characters | sample
+/// | p | Pointer address | b8000000
+/// | % | A % followed by another % character will write a single % to the stream. | %
+///
+/// The length sub-specifier modifies the length of the data type. This is a chart
+/// showing the types used to interpret the corresponding arguments with and without
+/// length specifier (if a different type is used, the proper type promotion or
+/// conversion is performed, if allowed):
+/// | length| d i | u o x X | f F e E g G a A | c | s | p | n |
+/// |-------|---------------|-----------------------|-----------------|-------|---------|---------|-----------------|
+/// | (none)| int | unsigned int | double | int | char* | void* | int* |
+/// | hh | signed char | unsigned char | | | | | signed char* |
+/// | h | short int | unsigned short int | | | | | short int* |
+/// | l | long int | unsigned long int | | wint_t| wchar_t*| | long int* |
+/// | ll | long long int | unsigned long long int| | | | | long long int* |
+/// | j | intmax_t | uintmax_t | | | | | intmax_t* |
+/// | z | size_t | size_t | | | | | size_t* |
+/// | t | ptrdiff_t | ptrdiff_t | | | | | ptrdiff_t* |
+/// | L | | | long double | | | | |
+/// <b>Note:</b> that the c specifier takes an int (or wint_t) as argument, but performs the proper conversion to a char value
+/// (or a wchar_t) before formatting it for output.
+/// @param[in] ... (additional arguments) Depending on the format string, the function
+/// may expect a sequence of additional arguments, each containing a value
+/// to be used to replace a format specifier in the format string (or a pointer
+/// to a storage location, for n).
+/// There should be at least as many of these arguments as the number of values specified
+/// in the format specifiers. Additional arguments are ignored by the function.
+///
+///
+/// ------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// kodi::QueueFormattedNotification(QUEUE_WARNING, "I'm want to inform you, here with a test call to show '%s'", "this");
+/// ...
+/// ~~~~~~~~~~~~~
+///
+inline void QueueFormattedNotification(QueueMsg type, const char* format, ... )
+{
+ va_list args;
+ char buffer[16384];
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+ ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->queue_notification(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase,
+ type, "", buffer, "", 5000, false, 1000);
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
+
+//==============================================================================
+namespace kodi {
+///
+/// \ingroup cpp_kodi
+/// @brief Queue a notification in the GUI.
+///
+/// @param[in] type The message type.
+/// | enum code: | Description:
+/// |----------------------:|-----------------------------------
+/// | QUEUE_INFO | Show info notification message
+/// | QUEUE_WARNING | Show warning notification message
+/// | QUEUE_ERROR | Show error notification message
+/// | QUEUE_OWN_STYLE | If used can be with imageFile the wanted image set or if leaved empty shown as info, also are the other optional values available then
+/// @param[in] header Header Name (if leaved empty becomes addon name used)
+/// @param[in] message Message to display on Kodi
+/// @param[in] imageFile [opt] The image file to show on message (to use must be type set to QUEUE_OWN_STYLE)
+/// @param[in] displayTime [opt] The time how long message is displayed <b>(default 5 sec)</b> (to use must be type set to QUEUE_OWN_STYLE)
+/// @param[in] withSound [opt] if true also warning sound becomes played <b>(default with sound)</b> (to use must be type set to QUEUE_OWN_STYLE)
+/// @param[in] messageTime [opt] how many milli seconds start show of notification <b>(default 1 sec)</b> (to use must be type set to QUEUE_OWN_STYLE)
+///
+///
+/// ------------------------------------------------------------------------
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// kodi::QueueNotification(QUEUE_OWN_STYLE, "I'm want to inform you", "Here with a test call", "", 3000, false, 1000);
+/// ...
+/// ~~~~~~~~~~~~~
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// kodi::QueueNotification(QUEUE_WARNING, "I'm want to inform you", "Here with a test call");
+/// ...
+/// ~~~~~~~~~~~~~
+///
+/// **Example:**
+/// ~~~~~~~~~~~~~{.cpp}
+/// #include <kodi/General.h>
+/// ...
+/// kodi::QueueNotification(QUEUE_OWN_STYLE, "", "Here with a test call", "./myImage.png");
+/// ...
+/// ~~~~~~~~~~~~~
+///
+inline void QueueNotification(QueueMsg type, const std::string& header,
+ const std::string& message, const std::string& imageFile = "",
+ unsigned int displayTime = 5000, bool withSound = true,
+ unsigned int messageTime = 1000)
+{
+ ::kodi::addon::CAddonBase::m_interface->toKodi->kodi->queue_notification(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase,
+ type, header.c_str(), message.c_str(), imageFile.c_str(), displayTime,
+ withSound, messageTime);
+}
+} /* namespace kodi */
+//------------------------------------------------------------------------------
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h
index 3902a18dc3..80b673a576 100644
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/versions.h
@@ -41,7 +41,7 @@
* overview.
*/
-#define ADDON_GLOBAL_VERSION_MAIN "1.0.4"
+#define ADDON_GLOBAL_VERSION_MAIN "1.0.5"
#define ADDON_GLOBAL_VERSION_MAIN_MIN "1.0.2"
#define ADDON_GLOBAL_VERSION_MAIN_XML_ID "kodi.binary.global.main"
#define ADDON_GLOBAL_VERSION_MAIN_DEPENDS "AddonBase.h" \
@@ -50,6 +50,11 @@
"libXBMC_addon.h" \
"addon-instance/"
+#define ADDON_GLOBAL_VERSION_GENERAL "1.0.0"
+#define ADDON_GLOBAL_VERSION_GENERAL_MIN "1.0.0"
+#define ADDON_GLOBAL_VERSION_GENERAL_XML_ID "kodi.binary.global.general"
+#define ADDON_GLOBAL_VERSION_GENERAL_DEPENDS "General.h"
+
#define ADDON_GLOBAL_VERSION_GUI "5.11.0"
#define ADDON_GLOBAL_VERSION_GUI_MIN "5.10.0"
#define ADDON_GLOBAL_VERSION_GUI_XML_ID "kodi.binary.global.gui"
@@ -147,6 +152,7 @@ typedef enum ADDON_TYPE
ADDON_GLOBAL_MAIN = 0,
ADDON_GLOBAL_GUI = 1,
ADDON_GLOBAL_AUDIOENGINE = 2,
+ ADDON_GLOBAL_GENERAL = 3,
ADDON_GLOBAL_MAX = 3, // Last used global id, used in loops to check versions. Need to change if new global type becomes added.
/* addon type instances */
@@ -187,6 +193,10 @@ inline const char* GetTypeVersion(int type)
/* addon global parts */
case ADDON_GLOBAL_MAIN:
return ADDON_GLOBAL_VERSION_MAIN;
+#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GENERAL_USED)
+ case ADDON_GLOBAL_GENERAL:
+ return ADDON_GLOBAL_VERSION_GENERAL;
+#endif
#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GUI_USED)
case ADDON_GLOBAL_GUI:
return ADDON_GLOBAL_VERSION_GUI;
@@ -262,6 +272,8 @@ inline const char* GetTypeMinVersion(int type)
return ADDON_GLOBAL_VERSION_MAIN_MIN;
case ADDON_GLOBAL_GUI:
return ADDON_GLOBAL_VERSION_GUI_MIN;
+ case ADDON_GLOBAL_GENERAL:
+ return ADDON_GLOBAL_VERSION_GENERAL_MIN;
case ADDON_GLOBAL_AUDIOENGINE:
return ADDON_GLOBAL_VERSION_AUDIOENGINE_MIN;
@@ -308,6 +320,8 @@ inline const char* GetTypeName(int type)
return "Addon";
case ADDON_GLOBAL_GUI:
return "GUI";
+ case ADDON_GLOBAL_GENERAL:
+ return "General";
case ADDON_GLOBAL_AUDIOENGINE:
return "AudioEngine";
@@ -351,6 +365,8 @@ inline int GetTypeId(const char* name)
{
if (strcmp(name, "addon") == 0)
return ADDON_GLOBAL_MAIN;
+ else if (strcmp(name, "general") == 0)
+ return ADDON_GLOBAL_GENERAL;
else if (strcmp(name, "gui") == 0)
return ADDON_GLOBAL_GUI;
else if (strcmp(name, "audioengine") == 0)