diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e46f87255080..082642b338a53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,7 @@ set(INCLUDES ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/lib ${CMAKE_SOURCE_DIR}/xbmc ${CMAKE_SOURCE_DIR}/xbmc/${PLATFORM_DIR} + ${CMAKE_SOURCE_DIR}/xbmc/addons/kodi-dev-kit ${CMAKE_SOURCE_DIR}/xbmc/cores/VideoPlayer ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR} ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/include) @@ -219,6 +220,8 @@ if(ENABLE_AIRTUNES) endif() endif() +list(APPEND DEP_DEFINES -DDEVKIT_LIBRARY="${DEVKIT_LIBRARY}") + # find all folders containing addon.xml.in # used to define ADDON_XML_OUTPUTS, ADDON_XML_DEPENDS and ADDON_INSTALL_DATA # Function defined in ./cmake/scripts/common/Macros.cmake @@ -306,7 +309,7 @@ endif() set(GLOBAL_TARGET_DEPS ffmpeg dvdnav crossguid fmt Spdlog::Spdlog fstrcmp flatbuffers ${PLATFORM_GLOBAL_TARGET_DEPS}) # main library (used for main binary and tests) -add_library(lib${APP_NAME_LC} STATIC $) +add_library(lib${APP_NAME_LC} STATIC $ $) add_dependencies(lib${APP_NAME_LC} ${GLOBAL_TARGET_DEPS}) set_target_properties(lib${APP_NAME_LC} PROPERTIES PREFIX "") diff --git a/addons/kodi.binary.devkit/addon.xml.in b/addons/kodi.binary.devkit/addon.xml.in new file mode 100644 index 0000000000000..0fabe408f8023 --- /dev/null +++ b/addons/kodi.binary.devkit/addon.xml.in @@ -0,0 +1,8 @@ + + + + @__KDK_CANARY_XML__@ + + + + diff --git a/addons/kodi.binary.global.audioengine/addon.xml.in b/addons/kodi.binary.global.audioengine/addon.xml.in deleted file mode 100644 index 64301a63fecc4..0000000000000 --- a/addons/kodi.binary.global.audioengine/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.filesystem/addon.xml.in b/addons/kodi.binary.global.filesystem/addon.xml.in deleted file mode 100644 index 71955fb741b95..0000000000000 --- a/addons/kodi.binary.global.filesystem/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.general/addon.xml.in b/addons/kodi.binary.global.general/addon.xml.in deleted file mode 100644 index 119c803363168..0000000000000 --- a/addons/kodi.binary.global.general/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.gui/addon.xml.in b/addons/kodi.binary.global.gui/addon.xml.in deleted file mode 100644 index d3f453f744379..0000000000000 --- a/addons/kodi.binary.global.gui/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.main/addon.xml.in b/addons/kodi.binary.global.main/addon.xml.in deleted file mode 100644 index f60bbb5562063..0000000000000 --- a/addons/kodi.binary.global.main/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.network/addon.xml.in b/addons/kodi.binary.global.network/addon.xml.in deleted file mode 100644 index dd56be41aa36a..0000000000000 --- a/addons/kodi.binary.global.network/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.global.tools/addon.xml.in b/addons/kodi.binary.global.tools/addon.xml.in deleted file mode 100644 index f96576aff28d9..0000000000000 --- a/addons/kodi.binary.global.tools/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.audiodecoder/addon.xml.in b/addons/kodi.binary.instance.audiodecoder/addon.xml.in deleted file mode 100644 index 50ce7e4264e24..0000000000000 --- a/addons/kodi.binary.instance.audiodecoder/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.audioencoder/addon.xml.in b/addons/kodi.binary.instance.audioencoder/addon.xml.in deleted file mode 100644 index 31d5cf61d6e94..0000000000000 --- a/addons/kodi.binary.instance.audioencoder/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.game/addon.xml.in b/addons/kodi.binary.instance.game/addon.xml.in deleted file mode 100644 index b8b379d2defa6..0000000000000 --- a/addons/kodi.binary.instance.game/addon.xml.in +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/addons/kodi.binary.instance.game/controller.xsd b/addons/kodi.binary.instance.game/controller.xsd deleted file mode 100644 index 13e9e0cf26e67..0000000000000 --- a/addons/kodi.binary.instance.game/controller.xsd +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/addons/kodi.binary.instance.imagedecoder/addon.xml.in b/addons/kodi.binary.instance.imagedecoder/addon.xml.in deleted file mode 100644 index b6eae4e900c2f..0000000000000 --- a/addons/kodi.binary.instance.imagedecoder/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.inputstream/addon.xml.in b/addons/kodi.binary.instance.inputstream/addon.xml.in deleted file mode 100644 index 21f604212dc99..0000000000000 --- a/addons/kodi.binary.instance.inputstream/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.peripheral/addon.xml.in b/addons/kodi.binary.instance.peripheral/addon.xml.in deleted file mode 100644 index 99165f1830666..0000000000000 --- a/addons/kodi.binary.instance.peripheral/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.pvr/addon.xml.in b/addons/kodi.binary.instance.pvr/addon.xml.in deleted file mode 100644 index fce51e6ce8092..0000000000000 --- a/addons/kodi.binary.instance.pvr/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.pvr/icon.png b/addons/kodi.binary.instance.pvr/icon.png deleted file mode 100644 index 154968fc6c741..0000000000000 Binary files a/addons/kodi.binary.instance.pvr/icon.png and /dev/null differ diff --git a/addons/kodi.binary.instance.screensaver/addon.xml.in b/addons/kodi.binary.instance.screensaver/addon.xml.in deleted file mode 100644 index b11831d2526f1..0000000000000 --- a/addons/kodi.binary.instance.screensaver/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.vfs/addon.xml.in b/addons/kodi.binary.instance.vfs/addon.xml.in deleted file mode 100644 index 248bcccd36fe1..0000000000000 --- a/addons/kodi.binary.instance.vfs/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.videocodec/addon.xml.in b/addons/kodi.binary.instance.videocodec/addon.xml.in deleted file mode 100644 index c3b035cc16397..0000000000000 --- a/addons/kodi.binary.instance.videocodec/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/kodi.binary.instance.visualization/addon.xml.in b/addons/kodi.binary.instance.visualization/addon.xml.in deleted file mode 100644 index ab828695725cf..0000000000000 --- a/addons/kodi.binary.instance.visualization/addon.xml.in +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index a80c59ebb0f11..b763aecd73409 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -6511,7 +6511,37 @@ msgctxt "#13253" msgid "Cancel move" msgstr "" -#empty strings from id 13254 to 13269 +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13254" +msgid "CPU usage:" +msgstr "" + +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13255" +msgid "Physical memory usage:" +msgstr "" + +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13256" +msgid "Virtual memory usage:" +msgstr "" + +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13257" +msgid "Shared memory usage:" +msgstr "" + +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13258" +msgid "Threads:" +msgstr "" + +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13259" +msgid "Process ID:" +msgstr "" + +#empty strings from id 13260 to 13269 msgctxt "#13270" msgid "Hardware:" @@ -6561,7 +6591,10 @@ msgctxt "#13281" msgid "Hardware" msgstr "" -#empty string with id 13282 +#: addons/skin.estuary/xml/SettingsSystemInfo.xml +msgctxt "#13282" +msgid "Addons" +msgstr "" #: xbmc/windows/GUIWindowSystemInfo.cpp msgctxt "#13283" @@ -14424,7 +14457,19 @@ msgctxt "#21483" msgid "View" msgstr "" -#empty strings from id 21484 to 21601 +#. Button label within addon info dialog to open list view about supported types of him, e.g. supported file extensions +#: xbmc/addons/GUIDialogAddonInfo.cpp +msgctxt "#21484" +msgid "Show support" +msgstr "" + +#. Button label within addon info dialog to open list view about supported types of him, e.g. supported file extensions +#: xbmc/addons/GUIDialogAddonInfo.cpp +msgctxt "#21485" +msgid "Supported file extensions and media types" +msgstr "" + +#empty strings from id 21486 to 21601 #: xbmc/Util.cpp msgctxt "#21602" diff --git a/addons/skin.estuary/xml/DialogAddonCrashReporter.xml b/addons/skin.estuary/xml/DialogAddonCrashReporter.xml new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/addons/skin.estuary/xml/SettingsSystemInfo.xml b/addons/skin.estuary/xml/SettingsSystemInfo.xml index a0bec86593e57..d8e91f37e8f58 100644 --- a/addons/skin.estuary/xml/SettingsSystemInfo.xml +++ b/addons/skin.estuary/xml/SettingsSystemInfo.xml @@ -80,29 +80,271 @@ Mono26 - - 420 - 50 - 30 - 347 - 60 - !Control.HasFocus(60) + + + 420 + 50 + 30 + 347 + 60 + !Control.HasFocus(60) + + + 0 + 0 + 12 + 340 + vertical + + conditional + 30 + 9000 + Control.IsVisible(30) + Visible + Hidden + WindowOpen + WindowClose + - - 0 - 0 - 12 - 340 - vertical - - conditional - 9000 - 9000 - Control.IsVisible(30) - Visible - Hidden - WindowOpen - WindowClose + + + 420 + 40 + 30 + 347 + 9000 + 61 + 61 + vertical + + + 10 + 10 + 100 + 100 + $INFO[ListItem.Art(icon)] + + + 130 + 10 + 20 + 35 + center + white + green + ListItem.Label + + + CPU Text + 130 + 50 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Threads Text + 110 + 50 + 610 + 35 + + center + right + black + font12 + System.SupportsCPUUsage + + + CPU BAR + 120 + 85 + 610 + 16 + ListItem.Property(cpuusage) + System.SupportsCPUUsage + + + Physical Memory Text + 800 + 10 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Virtual Memory Text + 800 + 45 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Shared Memory Text + 800 + 80 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Addon Process Id + 230 + 10 + auto + 35 + + center + right + black + font12 + System.SupportsCPUUsage + + + + + 0 + 0 + 0 + 0 + lists/focus.png + Control.HasFocus(29) + + + 10 + 10 + 100 + 100 + $INFO[ListItem.Art(icon)] + + + 130 + 10 + 20 + 35 + center + white + green + ListItem.Label + + + CPU Text + 130 + 50 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Threads Text + 110 + 50 + 610 + 35 + + center + right + black + font12 + System.SupportsCPUUsage + + + CPU BAR + 120 + 85 + 610 + 16 + ListItem.Property(cpuusage) + System.SupportsCPUUsage + + + Physical Memory Text + 800 + 10 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Virtual Memory Text + 800 + 45 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Shared Memory Text + 800 + 80 + auto + 35 + + center + black + font12 + System.SupportsCPUUsage + + + Addon Process Id + 230 + 10 + auto + 35 + + center + right + black + font12 + System.SupportsCPUUsage + + + + + 0 + 0 + 12 + 340 + vertical + + conditional + 29 + 9000 + Control.IsVisible(29) + Visible + Hidden + WindowOpen + WindowClose + 380 @@ -168,6 +410,15 @@ 420 + + Button Addons + 29 + + + + 420 + + Button PVR diff --git a/cmake/scripts/common/AddonHelpers.cmake b/cmake/scripts/common/AddonHelpers.cmake index c541ad702e77c..1cb9dfd6daf18 100644 --- a/cmake/scripts/common/AddonHelpers.cmake +++ b/cmake/scripts/common/AddonHelpers.cmake @@ -92,66 +92,60 @@ macro (build_addon target prefix libs) endforeach() endif() - message(STATUS "Addon dependency check ...") - # Set defines used in addon.xml.in and read from versions.h to set add-on + message(STATUS "Addon API check ...") + # Set defines used in addon.xml.in and read from version.h to set add-on # version parts automatically - file(STRINGS ${KODI_INCLUDE_DIR}/versions.h BIN_ADDON_PARTS) + file(STRINGS ${KODI_INCLUDE_DIR}/c-api/version.h BIN_ADDON_PARTS) + set(__KDK_API_OLDEST__ 10000) foreach(loop_var ${BIN_ADDON_PARTS}) - # Only pass strings with "#define ADDON_" from versions.h - if(loop_var MATCHES "#define ADDON_") - string(REGEX REPLACE "\\\n" " " loop_var ${loop_var}) # remove header line breaks - string(REGEX REPLACE "#define " "" loop_var ${loop_var}) # remove the #define name from string - string(REGEX MATCHALL "[//a-zA-Z0-9._-]+" loop_var "${loop_var}") # separate the define values to a list - - # Get the definition name + string(FIND "${loop_var}" "#define __KDK_MAJOR__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") list(GET loop_var 0 include_name) - # Check definition are depends who is a bigger list - if("${include_name}" MATCHES "_DEPENDS") - # Use start definition name as base for other value type - list(GET loop_var 0 list_name) - string(REPLACE "_DEPENDS" "_MIN" depends_minver ${list_name}) - string(REPLACE "_DEPENDS" "" depends_ver ${list_name}) - string(REPLACE "_DEPENDS" "_XML_ID" xml_entry_name ${list_name}) - string(REPLACE "_DEPENDS" "_USED" used_type_name ${list_name}) - - # remove the first value, not needed and wrong on "for" loop - list(REMOVE_AT loop_var 0) - - foreach(depend_header ${loop_var}) - string(STRIP ${depend_header} depend_header) - foreach(src_file ${USED_SOURCES}) - file(STRINGS ${src_file} BIN_ADDON_SRC_PARTS) - foreach(loop_var ${BIN_ADDON_SRC_PARTS}) - string(REGEX MATCH "^[ \t]*#[ \t]*(include|import)[ \t]*[<\"](kodi\/)?(.+)[\">]" include_name "${loop_var}") - if(include_name AND CMAKE_MATCH_3 MATCHES ^${depend_header}) - get_directory_property(CURRENT_DEFS COMPILE_DEFINITIONS) - if(NOT used_type_name IN_LIST CURRENT_DEFS) - set(ADDON_DEPENDS "${ADDON_DEPENDS}\n") - # Inform with them the addon header about used type, if not present before - add_definitions(-D${used_type_name}) - message(STATUS " - Added API usage definition: ${used_type_name} (Version: \"${${depends_ver}}\", Min. Version: \"${${depends_minver}}\")") - set(FOUND_HEADER_USAGE 1) - endif() - endif() - endforeach() - if(FOUND_HEADER_USAGE EQUAL 1) # break this loop if found but not unset, needed in parts where includes muddled up on addon - break() - endif() - endforeach() - # type is found and round becomes broken for next round with other type - if(FOUND_HEADER_USAGE EQUAL 1) - unset(FOUND_HEADER_USAGE) - break() - endif() - endforeach() + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_MINOR__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_BETA__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_CANARY__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + if(__KDK_CANARY__ EQUAL 1) + set(__KDK_CANARY_XML__ "true") else() - # read the definition values and make it by the on version.h defined names public - list(GET loop_var 1 include_variable) - string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_variable}) - set(${include_name} ${${include_name}}) + set(__KDK_CANARY_XML__ "false") endif() endif() - endforeach() + string(FIND "${loop_var}" "#define __KODI_API_" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + if(include_value LESS ${__KDK_API_OLDEST__}) + set(__KDK_API_OLDEST__ ${include_value}) + endif() + endif() + endforeach(loop_var) + add_definitions(-D__KDK_MAJOR__=${__KDK_MAJOR__}) + add_definitions(-D__KDK_MINOR__=${__KDK_MINOR__}) + add_definitions(-D__KDK_BETA__=${__KDK_BETA__}) + add_definitions(-D__KDK_CANARY__=${__KDK_CANARY__}) + add_definitions(-D__KDK_API_OLDEST__=${__KDK_API_OLDEST__}) add_library(${target} ${${prefix}_SOURCES} ${${prefix}_HEADERS}) target_link_libraries(${target} ${${libs}}) diff --git a/cmake/scripts/common/Macros.cmake b/cmake/scripts/common/Macros.cmake index 68b6393757d49..15afad49a4edb 100644 --- a/cmake/scripts/common/Macros.cmake +++ b/cmake/scripts/common/Macros.cmake @@ -111,6 +111,15 @@ function(core_add_test_library name) endforeach() endfunction() +# Add addon dev kit headers to main application +# Arguments: +# name name of the header part to add +function(core_add_devkit_header name) + if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_${name}) + endif() +endfunction() + # Add an dl-loaded shared library # Arguments: # name name of the library to add @@ -699,15 +708,51 @@ macro(core_find_versions) # Set defines used in addon.xml.in and read from versions.h to set add-on # version parts automatically - # This part is nearly identical to "AddonHelpers.cmake", except location of versions.h - file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-dev-kit/include/kodi/versions.h BIN_ADDON_PARTS) + # This part is nearly identical to "AddonHelpers.cmake", except location of version.h + file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h BIN_ADDON_PARTS) + set(__KDK_API_OLDEST__ 10000) foreach(loop_var ${BIN_ADDON_PARTS}) - string(FIND "${loop_var}" "#define ADDON_" matchres) + string(FIND "${loop_var}" "#define __KDK_MAJOR__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_MINOR__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_BETA__" matchres) if("${matchres}" EQUAL 0) string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") list(GET loop_var 0 include_name) - list(GET loop_var 1 include_version) - string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_version}) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + endif() + string(FIND "${loop_var}" "#define __KDK_CANARY__" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + string(REGEX REPLACE ".*\"(.*)\"" "\\1" ${include_name} ${include_value}) + if(__KDK_CANARY__ EQUAL 1) + set(__KDK_CANARY_XML__ "true") + else() + set(__KDK_CANARY_XML__ "false") + endif() + endif() + string(FIND "${loop_var}" "#define __KODI_API_" matchres) + if("${matchres}" EQUAL 0) + string(REGEX MATCHALL "[A-Z0-9._]+|[A-Z0-9._]+$" loop_var "${loop_var}") + list(GET loop_var 0 include_name) + list(GET loop_var 1 include_value) + if(include_value LESS ${__KDK_API_OLDEST__}) + set(__KDK_API_OLDEST__ ${include_value}) + endif() endif() endforeach(loop_var) @@ -767,5 +812,5 @@ macro(find_addon_xml_in_files) endforeach() # Append also versions.h to depends - list(APPEND ADDON_XML_DEPENDS "${CORE_SOURCE_DIR}/xbmc/addons/kodi-dev-kit/include/kodi/versions.h") + list(APPEND ADDON_XML_DEPENDS "${CORE_SOURCE_DIR}/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h") endmacro() diff --git a/cmake/scripts/linux/ArchSetup.cmake b/cmake/scripts/linux/ArchSetup.cmake index 0a27f30806bc8..94df5e3da468d 100644 --- a/cmake/scripts/linux/ArchSetup.cmake +++ b/cmake/scripts/linux/ArchSetup.cmake @@ -180,3 +180,6 @@ if(ARCH_IS_BIGENDIAN) else() message(STATUS "Host architecture is little-endian") endif() + +# Additional libraries +list(APPEND DEPLIBS rt) # Shared dev kit interface diff --git a/cmake/treedata/common/addon_dev_kit.txt b/cmake/treedata/common/addon_dev_kit.txt new file mode 100644 index 0000000000000..d2fcc9e8f0026 --- /dev/null +++ b/cmake/treedata/common/addon_dev_kit.txt @@ -0,0 +1,22 @@ +# Auto generated cmake/treedata/common/addon_dev_kit.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +xbmc/addons/kodi-dev-kit/include/kodi addons_kodi-dev-kit_include_kodi +xbmc/addons/kodi-dev-kit/include/kodi/c-api addons_kodi-dev-kit_include_kodi_c-api +xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl addons_kodi-dev-kit_include_kodi_c-api_dl +xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance addons_kodi-dev-kit_include_kodi_c-api_addon-instance +xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream addons_kodi-dev-kit_include_kodi_c-api_addon-instance_inputstream +xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr addons_kodi-dev-kit_include_kodi_c-api_addon-instance_pvr +xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui addons_kodi-dev-kit_include_kodi_c-api_gui +xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs addons_kodi-dev-kit_include_kodi_c-api_gui_dialogs +xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls addons_kodi-dev-kit_include_kodi_c-api_gui_controls +xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input addons_kodi-dev-kit_include_kodi_c-api_gui_input +xbmc/addons/kodi-dev-kit/include/kodi/addon-instance addons_kodi-dev-kit_include_kodi_addon-instance +xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral addons_kodi-dev-kit_include_kodi_addon-instance_peripheral +xbmc/addons/kodi-dev-kit/include/kodi/gui addons_kodi-dev-kit_include_kodi_gui +xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs addons_kodi-dev-kit_include_kodi_gui_dialogs +xbmc/addons/kodi-dev-kit/include/kodi/gui/controls addons_kodi-dev-kit_include_kodi_gui_controls +xbmc/addons/kodi-dev-kit/include/kodi/gui/gl addons_kodi-dev-kit_include_kodi_gui_gl +xbmc/addons/kodi-dev-kit/include/kodi/tools addons_kodi-dev-kit_include_kodi_tools +xbmc/addons/kodi-dev-kit/src/shared devkit_shared # Hardcoded entry, edit script for change! +xbmc/addons/kodi-dev-kit/src/addon kodidevkit # Hardcoded entry, edit script for change! diff --git a/cmake/treedata/common/addon_interface.txt b/cmake/treedata/common/addon_interface.txt new file mode 100644 index 0000000000000..5c169f831ed6a --- /dev/null +++ b/cmake/treedata/common/addon_interface.txt @@ -0,0 +1,12 @@ +# Auto generated cmake/treedata/common/addon_interface.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +xbmc/addons/interface addons_interface +xbmc/addons/interface/tools addons_interface_tools +xbmc/addons/interface/api addons_interface_api +xbmc/addons/interface/api/addon-instance addons_interface_api_addon-instance +xbmc/addons/interface/api/gui addons_interface_api_gui +xbmc/addons/interface/api/gui/dialogs addons_interface_api_gui_dialogs +xbmc/addons/interface/api/gui/controls addons_interface_api_gui_controls +xbmc/addons/interface/launcher addons_interface_launcher +xbmc/addons/interface/processinfo addons_interface_processinfo diff --git a/cmake/treedata/common/subdirs.txt b/cmake/treedata/common/subdirs.txt index ac1ee126984de..06f46404e2771 100644 --- a/cmake/treedata/common/subdirs.txt +++ b/cmake/treedata/common/subdirs.txt @@ -1,31 +1,7 @@ xbmc xbmc xbmc/addons addons xbmc/addons/addoninfo addons_addoninfo -xbmc/addons/binary-addons addons_binary-addons xbmc/addons/gui addons_gui -xbmc/addons/interfaces addons_interfaces -xbmc/addons/interfaces/gui addons_interfaces_gui -xbmc/addons/interfaces/gui/controls addons_interfaces_gui_controls -xbmc/addons/interfaces/gui/dialogs addons_interfaces_gui_dialogs -xbmc/addons/kodi-dev-kit/include/kodi addons_kodi-dev-kit_include_kodi -xbmc/addons/kodi-dev-kit/include/kodi/addon-instance addons_kodi-dev-kit_include_kodi_addon-instance -xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream addons_kodi-dev-kit_include_kodi_addon-instance_inputstream -xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral addons_kodi-dev-kit_include_kodi_addon-instance_peripheral -xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr addons_kodi-dev-kit_include_kodi_addon-instance_pvr -xbmc/addons/kodi-dev-kit/include/kodi/c-api addons_kodi-dev-kit_include_kodi_c-api -xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance addons_kodi-dev-kit_include_kodi_c-api_addon-instance -xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream addons_kodi-dev-kit_include_kodi_c-api_addon-instance_inputstream -xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr addons_kodi-dev-kit_include_kodi_c-api_addon-instance_pvr -xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui addons_kodi-dev-kit_include_kodi_c-api_gui -xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls addons_kodi-dev-kit_include_kodi_c-api_gui_controls -xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs addons_kodi-dev-kit_include_kodi_c-api_gui_dialogs -xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input addons_kodi-dev-kit_include_kodi_c-api_gui_input -xbmc/addons/kodi-dev-kit/include/kodi/gui addons_kodi-dev-kit_include_kodi_gui -xbmc/addons/kodi-dev-kit/include/kodi/gui/controls addons_kodi-dev-kit_include_kodi_gui_controls -xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs addons_kodi-dev-kit_include_kodi_gui_dialogs -xbmc/addons/kodi-dev-kit/include/kodi/gui/gl addons_kodi-dev-kit_include_kodi_gui_gl -xbmc/addons/kodi-dev-kit/include/kodi/gui/input addons_kodi-dev-kit_include_kodi_gui_input -xbmc/addons/kodi-dev-kit/include/kodi/tools addons_kodi-dev-kit_include_kodi_tools xbmc/addons/settings addons_settings xbmc/commons commons xbmc/dbwrappers dbwrappers diff --git a/system/addon-manifest.xml b/system/addon-manifest.xml index e6de83fb0261f..62a37cd47c235 100644 --- a/system/addon-manifest.xml +++ b/system/addon-manifest.xml @@ -3,24 +3,7 @@ audioencoder.kodi.builtin.wma game.controller.default game.controller.snes - kodi.binary.global.audioengine - kodi.binary.global.main - kodi.binary.global.general - kodi.binary.global.network - kodi.binary.global.gui - kodi.binary.global.filesystem - kodi.binary.global.tools - kodi.binary.instance.audiodecoder - kodi.binary.instance.audioencoder - kodi.binary.instance.game - kodi.binary.instance.imagedecoder - kodi.binary.instance.inputstream - kodi.binary.instance.peripheral - kodi.binary.instance.pvr - kodi.binary.instance.screensaver - kodi.binary.instance.vfs - kodi.binary.instance.videocodec - kodi.binary.instance.visualization + kodi.binary.devkit kodi.resource metadata.album.universal metadata.artists.universal diff --git a/xbmc/ServiceBroker.cpp b/xbmc/ServiceBroker.cpp index 71b3f8135800b..87337d68eca65 100644 --- a/xbmc/ServiceBroker.cpp +++ b/xbmc/ServiceBroker.cpp @@ -62,9 +62,14 @@ ADDON::CAddonMgr &CServiceBroker::GetAddonMgr() return g_application.m_ServiceManager->GetAddonMgr(); } -ADDON::CBinaryAddonManager &CServiceBroker::GetBinaryAddonManager() +KODI::ADDONS::INTERFACE::CController& CServiceBroker::GetAddonIfcCtrl() { - return g_application.m_ServiceManager->GetBinaryAddonManager(); + return g_application.m_ServiceManager->GetAddonIfcCtrl(); +} + +ADDON::CAudioDecoderSupportList& CServiceBroker::GetAudioDecoderSupportList() +{ + return g_application.m_ServiceManager->GetAudioDecoderSupportList(); } ADDON::CBinaryAddonCache &CServiceBroker::GetBinaryAddonCache() diff --git a/xbmc/ServiceBroker.h b/xbmc/ServiceBroker.h index 5be382ba18691..6617842b55df4 100644 --- a/xbmc/ServiceBroker.h +++ b/xbmc/ServiceBroker.h @@ -14,7 +14,7 @@ namespace ADDON { class CAddonMgr; -class CBinaryAddonManager; +class CAudioDecoderSupportList; class CBinaryAddonCache; class CVFSAddonCache; class CServiceAddonManager; @@ -72,6 +72,15 @@ class IWSDiscovery; namespace KODI { + +namespace ADDONS +{ +namespace INTERFACE +{ + class CController; +} /* namespace INTERFACE */ +} /* namespace ADDONS */ + namespace GAME { class CControllerManager; @@ -103,9 +112,10 @@ class CServiceBroker static void UnregisterAnnouncementManager(); static ADDON::CAddonMgr &GetAddonMgr(); - static ADDON::CBinaryAddonManager &GetBinaryAddonManager(); + static ADDON::CAudioDecoderSupportList& GetAudioDecoderSupportList(); static ADDON::CBinaryAddonCache &GetBinaryAddonCache(); static ADDON::CVFSAddonCache &GetVFSAddonCache(); + static KODI::ADDONS::INTERFACE::CController& GetAddonIfcCtrl(); static XBPython &GetXBPython(); static WSDiscovery::IWSDiscovery& GetWSDiscovery(); static MEDIA_DETECT::CDetectDVDMedia& GetDetectDVDMedia(); diff --git a/xbmc/ServiceManager.cpp b/xbmc/ServiceManager.cpp index 910fabf990cda..5f2ebdfeb0f4c 100644 --- a/xbmc/ServiceManager.cpp +++ b/xbmc/ServiceManager.cpp @@ -11,10 +11,11 @@ #include "ContextMenuManager.h" #include "DatabaseManager.h" #include "PlayListPlayer.h" +#include "addons/AudioDecoder.h" #include "addons/BinaryAddonCache.h" #include "addons/RepositoryUpdater.h" #include "addons/VFSEntry.h" -#include "addons/binary-addons/BinaryAddonManager.h" +#include "addons/interface/Controller.h" #include "cores/DataCacheCore.h" #include "cores/RetroPlayer/guibridge/GUIGameRenderManager.h" #include "cores/playercorefactory/PlayerCoreFactory.h" @@ -65,13 +66,18 @@ bool CServiceManager::InitForTesting() m_databaseManager.reset(new CDatabaseManager); - m_binaryAddonManager.reset(new ADDON::CBinaryAddonManager()); m_addonMgr.reset(new ADDON::CAddonMgr()); if (!m_addonMgr->Init()) { CLog::Log(LOGFATAL, "CServiceManager::{}: Unable to start CAddonMgr", __FUNCTION__); return false; } + m_addonIfcCtrl.reset(new KODI::ADDONS::INTERFACE::CController(*m_addonMgr)); + if (!m_addonIfcCtrl->Init()) + { + CLog::Log(LOGFATAL, "CServiceManager::%s: Unable to start KODI::ADDONS::INTERFACE::CController", __func__); + return false; + } m_fileExtensionProvider.reset(new CFileExtensionProvider(*m_addonMgr)); @@ -83,7 +89,6 @@ void CServiceManager::DeinitTesting() { init_level = 0; m_fileExtensionProvider.reset(); - m_binaryAddonManager.reset(); m_addonMgr.reset(); m_databaseManager.reset(); m_network.reset(); @@ -113,7 +118,6 @@ bool CServiceManager::InitStageTwo(const CAppParamParser ¶ms, const std::str // Initialize the addon database (must be before the addon manager is init'd) m_databaseManager.reset(new CDatabaseManager); - m_binaryAddonManager.reset(new ADDON::CBinaryAddonManager()); /* Need to constructed before, GetRunningInstance() of binary CAddonDll need to call them */ m_addonMgr.reset(new ADDON::CAddonMgr()); if (!m_addonMgr->Init()) { @@ -121,8 +125,17 @@ bool CServiceManager::InitStageTwo(const CAppParamParser ¶ms, const std::str return false; } + m_addonIfcCtrl.reset(new KODI::ADDONS::INTERFACE::CController(*m_addonMgr)); + if (!m_addonIfcCtrl->Init()) + { + CLog::Log(LOGFATAL, "CServiceManager::%s: Unable to start KODI::ADDONS::INTERFACE::CController", __func__); + return false; + } + m_repositoryUpdater.reset(new ADDON::CRepositoryUpdater(*m_addonMgr)); + m_audioDecoderSupportList.reset(new ADDON::CAudioDecoderSupportList()); + m_vfsAddonCache.reset(new ADDON::CVFSAddonCache()); m_vfsAddonCache->Init(); @@ -238,9 +251,10 @@ void CServiceManager::DeinitStageTwo() m_binaryAddonCache.reset(); m_dataCacheCore.reset(); m_PVRManager.reset(); + m_audioDecoderSupportList.reset(); m_vfsAddonCache.reset(); m_repositoryUpdater.reset(); - m_binaryAddonManager.reset(); + m_addonIfcCtrl.reset(); m_addonMgr.reset(); m_Platform.reset(); m_databaseManager.reset(); @@ -273,14 +287,14 @@ ADDON::CAddonMgr &CServiceManager::GetAddonMgr() return *m_addonMgr; } -ADDON::CBinaryAddonCache &CServiceManager::GetBinaryAddonCache() +ADDON::CAudioDecoderSupportList& CServiceManager::GetAudioDecoderSupportList() { - return *m_binaryAddonCache; + return *m_audioDecoderSupportList; } -ADDON::CBinaryAddonManager &CServiceManager::GetBinaryAddonManager() +ADDON::CBinaryAddonCache &CServiceManager::GetBinaryAddonCache() { - return *m_binaryAddonManager; + return *m_binaryAddonCache; } ADDON::CVFSAddonCache &CServiceManager::GetVFSAddonCache() @@ -298,6 +312,11 @@ ADDON::CRepositoryUpdater &CServiceManager::GetRepositoryUpdater() return *m_repositoryUpdater; } +KODI::ADDONS::INTERFACE::CController& CServiceManager::GetAddonIfcCtrl() +{ + return *m_addonIfcCtrl; +} + #ifdef HAS_PYTHON XBPython& CServiceManager::GetXBPython() { diff --git a/xbmc/ServiceManager.h b/xbmc/ServiceManager.h index f8d680f6a22d2..d752688633654 100644 --- a/xbmc/ServiceManager.h +++ b/xbmc/ServiceManager.h @@ -17,7 +17,7 @@ class CAppParamParser; namespace ADDON { class CAddonMgr; - class CBinaryAddonManager; + class CAudioDecoderSupportList; class CBinaryAddonCache; class CVFSAddonCache; class CServiceAddonManager; @@ -53,6 +53,15 @@ class CWeatherManager; namespace KODI { + +namespace ADDONS +{ +namespace INTERFACE +{ + class CController; +} /* namespace INTERFACE */ +} /* namespace ADDONS */ + namespace GAME { class CControllerManager; @@ -99,11 +108,12 @@ class CServiceManager void DeinitStageOne(); ADDON::CAddonMgr& GetAddonMgr(); - ADDON::CBinaryAddonManager& GetBinaryAddonManager(); + ADDON::CAudioDecoderSupportList& GetAudioDecoderSupportList(); ADDON::CBinaryAddonCache& GetBinaryAddonCache(); ADDON::CVFSAddonCache& GetVFSAddonCache(); ADDON::CServiceAddonManager& GetServiceAddons(); ADDON::CRepositoryUpdater& GetRepositoryUpdater(); + KODI::ADDONS::INTERFACE::CController& GetAddonIfcCtrl(); CNetworkBase& GetNetwork(); #ifdef HAS_PYTHON XBPython& GetXBPython(); @@ -160,12 +170,13 @@ class CServiceManager }; std::unique_ptr m_addonMgr; - std::unique_ptr m_binaryAddonManager; + std::unique_ptr m_audioDecoderSupportList; std::unique_ptr m_binaryAddonCache; std::unique_ptr m_vfsAddonCache; std::unique_ptr m_serviceAddons; std::unique_ptr m_repositoryUpdater; -#if defined(HAS_FILESYSTEM_SMB) + std::unique_ptr m_addonIfcCtrl; + #if defined(HAS_FILESYSTEM_SMB) std::unique_ptr m_WSDiscovery; #endif #ifdef HAS_PYTHON diff --git a/xbmc/TextureCacheJob.cpp b/xbmc/TextureCacheJob.cpp index 8a13684e9abab..c4d91243effec 100644 --- a/xbmc/TextureCacheJob.cpp +++ b/xbmc/TextureCacheJob.cpp @@ -7,21 +7,23 @@ */ #include "TextureCacheJob.h" + +#include "FileItem.h" #include "ServiceBroker.h" #include "TextureCache.h" +#include "URL.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h" +#include "filesystem/File.h" #include "guilib/Texture.h" +#include "music/MusicThumbLoader.h" +#include "music/tags/MusicInfoTag.h" +#include "pictures/Picture.h" #include "settings/AdvancedSettings.h" #include "settings/SettingsComponent.h" -#include "utils/log.h" -#include "filesystem/File.h" -#include "pictures/Picture.h" -#include "utils/URIUtils.h" #include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "utils/log.h" #include "video/VideoThumbLoader.h" -#include "URL.h" -#include "FileItem.h" -#include "music/MusicThumbLoader.h" -#include "music/tags/MusicInfoTag.h" #include @@ -226,8 +228,19 @@ std::string CTextureCacheJob::GetImageHash(const std::string &url) if (URIUtils::IsProtocol(url,"addons") || URIUtils::IsProtocol(url,"plugin")) return ""; + std::string statURL = url; + + // Handle special case about audiodecoder addon music files, e.g. SACD + if (StringUtils::EndsWith(URIUtils::GetExtension(url), KODI_ADDON_AUDIODECODER_TRACK_EXT)) + { + std::string addonImageURL = URIUtils::GetDirectory(url); + URIUtils::RemoveSlashAtEnd(addonImageURL); + if (XFILE::CFile::Exists(addonImageURL)) + statURL = addonImageURL; + } + struct __stat64 st; - if (XFILE::CFile::Stat(url, &st) == 0) + if (XFILE::CFile::Stat(statURL, &st) == 0) { int64_t time = st.st_mtime; if (!time) @@ -239,6 +252,7 @@ std::string CTextureCacheJob::GetImageHash(const std::string &url) // so set an obviously bad hash return "BADHASH"; } + CLog::Log(LOGDEBUG, "{} - unable to stat url {}", __FUNCTION__, CURL::GetRedacted(url)); return ""; } diff --git a/xbmc/addons/Addon.cpp b/xbmc/addons/Addon.cpp index fa57981fa2297..c36c91c7b1bfb 100644 --- a/xbmc/addons/Addon.cpp +++ b/xbmc/addons/Addon.cpp @@ -37,15 +37,14 @@ namespace ADDON { CAddon::CAddon(const AddonInfoPtr& addonInfo, TYPE addonType) - : m_addonInfo(addonInfo), - m_userSettingsPath(), - m_loadSettingsFailed(false), - m_hasUserSettings(false), - m_profilePath(StringUtils::Format("special://profile/addon_data/{}/", m_addonInfo->ID())), - m_settings(nullptr), - m_type(addonType == ADDON_UNKNOWN ? addonInfo->MainType() : addonType) -{ - m_userSettingsPath = URIUtils::AddFileToFolder(m_profilePath, "settings.xml"); + : m_addonInfo(addonInfo) + , m_userSettingsPath() + , m_loadSettingsFailed(false) + , m_hasUserSettings(false) + , m_settings(nullptr) + , m_type(addonType == ADDON_UNKNOWN ? addonInfo->MainType() : addonType) +{ + m_userSettingsPath = URIUtils::AddFileToFolder(m_addonInfo->Profile(), "settings.xml"); } /** diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h index 1627d675558dc..74a7f8914cd63 100644 --- a/xbmc/addons/Addon.h +++ b/xbmc/addons/Addon.h @@ -89,7 +89,7 @@ class CAddon : public IAddon * ~~~~~~~~~~~~~ * */ - const CAddonType* Type(TYPE type) const { return m_addonInfo->Type(type); } + const CAddonType* Type(TYPE type) const override { return m_addonInfo->Type(type); } std::string ID() const override{ return m_addonInfo->ID(); } std::string Name() const override { return m_addonInfo->Name(); } @@ -100,7 +100,7 @@ class CAddon : public IAddon std::string Summary() const override { return m_addonInfo->Summary(); } std::string Description() const override { return m_addonInfo->Description(); } std::string Path() const override { return m_addonInfo->Path(); } - std::string Profile() const override { return m_profilePath; } + std::string Profile() const override { return m_addonInfo->Profile(); } std::string LibPath() const override; std::string Author() const override { return m_addonInfo->Author(); } std::string ChangeLog() const override { return m_addonInfo->ChangeLog(); } @@ -301,7 +301,6 @@ class CAddon : public IAddon bool m_loadSettingsFailed; bool m_hasUserSettings; - std::string m_profilePath; mutable std::shared_ptr m_settings; const TYPE m_type; }; diff --git a/xbmc/addons/AddonBuilder.cpp b/xbmc/addons/AddonBuilder.cpp index 39dd3c9eed8e2..c4b04f798573f 100644 --- a/xbmc/addons/AddonBuilder.cpp +++ b/xbmc/addons/AddonBuilder.cpp @@ -55,7 +55,7 @@ AddonPtr CAddonBuilder::Generate(const AddonInfoPtr& info, TYPE type) { // built in audio encoder if (StringUtils::StartsWithNoCase(info->ID(), "audioencoder.kodi.builtin.")) - return std::make_shared(info, type); + return std::make_shared(info, type); } switch (type) @@ -69,7 +69,7 @@ AddonPtr CAddonBuilder::Generate(const AddonInfoPtr& info, TYPE type) case ADDON_VFS: case ADDON_VIZ: case ADDON_SCREENSAVER: - return std::make_shared(info, type); + return std::make_shared(info, type); case ADDON_GAMEDLL: return std::make_shared(info); case ADDON_PLUGIN: diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp index cf304ccb6e2f2..44e44eeda0e0d 100644 --- a/xbmc/addons/AddonDatabase.cpp +++ b/xbmc/addons/AddonDatabase.cpp @@ -46,6 +46,8 @@ std::string CAddonDatabaseSerializer::SerializeMetadata(const CAddonInfo& addon) for (const auto& item : addon.Screenshots()) variant["screenshots"].push_back(item); + variant["language"] = addon.Type(addon.MainType())->LanguageName(); + variant["extensions"] = CVariant(CVariant::VariantTypeArray); variant["extensions"].push_back(SerializeExtensions(*addon.Type(addon.MainType()))); @@ -135,9 +137,10 @@ void CAddonDatabaseSerializer::DeserializeMetadata(const std::string& document, screenshots.push_back(it->asString()); builder.SetScreenshots(std::move(screenshots)); - CAddonType addonType; + CAddonType addonType(ADDON_UNKNOWN, AddonLanguage::Unknown); DeserializeExtensions(variant["extensions"][0], addonType); - addonType.m_type = CAddonInfo::TranslateType(addonType.m_point); + addonType.SetType(CAddonInfo::TranslateType(addonType.m_point)); + addonType.SetLanguage(variant["language"].asString()); builder.SetExtensions(std::move(addonType)); { diff --git a/xbmc/addons/AddonProvider.h b/xbmc/addons/AddonProvider.h index 2a1e7af3fb79e..08130f94b9039 100644 --- a/xbmc/addons/AddonProvider.h +++ b/xbmc/addons/AddonProvider.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon_base.h" #include diff --git a/xbmc/addons/AddonStatusHandler.h b/xbmc/addons/AddonStatusHandler.h index 77751ad96f27f..f0a1b232aac67 100644 --- a/xbmc/addons/AddonStatusHandler.h +++ b/xbmc/addons/AddonStatusHandler.h @@ -9,7 +9,7 @@ #pragma once #include "IAddon.h" -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon_base.h" #include "threads/CriticalSection.h" #include "threads/Thread.h" diff --git a/xbmc/addons/AudioDecoder.cpp b/xbmc/addons/AudioDecoder.cpp index 2f024972145c5..4d8629de3caa7 100644 --- a/xbmc/addons/AudioDecoder.cpp +++ b/xbmc/addons/AudioDecoder.cpp @@ -7,62 +7,329 @@ #include "AudioDecoder.h" -#include "addons/interfaces/AudioEngine.h" +// Devkit API interface +#include "interface/api/audio_engine.h" + +// Kodi +#include "FileItem.h" +#include "ServiceBroker.h" +#include "addons/AddonManager.h" #include "cores/AudioEngine/Utils/AEUtil.h" +#include "filesystem/File.h" +#include "guilib/LocalizeStrings.h" #include "music/tags/MusicInfoTag.h" #include "music/tags/TagLoaderTagLib.h" +#include "utils/Mime.h" +#include "utils/URIUtils.h" #include "utils/log.h" +using namespace KODI::ADDONS; +using namespace KODI::ADDONS::INTERFACE; + namespace ADDON { +CAudioDecoderSupportList::CAudioDecoderSupportList() +{ + CServiceBroker::GetAddonMgr().Events().Subscribe(this, &CAudioDecoderSupportList::OnEvent); + + // Load all available audio decoder addons during Kodi start + std::vector> addonInfos; + CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + for (const auto& addonInfo : addonInfos) + { + SupportValues values; + if (ScanAddonProperties(addonInfo, values)) + m_supportedList.emplace_back(values); + } +} + +CAudioDecoderSupportList::~CAudioDecoderSupportList() +{ + CServiceBroker::GetAddonMgr().Events().Unsubscribe(this); +} + +void CAudioDecoderSupportList::OnEvent(const AddonEvent& event) +{ + if (typeid(event) == typeid(AddonEvents::Enabled) || + typeid(event) == typeid(AddonEvents::Disabled) || + typeid(event) == typeid(AddonEvents::ReInstalled)) + { + if (CServiceBroker::GetAddonMgr().HasType(event.id, ADDON_AUDIODECODER)) + Update(event.id); + } + else if (typeid(event) == typeid(AddonEvents::UnInstalled)) + { + Update(event.id); + } +} + +void CAudioDecoderSupportList::Update(const std::string& id) +{ + // Stop used instance if present, otherwise the new becomes created on already created addon base one. + { + CSingleLock lock(m_critSection); + + const auto& itAddon = + std::find_if(m_supportedList.begin(), m_supportedList.end(), + [&id](const SupportValues& addon) { return addon.m_addonInfo->ID() == id; }); + + if (itAddon != m_supportedList.end()) + { + m_supportedList.erase(itAddon); + } + } + + // Create and init the new audio decoder addon instance + std::shared_ptr addonInfo = + CServiceBroker::GetAddonMgr().GetAddonInfo(id, ADDON_AUDIODECODER); + if (addonInfo && !CServiceBroker::GetAddonMgr().IsAddonDisabled(id)) + { + SupportValues values; + if (ScanAddonProperties(addonInfo, values)) + { + CSingleLock lock(m_critSection); + m_supportedList.emplace_back(values); + } + } +} + +bool CAudioDecoderSupportList::ScanAddonProperties( + const std::shared_ptr& addonInfo, SupportValues& values) +{ + values.m_addonInfo = addonInfo; + values.m_codecName = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@name").asString(); + values.m_hasTags = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@tags").asBoolean(); + values.m_hasTracks = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@tracks").asBoolean(); + + const auto support = addonInfo->Type(ADDON_AUDIODECODER)->GetElement("support"); + if (support) + { + // Scan here about complete defined xml groups with description and maybe icon + // e.g. + // `` + // ` 30246` + // `` + for (auto i : support->GetElements()) + { + std::string name = i.second.GetValue("@name").asString(); + if (name.empty()) + continue; + + const int description = i.second.GetValue("description").asInteger(); + const std::string icon = + !i.second.GetValue("icon").empty() + ? URIUtils::AddFileToFolder(addonInfo->Path(), i.second.GetValue("icon").asString()) + : ""; + + if (i.first == "extension") + { + if (name[0] != '.') + name.insert(name.begin(), '.'); + values.m_supportedExtensions.emplace(name, SupportValue(description, icon)); + } + else if (i.first == "mimetype") + values.m_supportedMimetypes.emplace(name, SupportValue(description, icon)); + } + + // Scan here about small defined xml groups without anything + // e.g. `` + for (const auto& i : support->GetValues()) + { + for (const auto& j : i.second) + { + std::string name = j.second.asString(); + if (j.first == "extension@name") + { + if (name[0] != '.') + name.insert(name.begin(), '.'); + values.m_supportedExtensions.emplace(name, SupportValue(-1, "")); + } + else if (j.first == "mimetype@name") + values.m_supportedMimetypes.emplace(name, SupportValue(-1, "")); + } + } + } + + // Check addons support tracks, if yes add extension about related entry names + // By them addon no more need to add itself on his addon.xml + if (values.m_hasTracks) + values.m_supportedExtensions.emplace( + "." + values.m_codecName + KODI_ADDON_AUDIODECODER_TRACK_EXT, SupportValue(-1, "")); + + return true; +} + +bool CAudioDecoderSupportList::GetSupportedAddonInfos(std::vector& addonInfos, + FilterSelect select) +{ + addonInfos.clear(); + + CSingleLock lock(m_critSection); + + for (const auto& entry : m_supportedList) + { + if (select == FilterSelect::all || (select == FilterSelect::hasTags && entry.m_hasTags) || + (select == FilterSelect::hasTracks && entry.m_hasTracks)) + addonInfos.emplace_back(entry); + } + + return !addonInfos.empty(); +} + +bool CAudioDecoderSupportList::IsExtensionSupported(const std::string& ext) +{ + CSingleLock lock(m_critSection); + + for (const auto& entry : m_supportedList) + { + auto it = std::find_if( + entry.m_supportedExtensions.begin(), entry.m_supportedExtensions.end(), + [ext](const std::pair& v) { return v.first == ext; }); + if (it != entry.m_supportedExtensions.end()) + return true; + } + + return false; +} + +bool CAudioDecoderSupportList::GetExtensionSupportedAddonInfos( + const std::string& ext, + std::vector>& addonInfos, + FilterSelect select) +{ + addonInfos.clear(); + + CSingleLock lock(m_critSection); + + for (const auto& entry : m_supportedList) + { + auto it = std::find_if( + entry.m_supportedExtensions.begin(), entry.m_supportedExtensions.end(), + [ext](const std::pair& v) { return v.first == ext; }); + if (it != entry.m_supportedExtensions.end() && + (select == FilterSelect::all || (select == FilterSelect::hasTags && entry.m_hasTags) || + (select == FilterSelect::hasTracks && entry.m_hasTracks))) + addonInfos.emplace_back(entry.m_addonInfo); + } + + return !addonInfos.empty(); +} + +bool CAudioDecoderSupportList::IsMimetypeSupported(const std::string& mimetype) +{ + CSingleLock lock(m_critSection); + + for (const auto& entry : m_supportedList) + { + auto it = std::find_if( + entry.m_supportedMimetypes.begin(), entry.m_supportedMimetypes.end(), + [mimetype](const std::pair& v) { return v.first == mimetype; }); + if (it != entry.m_supportedMimetypes.end()) + return true; + } + + return false; +} + +bool CAudioDecoderSupportList::GetMimetypeSupportedAddonInfos( + const std::string& mimetype, + std::vector>& addonInfos, + FilterSelect select) +{ + addonInfos.clear(); + + CSingleLock lock(m_critSection); + + for (const auto& entry : m_supportedList) + { + auto it = std::find_if( + entry.m_supportedMimetypes.begin(), entry.m_supportedMimetypes.end(), + [mimetype](const std::pair& v) { return v.first == mimetype; }); + if (it != entry.m_supportedMimetypes.end() && + (select == FilterSelect::all || (select == FilterSelect::hasTags && entry.m_hasTags) || + (select == FilterSelect::hasTracks && entry.m_hasTracks))) + addonInfos.emplace_back(entry.m_addonInfo); + } + + return !addonInfos.empty(); +} + +bool CAudioDecoderSupportList::GetSupportedPartsList(const std::string& addonId, + std::vector& list) +{ + auto it = + std::find_if(m_supportedList.begin(), m_supportedList.end(), + [addonId](const SupportValues& v) { return v.m_addonInfo->ID() == addonId; }); + if (it == m_supportedList.end()) + return false; + + for (const auto& entry : it->m_supportedExtensions) + { + AddonSupportEntry supportEntry; + supportEntry.m_type = AddonSupportType::Extension; + supportEntry.m_name = entry.first; + supportEntry.m_description = + g_localizeStrings.GetAddonString(addonId, entry.second.m_description); + supportEntry.m_icon = entry.second.m_icon; + list.emplace_back(supportEntry); + } + for (const auto& entry : it->m_supportedMimetypes) + { + AddonSupportEntry supportEntry; + supportEntry.m_type = AddonSupportType::Mimetype; + supportEntry.m_name = entry.first; + supportEntry.m_description = + g_localizeStrings.GetAddonString(addonId, entry.second.m_description); + supportEntry.m_icon = entry.second.m_icon; + list.emplace_back(supportEntry); + } + + return true; +} + CAudioDecoder::CAudioDecoder(const AddonInfoPtr& addonInfo) : IAddonInstanceHandler(ADDON_INSTANCE_AUDIODECODER, addonInfo) { m_CodecName = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@name").asString(); - m_strExt = m_CodecName + "stream"; + m_strExt = m_CodecName + KODI_ADDON_AUDIODECODER_TRACK_EXT; m_hasTags = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@tags").asBoolean(); - - // Create all interface parts independent to make API changes easier if - // something is added - m_struct.props = new AddonProps_AudioDecoder(); - m_struct.toKodi = new AddonToKodiFuncTable_AudioDecoder(); - m_struct.toAddon = new KodiToAddonFuncTable_AudioDecoder(); } CAudioDecoder::~CAudioDecoder() { - DestroyInstance(); - - delete m_struct.props; - delete m_struct.toKodi; - delete m_struct.toAddon; + DestroyInstance(m_addonInstance); } bool CAudioDecoder::CreateDecoder() { - m_struct.toKodi->kodiInstance = this; - return CreateInstance(&m_struct) == ADDON_STATUS_OK; + return CreateInstance(this, m_addonInstance) == ADDON_STATUS_OK; } -bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) +bool CAudioDecoder::CanOperateFile(const std::string& filename) { - if (!m_struct.toAddon->init) + // Create in case not available, possible as this done by IAddonSupportCheck + if ((!m_addonInstance && !CreateDecoder())) return false; + return m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_can_operate_file_v1(m_addonInstance, filename.c_str()); +} + +bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) +{ /// for replaygain /// @todo About audio decoder in most cases Kodi's one not work, add fallback /// to use addon if this fails. Need API change about addons music info tag! CTagLoaderTagLib tag; - tag.Load(file.GetDynPath(), XFILE::CMusicFileDirectory::m_tag, NULL); + tag.Load(file.GetDynPath(), XFILE::CMusicFileDirectory::m_tag, nullptr); int channels = -1; int sampleRate = -1; AudioEngineDataFormat addonFormat = AUDIOENGINE_FMT_INVALID; - - bool ret = m_struct.toAddon->init(&m_struct, file.GetDynPath().c_str(), filecache, &channels, - &sampleRate, &m_bitsPerSample, &m_TotalTime, &m_bitRate, - &addonFormat, &m_channel); + AudioEngineChannel channelList[AUDIOENGINE_CH_MAX] = {AUDIOENGINE_CH_NULL}; + bool ret = m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_init_v1( + m_addonInstance, file.GetDynPath().c_str(), filecache, &channels, &sampleRate, &m_bitsPerSample, + &m_TotalTime, &m_bitRate, &addonFormat, channelList); if (ret) { if (channels <= 0 || sampleRate <= 0 || addonFormat == AUDIOENGINE_FMT_INVALID) @@ -73,16 +340,16 @@ bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) return false; } - m_format.m_dataFormat = Interface_AudioEngine::TranslateAEFormatToKodi(addonFormat); + m_format.m_dataFormat = TranslateAEFormatToKodi(addonFormat); m_format.m_sampleRate = sampleRate; - if (m_channel) + if (channelList[0] != AUDIOENGINE_CH_NULL) { CAEChannelInfo layout; - for (unsigned int ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) + for (const auto& channel : channelList) { - if (m_channel[ch] == AUDIOENGINE_CH_NULL) + if (channel == AUDIOENGINE_CH_NULL) break; - layout += Interface_AudioEngine::TranslateAEChannelToKodi(m_channel[ch]); + layout += TranslateAEChannelToKodi(channel); } m_format.m_channelLayout = layout; @@ -94,20 +361,14 @@ bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) return ret; } -int CAudioDecoder::ReadPCM(uint8_t* buffer, int size, int* actualsize) +int CAudioDecoder::ReadPCM(uint8_t* buffer, size_t size, size_t* actualsize) { - if (!m_struct.toAddon->read_pcm) - return 0; - - return m_struct.toAddon->read_pcm(&m_struct, buffer, size, actualsize); + return m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_read_pcm_v1(m_addonInstance, buffer, size, actualsize); } bool CAudioDecoder::Seek(int64_t time) { - if (!m_struct.toAddon->seek) - return false; - - m_struct.toAddon->seek(&m_struct, time); + m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_seek_v1(m_addonInstance, time); return true; } @@ -115,45 +376,107 @@ bool CAudioDecoder::Load(const std::string& fileName, MUSIC_INFO::CMusicInfoTag& tag, EmbeddedArt* art) { - if (!m_struct.toAddon->read_tag) - return false; - - AUDIO_DECODER_INFO_TAG* cTag = new AUDIO_DECODER_INFO_TAG(); // allocate by his size - bool ret = m_struct.toAddon->read_tag(&m_struct, fileName.c_str(), cTag); + KODI_ADDON_AUDIODECODER_INFO_TAG ifcTag = {}; + bool ret = m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_read_tag_v1(m_addonInstance, fileName.c_str(), &ifcTag); if (ret) { - tag.SetTitle(cTag->title); - tag.SetArtist(cTag->artist); - tag.SetAlbum(cTag->album); - tag.SetAlbumArtist(cTag->album_artist); - tag.SetType(cTag->media_type); - tag.SetGenre(cTag->genre); - tag.SetDuration(cTag->duration); - tag.SetTrackNumber(cTag->track); - tag.SetDiscNumber(cTag->disc); - tag.SetDiscSubtitle(cTag->disc_subtitle); - tag.SetTotalDiscs(cTag->disc_total); - tag.SetReleaseDate(cTag->release_date); - tag.SetLyrics(cTag->lyrics); - tag.SetSampleRate(cTag->samplerate); - tag.SetNoOfChannels(cTag->channels); - tag.SetBitRate(cTag->bitrate); - tag.SetComment(cTag->comment); + if (ifcTag.title) + { + tag.SetTitle(ifcTag.title); + free(ifcTag.title); + } + if (ifcTag.artist) + { + tag.SetArtist(ifcTag.artist); + free(ifcTag.artist); + } + if (ifcTag.album) + { + tag.SetAlbum(ifcTag.album); + free(ifcTag.album); + } + if (ifcTag.album_artist) + { + tag.SetAlbumArtist(ifcTag.album_artist); + free(ifcTag.album_artist); + } + if (ifcTag.media_type) + { + tag.SetType(ifcTag.media_type); + free(ifcTag.media_type); + } + if (ifcTag.genre) + { + tag.SetGenre(ifcTag.genre); + free(ifcTag.genre); + } + tag.SetDuration(ifcTag.duration); + tag.SetTrackNumber(ifcTag.track); + tag.SetDiscNumber(ifcTag.disc); + if (ifcTag.disc_subtitle) + { + tag.SetDiscSubtitle(ifcTag.disc_subtitle); + free(ifcTag.disc_subtitle); + } + tag.SetTotalDiscs(ifcTag.disc_total); + if (ifcTag.release_date) + { + tag.SetReleaseDate(ifcTag.release_date); + free(ifcTag.release_date); + } + if (ifcTag.lyrics) + { + tag.SetLyrics(ifcTag.lyrics); + free(ifcTag.lyrics); + } + tag.SetSampleRate(ifcTag.samplerate); + tag.SetNoOfChannels(ifcTag.channels); + tag.SetBitRate(ifcTag.bitrate); + if (ifcTag.comment) + { + tag.SetComment(ifcTag.comment); + free(ifcTag.comment); + } + + if (ifcTag.cover_art_path) + { + const std::string mimetype = + CMime::GetMimeType(URIUtils::GetExtension(ifcTag.cover_art_path)); + if (StringUtils::StartsWith(mimetype, "image/")) + { + XFILE::CFile file; + std::vector buf; + + if (file.LoadFile(ifcTag.cover_art_path, buf) > 0) + { + tag.SetCoverArtInfo(buf.size(), mimetype); + if (art) + art->Set(reinterpret_cast(buf.data()), buf.size(), mimetype); + } + } + free(ifcTag.cover_art_path); + } +// else if (ifcTag.cover_art_mem_mimetype && ifcTag.cover_art_mem && ifcTag.cover_art_mem_size > 0) +// { +// tag.SetCoverArtInfo(ifcTag.cover_art_mem_size, ifcTag.cover_art_mem_mimetype); +// if (art) +// art->Set(ifcTag.cover_art_mem, ifcTag.cover_art_mem_size, ifcTag.cover_art_mem_mimetype); +// } +// +// if (ifcTag.cover_art_mem_mimetype) +// free(ifcTag.cover_art_mem_mimetype); +// if (ifcTag.cover_art_mem) +// free(ifcTag.cover_art_mem); + tag.SetLoaded(true); } - delete cTag; - return ret; } int CAudioDecoder::GetTrackCount(const std::string& strPath) { - if (!m_struct.toAddon->track_count) - return 0; - - int result = m_struct.toAddon->track_count(&m_struct, strPath.c_str()); - + int result = m_ifc->kodi_addoninstance_audiodecoder_h->kodi_addon_audiodecoder_track_count_v1(m_addonInstance, strPath.c_str()); if (result > 1) { if (m_hasTags) diff --git a/xbmc/addons/AudioDecoder.h b/xbmc/addons/AudioDecoder.h index b9a82edd6cc62..8f007e75af0fe 100644 --- a/xbmc/addons/AudioDecoder.h +++ b/xbmc/addons/AudioDecoder.h @@ -7,8 +7,13 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h" +// Devkit API interface +#include "interface/api/addon-instance/audiodecoder.h" + +#include "addons/AddonEvents.h" +#include "addons/IAddonSupportCheck.h" +#include "addons/IAddonSupportList.h" +#include "addons/interface/InstanceHandler.h" #include "cores/paplayer/ICodec.h" #include "filesystem/MusicFileDirectory.h" #include "music/tags/ImusicInfoTagLoader.h" @@ -17,12 +22,167 @@ namespace MUSIC_INFO { class CMusicInfoTag; class EmbeddedArt; -} +} // namespace MUSIC_INFO namespace ADDON { -class CAudioDecoder : public IAddonInstanceHandler, +/*! + * @brief Class to manage all available and activated audio decoder add-ons and + * to release their types to the outside for selection. + * + * @note It may also make sense in the future to expand this class and design it + * globally in Kodi so that other addons can also be managed with it (all which + * have mimetypes and file extensions, e.g. vfs, audioencoder). + */ +class CAudioDecoderSupportList : public KODI::ADDONS::IAddonSupportList +{ +public: + CAudioDecoderSupportList(); + ~CAudioDecoderSupportList(); + + /*! + * @brief Filter selection values. + */ + enum class FilterSelect + { + /*! To select all available */ + all, + + /*! To select only them where support tags */ + hasTags, + + /*! Get only where support tracks within */ + hasTracks + }; + + /*! + * @brief Structure to store information about supported part. + */ + struct SupportValue + { + SupportValue(int description, std::string icon) + : m_description(description), m_icon(icon) + { + } + + // Description text about supported part + int m_description; + + // Own by addon defined icon path + std::string m_icon; + }; + + /*! + * @brief Structure to store available data for related addon. + */ + struct SupportValues + { + // Related addon info class + std::shared_ptr m_addonInfo; + + // Addon his own codec identification name + std::string m_codecName; + + // If as true support addons own song information tags + bool m_hasTags{false}; + + // To know addon includes several tracks inside one file, if set to true + bool m_hasTracks{false}; + + // List of supported file extensions by addon + // First: Extension name + // Second: With @ref SupportValue defined content + std::map m_supportedExtensions; + + // List of supported mimetypes by addon + // First: Mimetype name + // Second: With @ref SupportValue defined content + std::map m_supportedMimetypes; + }; + + /*! + * @brief Get list of all by audiodecoder supported parts. + * + * Thought to use on planned new window about management about supported + * extensions and mimetypes in Kodi and to allow edit by user to enable or + * disable corresponding parts. + * + * This function is also used to notify Kodi supported formats and to allow + * playback. + * + * @param[out] addonInfos List of the available types listed for the respective add-on + * @param[in] select To filter the listed information by type + * @return True if successfully done + */ + bool GetSupportedAddonInfos(std::vector& addonInfos, FilterSelect select); + + /*! + * @brief To query the desired file extension is supported in it. + * + * @param[in] ext Extension name to check + * @return True if within supported, false if not + */ + bool IsExtensionSupported(const std::string& ext); + + /*! + * @brief To get a list of all compatible audio decoder add-ons for the file extension. + * + * @param[in] ext Extension name to check + * @param[out] addonInfos List of @ref ADDON::CAddonInfo where support related extension + * @param[in] select To filter the listed information by type + * @return True if something found, false if not + */ + bool GetExtensionSupportedAddonInfos(const std::string& ext, + std::vector>& addonInfos, + FilterSelect select); + + /*! + * @brief To query the desired file mimetype is supported in it. + * + * @param[in] mimetypeM imetype name to check + * @return True if within supported, false if not + */ + bool IsMimetypeSupported(const std::string& mimetype); + + /*! + * @brief To get a list of all compatible audio decoder add-ons for the mimetype. + * + * @param[in] mimetype Mimetype name to check + * @param[out] addonInfos List of @ref ADDON::CAddonInfo where support related mimetype + * @param[in] select To filter the listed information by type + * @return True if something found, false if not + */ + bool GetMimetypeSupportedAddonInfos(const std::string& mimetype, + std::vector>& addonInfos, + FilterSelect select); + + /*! + * @brief To give all file extensions and MIME types supported by the addon. + * + * @param[in] addonId Identifier about wanted addon + * @param[out] list List of all supported parts on selected addon + * @return True if successfully done, false otherwise + * + * @sa KODI::ADDONS::IAddonSupportList + */ + bool GetSupportedPartsList(const std::string& addonId, + std::vector& list) override; + +protected: + void Update(const std::string& id); + void OnEvent(const AddonEvent& event); + + static bool ScanAddonProperties(const std::shared_ptr& addonInfo, + SupportValues& values); + + CCriticalSection m_critSection; + + std::vector m_supportedList; +}; + +class CAudioDecoder : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler, + public KODI::ADDONS::IAddonSupportCheck, public ICodec, public MUSIC_INFO::IMusicInfoTagLoader, public XFILE::CMusicFileDirectory @@ -34,38 +194,18 @@ class CAudioDecoder : public IAddonInstanceHandler, // Things that MUST be supplied by the child classes bool CreateDecoder(); bool Init(const CFileItem& file, unsigned int filecache) override; - int ReadPCM(uint8_t* buffer, int size, int* actualsize) override; + int ReadPCM(uint8_t* buffer, size_t size, size_t* actualsize) override; bool Seek(int64_t time) override; bool CanInit() override { return true; } bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, EmbeddedArt* art = nullptr) override; int GetTrackCount(const std::string& strPath) override; - - static inline std::string GetExtensions(const AddonInfoPtr& addonInfo) - { - return addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@extension").asString(); - } - - static inline std::string GetMimetypes(const AddonInfoPtr& addonInfo) - { - return addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@mimetype").asString(); - } - - static inline bool HasTags(const AddonInfoPtr& addonInfo) - { - return addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@tags").asBoolean(); - } - - static inline bool HasTracks(const AddonInfoPtr& addonInfo) - { - return addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@tracks").asBoolean(); - } + bool CanOperateFile(const std::string& filename) override; private: - const AudioEngineChannel* m_channel; - AddonInstance_AudioDecoder m_struct; + KODI_HANDLE m_addonInstance{nullptr}; bool m_hasTags; }; -} /*namespace ADDON*/ +} /* namespace ADDON */ diff --git a/xbmc/addons/AudioEncoder.cpp b/xbmc/addons/AudioEncoder.cpp index 85ba75f4a7b61..f0b681d1a8216 100644 --- a/xbmc/addons/AudioEncoder.cpp +++ b/xbmc/addons/AudioEncoder.cpp @@ -10,52 +10,59 @@ namespace ADDON { +using namespace KODI::ADDONS::INTERFACE; + CAudioEncoder::CAudioEncoder(const AddonInfoPtr& addonInfo) : IAddonInstanceHandler(ADDON_INSTANCE_AUDIOENCODER, addonInfo) { - // Create "C" interface structures, used as own parts to prevent API problems on update - m_struct.props = new AddonProps_AudioEncoder(); - m_struct.toAddon = new KodiToAddonFuncTable_AudioEncoder(); - m_struct.toKodi = new AddonToKodiFuncTable_AudioEncoder(); } -CAudioEncoder::~CAudioEncoder() +bool CAudioEncoder::Init(AudioEncoderCB& callbacks) { - // Delete "C" interface structures - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; -} + m_callbacks = callbacks; -bool CAudioEncoder::Init(AddonToKodiFuncTable_AudioEncoder& callbacks) -{ - *m_struct.toKodi = callbacks; - if (CreateInstance(&m_struct) != ADDON_STATUS_OK || !m_struct.toAddon->start) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) return false; - return m_struct.toAddon->start(&m_struct, m_iInChannels, m_iInSampleRate, m_iInBitsPerSample, - m_strTitle.c_str(), m_strArtist.c_str(), m_strAlbumArtist.c_str(), - m_strAlbum.c_str(), m_strYear.c_str(), m_strTrack.c_str(), - m_strGenre.c_str(), m_strComment.c_str(), m_iTrackLength); + AUDIOENCODER_INFO_TAG tag; + tag.channels = m_iInChannels; + tag.samplerate = m_iInSampleRate; + tag.bits_per_sample = m_iInBitsPerSample; + tag.track_length = m_iTrackLength; + tag.title = m_strTitle.c_str(); + tag.artist = m_strArtist.c_str(); + tag.album_artist = m_strAlbumArtist.c_str(); + tag.album = m_strAlbum.c_str(); + tag.release_date = m_strYear.c_str(); + tag.track = atoi(m_strTrack.c_str()); + tag.genre = m_strGenre.c_str(); + tag.comment = m_strComment.c_str(); + + return m_ifc->kodi_addoninstance_audioencoder_h->kodi_addon_audioencoder_start_v1(m_addonInstance, &tag); } int CAudioEncoder::Encode(int nNumBytesRead, uint8_t* pbtStream) { - if (m_struct.toAddon->encode) - return m_struct.toAddon->encode(&m_struct, nNumBytesRead, pbtStream); - return 0; + return m_ifc->kodi_addoninstance_audioencoder_h->kodi_addon_audioencoder_encode_v1(m_addonInstance, pbtStream, nNumBytesRead); } bool CAudioEncoder::Close() { - bool ret = false; - if (m_struct.toAddon->finish) - ret = m_struct.toAddon->finish(&m_struct); + bool ret = m_ifc->kodi_addoninstance_audioencoder_h->kodi_addon_audioencoder_finish_v1(m_addonInstance); - DestroyInstance(); + DestroyInstance(m_addonInstance); return ret; } -} /*namespace ADDON*/ +int CAudioEncoder::Write(const uint8_t* data, int len) +{ + return m_callbacks.write(m_callbacks.kodiInstance, data, len); +} + +int64_t CAudioEncoder::Seek(int64_t pos, int whence) +{ + return m_callbacks.seek(m_callbacks.kodiInstance, pos, whence); +} +} /* namespace ADDON */ diff --git a/xbmc/addons/AudioEncoder.h b/xbmc/addons/AudioEncoder.h index 42d6c491bb1d5..5d90056526025 100644 --- a/xbmc/addons/AudioEncoder.h +++ b/xbmc/addons/AudioEncoder.h @@ -7,25 +7,30 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" +#include "interface/api/addon-instance/audioencoder.h" +#include "interface/InstanceHandler.h" #include "cdrip/IEncoder.h" namespace ADDON { - class CAudioEncoder : public IEncoder, public IAddonInstanceHandler + class CAudioEncoder : public IEncoder, public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: explicit CAudioEncoder(const AddonInfoPtr& addonInfo); - ~CAudioEncoder() override; + ~CAudioEncoder() override = default; // Child functions related to IEncoder - bool Init(AddonToKodiFuncTable_AudioEncoder& callbacks) override; + bool Init(AudioEncoderCB& callbacks) override; int Encode(int nNumBytesRead, uint8_t* pbtStream) override; bool Close() override; + int Write(const uint8_t* data, int len); /*---AUTO_GEN_PARSE---*/ + int64_t Seek(int64_t pos, int whence); /*---AUTO_GEN_PARSE---*/ + private: - AddonInstance_AudioEncoder m_struct; + KODI_HANDLE m_addonInstance; + AudioEncoderCB m_callbacks; }; -} /*namespace ADDON*/ +} /* namespace ADDON */ diff --git a/xbmc/addons/CMakeLists.txt b/xbmc/addons/CMakeLists.txt index 404896399de25..44df8c3f8cc3f 100644 --- a/xbmc/addons/CMakeLists.txt +++ b/xbmc/addons/CMakeLists.txt @@ -53,6 +53,7 @@ set(HEADERS Addon.h FontResource.h GameResource.h IAddon.h + IAddonSupportCheck.h ImageDecoder.h ImageResource.h LanguageResource.h diff --git a/xbmc/addons/IAddon.h b/xbmc/addons/IAddon.h index ee54f7a07d922..f0a9d5a9f4018 100644 --- a/xbmc/addons/IAddon.h +++ b/xbmc/addons/IAddon.h @@ -37,6 +37,7 @@ namespace ADDON virtual TYPE Type() const =0; virtual bool HasType(TYPE type) const = 0; virtual bool HasMainType(TYPE type) const = 0; + virtual const CAddonType* Type(TYPE type) const = 0; virtual std::string ID() const =0; virtual std::string Name() const =0; virtual bool IsInUse() const =0; diff --git a/xbmc/addons/IAddonSupportCheck.h b/xbmc/addons/IAddonSupportCheck.h new file mode 100644 index 0000000000000..a8c8f0b77c3e1 --- /dev/null +++ b/xbmc/addons/IAddonSupportCheck.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include + +namespace KODI +{ +namespace ADDONS +{ + +/*! + * @brief Parent class to ask addons for support. + * + * This one can be used as a parent on the respective Kodi-sided addon class, + * this makes it easier to query for the desired support without using the + * class's own function definition. + */ +class IAddonSupportCheck +{ +public: + IAddonSupportCheck() = default; + virtual ~IAddonSupportCheck() = default; + + /*! + * @brief Function to query the respective add-ons used for the support of + * the desired file. + * + * @param[in] filename File which is queried for addon support + * @return True if addon supports the desired file, false if not + * + * @note Is set here with true as default and not with "= 0" in order to have + * class expandable and perhaps to be able to insert other query functions in + * the future. + */ + virtual bool CanOperateFile(const std::string& filename) { return true; } +}; + +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/IAddonSupportList.h b/xbmc/addons/IAddonSupportList.h new file mode 100644 index 0000000000000..f8f712430966b --- /dev/null +++ b/xbmc/addons/IAddonSupportList.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include +#include + +namespace KODI +{ +namespace ADDONS +{ + +/*! + * @brief To identify related type about entry + */ +enum class AddonSupportType +{ + /* To set if type relates to a file extension */ + Extension, + + /* Used if relates to a Internet Media Type (MIME-Type) */ + Mimetype +}; + +/*! + * @brief Information structure with which a supported format of an addon can + * be stored. + */ +struct AddonSupportEntry +{ + /* Type what this is about */ + AddonSupportType m_type; + + /* The name used for processing */ + std::string m_name; + + /* User-friendly description of the name type stored here. */ + std::string m_description; + + /* Path to use own icon about. */ + std::string m_icon; +}; + +/*! + * @brief Parent class to manage all available mimetypes and file extensions of + * the respective add-on and its types. + * + * This class should be integrated in the respective add-on type manager and in + * order to get an overview of all that are intended for file processing. + * + * @todo Extend this class with database usage and support to activate / + * deactivate the respective formats and thus to override add-ons if several + * support the same. + */ +class IAddonSupportList +{ +public: + IAddonSupportList() = default; + virtual ~IAddonSupportList() = default; + + /*! + * @brief To give all file extensions and MIME types supported by the addon. + * + * @param[in] addonId Identifier about wanted addon + * @param[out] list List of all supported parts on selected addon + * @return True if successfully done, false otherwise + */ + virtual bool GetSupportedPartsList(const std::string& addonId, + std::vector& list) = 0; +}; + +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/ImageDecoder.cpp b/xbmc/addons/ImageDecoder.cpp index 770b7a5345576..f3420ba1d8a3f 100644 --- a/xbmc/addons/ImageDecoder.cpp +++ b/xbmc/addons/ImageDecoder.cpp @@ -7,9 +7,13 @@ #include "ImageDecoder.h" +// Devkit API interface +#include "interface/api/addon-instance/imagedecoder.h" + +// Kodi #include "guilib/TextureFormats.h" -static const std::map KodiToAddonFormat = { +static const std::map KodiToAddonFormat = { {XB_FMT_A8R8G8B8, ADDON_IMG_FMT_A8R8G8B8}, {XB_FMT_A8, ADDON_IMG_FMT_A8}, {XB_FMT_RGBA8, ADDON_IMG_FMT_RGBA8}, @@ -18,59 +22,59 @@ static const std::map KodiToAddonFormat = { namespace ADDON { -CImageDecoder::CImageDecoder(const AddonInfoPtr& addonInfo) - : IAddonInstanceHandler(ADDON_INSTANCE_IMAGEDECODER, addonInfo) +CImageDecoder::CImageDecoder(const AddonInfoPtr& addonInfo, const std::string& mimetype) + : IAddonInstanceHandler(ADDON_INSTANCE_IMAGEDECODER, addonInfo), + m_mimetype(mimetype) { - // Create all interface parts independent to make API changes easier if - // something is added - m_struct.props = new AddonProps_ImageDecoder(); - m_struct.toKodi = new AddonToKodiFuncTable_ImageDecoder(); - m_struct.toAddon = new KodiToAddonFuncTable_ImageDecoder(); } CImageDecoder::~CImageDecoder() { - DestroyInstance(); - - delete m_struct.props; - delete m_struct.toKodi; - delete m_struct.toAddon; + DestroyInstance(m_addonInstance); } bool CImageDecoder::LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height) { - if (!m_struct.toAddon->load_image_from_memory) - return false; - m_width = width; m_height = height; - return m_struct.toAddon->load_image_from_memory(&m_struct, buffer, bufSize, &m_width, &m_height); + return m_ifc->kodi_addoninstance_imagedecoder_h->kodi_addon_imagedecoder_load_image_from_memory_v1(m_addonInstance, buffer, bufSize, &m_width, &m_height); } bool CImageDecoder::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format) { - if (!m_struct.toAddon->decode) - return false; - auto it = KodiToAddonFormat.find(format & XB_FMT_MASK); if (it == KodiToAddonFormat.end()) return false; - bool result = m_struct.toAddon->decode(&m_struct, pixels, width, height, pitch, it->second); + size_t size; + switch (format) + { + case XB_FMT_A8: + size = width * height * sizeof(uint8_t) * 1; + break; + case XB_FMT_RGB8: + size = width * height * sizeof(uint8_t) * 3; + break; + case XB_FMT_A8R8G8B8: + case XB_FMT_RGBA8: + default: + size = width * height * sizeof(uint8_t) * 4; + break; + } + + bool result = m_ifc->kodi_addoninstance_imagedecoder_h->kodi_addon_imagedecoder_decode_v1(m_addonInstance, pixels, size, width, height, pitch, it->second); m_width = width; m_height = height; return result; } -bool CImageDecoder::Create(const std::string& mimetype) +bool CImageDecoder::Create() { - m_struct.props->mimetype = mimetype.c_str(); - m_struct.toKodi->kodi_instance = this; - return (CreateInstance(&m_struct) == ADDON_STATUS_OK); + return (CreateInstance(this, m_addonInstance) == ADDON_STATUS_OK); } } /*namespace ADDON*/ diff --git a/xbmc/addons/ImageDecoder.h b/xbmc/addons/ImageDecoder.h index 5a4938a13da93..f79658207177f 100644 --- a/xbmc/addons/ImageDecoder.h +++ b/xbmc/addons/ImageDecoder.h @@ -7,20 +7,20 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h" +#include "interface/InstanceHandler.h" #include "guilib/iimage.h" namespace ADDON { - class CImageDecoder : public IAddonInstanceHandler, + class CImageDecoder : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler, public IImage { public: - explicit CImageDecoder(const AddonInfoPtr& addonInfo); + explicit CImageDecoder(const AddonInfoPtr& addonInfo, const std::string& mimetype); ~CImageDecoder() override; - bool Create(const std::string& mimetype); + bool Create(); + const std::string& GetMimeType() const { return m_mimetype; } /*---AUTO_GEN_PARSE---*/ bool CreateThumbnailFromSurface(unsigned char*, unsigned int, unsigned int, unsigned int, unsigned int, const std::string&, @@ -32,8 +32,9 @@ namespace ADDON unsigned int height, unsigned int pitch, unsigned int format) override; - protected: - AddonInstance_ImageDecoder m_struct = {}; + private: + const std::string m_mimetype; + KODI_HANDLE m_addonInstance; }; } /*namespace ADDON*/ diff --git a/xbmc/addons/ScreenSaver.cpp b/xbmc/addons/ScreenSaver.cpp index 51244b7ed14ae..711779616928b 100644 --- a/xbmc/addons/ScreenSaver.cpp +++ b/xbmc/addons/ScreenSaver.cpp @@ -8,6 +8,7 @@ #include "ScreenSaver.h" +#include "addons/interface/api/addon-instance/screensaver.h" #include "filesystem/SpecialProtocol.h" #include "utils/log.h" #include "windowing/GraphicContext.h" @@ -19,58 +20,45 @@ namespace ADDON CScreenSaver::CScreenSaver(const AddonInfoPtr& addonInfo) : IAddonInstanceHandler(ADDON_INSTANCE_SCREENSAVER, addonInfo) { - m_name = Name(); - m_presets = CSpecialProtocol::TranslatePath(Path()); - m_profile = CSpecialProtocol::TranslatePath(Profile()); - - m_struct.props = new AddonProps_Screensaver(); - m_struct.props->x = 0; - m_struct.props->y = 0; - m_struct.props->device = CServiceBroker::GetWinSystem()->GetHWContext(); - m_struct.props->width = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); - m_struct.props->height = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); - m_struct.props->pixelRatio = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; - m_struct.props->name = m_name.c_str(); - m_struct.props->presets = m_presets.c_str(); - m_struct.props->profile = m_profile.c_str(); - - m_struct.toKodi = new AddonToKodiFuncTable_Screensaver(); - m_struct.toKodi->kodiInstance = this; - - m_struct.toAddon = new KodiToAddonFuncTable_Screensaver(); - - /* Open the class "kodi::addon::CInstanceScreensaver" on add-on side */ - if (CreateInstance(&m_struct) != ADDON_STATUS_OK) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) CLog::Log(LOGFATAL, "Screensaver: failed to create instance for '{}' and not usable!", ID()); } CScreenSaver::~CScreenSaver() { /* Destroy the class "kodi::addon::CInstanceScreensaver" on add-on side */ - DestroyInstance(); - - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; + DestroyInstance(m_addonInstance); } bool CScreenSaver::Start() { - if (m_struct.toAddon->Start) - return m_struct.toAddon->Start(&m_struct); - return false; + return m_ifc->kodi_addoninstance_screensaver_h->kodi_addon_screensaver_start_v1(m_addonInstance); } void CScreenSaver::Stop() { - if (m_struct.toAddon->Stop) - m_struct.toAddon->Stop(&m_struct); + return m_ifc->kodi_addoninstance_screensaver_h->kodi_addon_screensaver_stop_v1(m_addonInstance); } void CScreenSaver::Render() { - if (m_struct.toAddon->Render) - m_struct.toAddon->Render(&m_struct); + return m_ifc->kodi_addoninstance_screensaver_h->kodi_addon_screensaver_render_v1(m_addonInstance); +} + +void CScreenSaver::GetProperties(struct SCREENSAVER_PROPS* props) +{ + if (!props) + return; + + props->x = 0; + props->y = 0; + props->device = CServiceBroker::GetWinSystem()->GetHWContext(); + props->width = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); + props->height = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); + props->pixelRatio = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; + props->name = strdup(Name().c_str()); + props->presets = strdup(CSpecialProtocol::TranslatePath(Path()).c_str()); + props->profile = strdup(CSpecialProtocol::TranslatePath(Profile()).c_str()); } } /* namespace ADDON */ diff --git a/xbmc/addons/ScreenSaver.h b/xbmc/addons/ScreenSaver.h index c77073465c556..26746b13624d7 100644 --- a/xbmc/addons/ScreenSaver.h +++ b/xbmc/addons/ScreenSaver.h @@ -8,13 +8,13 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h" +#include "interface/InstanceHandler.h" namespace ADDON { -class CScreenSaver : public IAddonInstanceHandler +class CScreenSaver : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: explicit CScreenSaver(const AddonInfoPtr& addonInfo); @@ -24,12 +24,11 @@ class CScreenSaver : public IAddonInstanceHandler void Stop(); void Render(); -private: - std::string m_name; /*!< To add-on sended name */ - std::string m_presets; /*!< To add-on sended preset path */ - std::string m_profile; /*!< To add-on sended profile path */ + void GetProperties(struct SCREENSAVER_PROPS* props); + /*---AUTO_GEN_PARSE---*/ - AddonInstance_Screensaver m_struct; +private: + KODI_HANDLE m_addonInstance; }; } /* namespace ADDON */ diff --git a/xbmc/addons/Service.cpp b/xbmc/addons/Service.cpp index 285e76ba2fcb2..57a5e6ef66940 100644 --- a/xbmc/addons/Service.cpp +++ b/xbmc/addons/Service.cpp @@ -8,10 +8,14 @@ #include "Service.h" #include "AddonManager.h" +#include "ServiceBroker.h" +#include "interface/Controller.h" +#include "interface/RunningProcess.h" #include "interfaces/generic/ScriptInvocationManager.h" #include "utils/StringUtils.h" #include "utils/log.h" +using namespace KODI::ADDONS::INTERFACE; namespace ADDON { @@ -71,12 +75,36 @@ void CServiceAddonManager::Start(const std::string& addonId) void CServiceAddonManager::Start(const AddonPtr& addon) { CSingleLock lock(m_criticalSection); + if (m_services.find(addon->ID()) != m_services.end()) { CLog::Log(LOGDEBUG, "CServiceAddonManager: {} already started.", addon->ID()); return; } + if (CServiceBroker::GetAddonIfcCtrl().AddonLanguageSupported(addon)) + { + std::vector argv; + std::shared_ptr process; + bool ret = CServiceBroker::GetAddonIfcCtrl().LaunchAddon(addon, argv, false, process); + if (!ret) + { + CLog::Log(LOGERROR, "CServiceAddonManager: {} failed to start", addon->ID()); + return; + } + + m_services[addon->ID()] = process; + } + + //! @brief Old way. Still supported until new is main + //! @todo Remove after new is final and support whole python interface + /*!@{*/ + if (m_servicesPythonOld.find(addon->ID()) != m_servicesPythonOld.end()) + { + CLog::Log(LOGDEBUG, "CServiceAddonManager: {} already started.", addon->ID()); + return; + } + if (StringUtils::EndsWith(addon->LibPath(), ".py")) { CLog::Log(LOGDEBUG, "CServiceAddonManager: starting {}", addon->ID()); @@ -86,8 +114,9 @@ void CServiceAddonManager::Start(const AddonPtr& addon) CLog::Log(LOGERROR, "CServiceAddonManager: {} failed to start", addon->ID()); return; } - m_services[addon->ID()] = handle; + m_servicesPythonOld[addon->ID()] = handle; } + /*!@}*/ } void CServiceAddonManager::Stop() @@ -95,24 +124,59 @@ void CServiceAddonManager::Stop() m_addonMgr.Events().Unsubscribe(this); m_addonMgr.UnloadEvents().Unsubscribe(this); CSingleLock lock(m_criticalSection); + for (const auto& service : m_services) { - Stop(service); + Stop(service.second); } m_services.clear(); + + //! @brief Old way. Still supported until new is main + //! @todo Remove after new is final and support whole python interface + /*!@{*/ + for (const auto& service : m_servicesPythonOld) + { + Stop(service); + } + m_servicesPythonOld.clear(); + /*!@}*/ } void CServiceAddonManager::Stop(const std::string& addonId) { CSingleLock lock(m_criticalSection); + auto it = m_services.find(addonId); if (it != m_services.end()) { - Stop(*it); + Stop(it->second); m_services.erase(it); } + + //! @brief Old way. Still supported until new is main + //! @todo Remove after new is final and support whole python interface + /*!@{*/ + auto itOld = m_servicesPythonOld.find(addonId); + if (itOld != m_servicesPythonOld.end()) + { + Stop(*itOld); + m_servicesPythonOld.erase(itOld); + } + /*!@}*/ } +void CServiceAddonManager::Stop(const std::shared_ptr& service) +{ + CLog::Log(LOGDEBUG, "CServiceAddonManager: stopping {}.", service->GetAddon()->ID()); + if (!service->Kill()) + { + CLog::Log(LOGINFO, "CServiceAddonManager: failed to stop {} (may have ended)", service->GetAddon()->ID()); + } +} + +//! @brief Old way. Still supported until new is main +//! @todo Remove after new is final and support whole python interface +/*!@{*/ void CServiceAddonManager::Stop(const std::map::value_type& service) { CLog::Log(LOGDEBUG, "CServiceAddonManager: stopping {}.", service.first); @@ -121,4 +185,6 @@ void CServiceAddonManager::Stop(const std::map::value_type& se CLog::Log(LOGINFO, "CServiceAddonManager: failed to stop {} (may have ended)", service.first); } } +/*!@}*/ + } diff --git a/xbmc/addons/Service.h b/xbmc/addons/Service.h index c997ef01b3b37..02bfecd36abdf 100644 --- a/xbmc/addons/Service.h +++ b/xbmc/addons/Service.h @@ -12,6 +12,19 @@ #include "AddonEvents.h" #include "threads/CriticalSection.h" +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningProcess; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + namespace ADDON { class CService: public CAddon @@ -50,11 +63,13 @@ namespace ADDON private: void OnEvent(const AddonEvent& event); + void Stop(const std::shared_ptr& service); void Stop(const std::map::value_type& service); CAddonMgr& m_addonMgr; CCriticalSection m_criticalSection; + std::map> m_services; /** add-on id -> script id */ - std::map m_services; + std::map m_servicesPythonOld; }; } diff --git a/xbmc/addons/VFSEntry.cpp b/xbmc/addons/VFSEntry.cpp index 5bc213c1ed5eb..5794544a32f7d 100644 --- a/xbmc/addons/VFSEntry.cpp +++ b/xbmc/addons/VFSEntry.cpp @@ -10,7 +10,7 @@ #include "ServiceBroker.h" #include "URL.h" #include "addons/AddonManager.h" -#include "addons/interfaces/Filesystem.h" +#include "addons/interface/api/addon-instance/vfs.h" #include "network/ZeroconfBrowser.h" #include "utils/StringUtils.h" #include "utils/log.h" @@ -41,6 +41,8 @@ #endif #endif +using namespace KODI::ADDONS::INTERFACE; + namespace ADDON { @@ -61,7 +63,7 @@ void CVFSAddonCache::Init() for (const auto& addonInfo : addonInfos) { VFSEntryPtr vfs = std::make_shared(addonInfo); - vfs->Addon()->RegisterInformer(this); +// vfs->Addon()->RegisterInformer(this); m_addonsInstances.emplace_back(vfs); @@ -148,7 +150,7 @@ void CVFSAddonCache::Update(const std::string& id) if (itAddon != m_addonsInstances.end()) { - (*itAddon)->Addon()->RegisterInformer(nullptr); +// (*itAddon)->Addon()->RegisterInformer(nullptr); m_addonsInstances.erase(itAddon); } } @@ -196,7 +198,7 @@ class CVFSURLWrapper url.protocol = m_strings[9].c_str(); } - VFSURL url; + VFS_URL url; protected: std::vector m_strings; }; @@ -227,62 +229,38 @@ CVFSEntry::CVFSEntry(const AddonInfoPtr& addonInfo) if (!addonInfo->Type(ADDON_VFS)->GetValue("@supportDialog").asBoolean()) m_protocolInfo.type.clear(); - // Create "C" interface structures, used as own parts to prevent API problems on update - m_struct.props = new AddonProps_VFSEntry(); - m_struct.toAddon = new KodiToAddonFuncTable_VFSEntry(); - m_struct.toKodi = new AddonToKodiFuncTable_VFSEntry(); - - m_struct.toKodi->kodiInstance = this; - if (CreateInstance(&m_struct) != ADDON_STATUS_OK) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) CLog::Log(LOGFATAL, "CVFSEntry - Couldn't create instance on add-on '{}'", addonInfo->Name()); } CVFSEntry::~CVFSEntry() { - DestroyInstance(); - - // Delete "C" interface structures - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; + DestroyInstance(m_addonInstance); } void* CVFSEntry::Open(const CURL& url) { - if (!m_struct.toAddon->open) - return nullptr; - CVFSURLWrapper url2(url); - return m_struct.toAddon->open(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_open_v1(m_addonInstance, &url2.url); } void* CVFSEntry::OpenForWrite(const CURL& url, bool bOverWrite) { - if (!m_struct.toAddon->open_for_write) - return nullptr; - CVFSURLWrapper url2(url); - return m_struct.toAddon->open_for_write(&m_struct, &url2.url, bOverWrite); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_open_for_write_v1(m_addonInstance, &url2.url, bOverWrite); } bool CVFSEntry::Exists(const CURL& url) { - if (!m_struct.toAddon->exists) - return false; - CVFSURLWrapper url2(url); - return m_struct.toAddon->exists(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_exists_v1(m_addonInstance, &url2.url); } int CVFSEntry::Stat(const CURL& url, struct __stat64* buffer) { - int ret = -1; - if (!m_struct.toAddon->stat) - return ret; - CVFSURLWrapper url2(url); - STAT_STRUCTURE statBuffer = {}; - ret = m_struct.toAddon->stat(&m_struct, &url2.url, &statBuffer); + VFS_STAT_STRUCTURE statBuffer = {}; + int ret = m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_stat_v1(m_addonInstance, &url2.url, &statBuffer); buffer->st_dev = statBuffer.deviceId; buffer->st_ino = statBuffer.fileSerialNumber; @@ -311,64 +289,42 @@ int CVFSEntry::Stat(const CURL& url, struct __stat64* buffer) ssize_t CVFSEntry::Read(void* ctx, void* lpBuf, size_t uiBufSize) { - if (!m_struct.toAddon->read) - return 0; - - return m_struct.toAddon->read(&m_struct, ctx, static_cast(lpBuf), uiBufSize); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_read_v1(m_addonInstance, ctx, static_cast(lpBuf), uiBufSize); } ssize_t CVFSEntry::Write(void* ctx, const void* lpBuf, size_t uiBufSize) { - if (!m_struct.toAddon->write) - return 0; - - return m_struct.toAddon->write(&m_struct, ctx, static_cast(lpBuf), uiBufSize); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_write_v1(m_addonInstance, ctx, static_cast(lpBuf), uiBufSize); } int64_t CVFSEntry::Seek(void* ctx, int64_t position, int whence) { - if (!m_struct.toAddon->seek) - return 0; - - return m_struct.toAddon->seek(&m_struct, ctx, position, whence); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_seek_v1(m_addonInstance, ctx, position, whence); } int CVFSEntry::Truncate(void* ctx, int64_t size) { - if (!m_struct.toAddon->truncate) - return 0; - - return m_struct.toAddon->truncate(&m_struct, ctx, size); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_truncate_v1(m_addonInstance, ctx, size); } void CVFSEntry::Close(void* ctx) { - if (m_struct.toAddon->close) - m_struct.toAddon->close(&m_struct, ctx); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_close_v1(m_addonInstance, ctx); } int64_t CVFSEntry::GetPosition(void* ctx) { - if (!m_struct.toAddon->get_position) - return 0; - - return m_struct.toAddon->get_position(&m_struct, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_position_v1(m_addonInstance, ctx); } int CVFSEntry::GetChunkSize(void* ctx) { - if (!m_struct.toAddon->get_chunk_size) - return 0; - - return m_struct.toAddon->get_chunk_size(&m_struct, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_chunk_size_v1(m_addonInstance, ctx); } int64_t CVFSEntry::GetLength(void* ctx) { - if (!m_struct.toAddon->get_length) - return 0; - - return m_struct.toAddon->get_length(&m_struct, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_length_v1(m_addonInstance, ctx); } int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) @@ -377,21 +333,16 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) { case XFILE::EIoControl::IOCTRL_SEEK_POSSIBLE: { - if (!m_struct.toAddon->io_control_get_seek_possible) - return -1; - return m_struct.toAddon->io_control_get_seek_possible(&m_struct, ctx) ? 1 : 0; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_get_seek_possible_v1(m_addonInstance, ctx) ? 1 : 0; } case XFILE::EIoControl::IOCTRL_CACHE_STATUS: { - if (!m_struct.toAddon->io_control_get_cache_status) - return -1; - XFILE::SCacheStatus* kodiData = static_cast(param); if (!kodiData) return -1; - VFS_CACHE_STATUS_DATA status; - int ret = m_struct.toAddon->io_control_get_cache_status(&m_struct, ctx, &status) ? 0 : -1; + VFS_CACHE_STATUS status; + int ret = m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_get_cache_status_v1(m_addonInstance, ctx, &status) ? 0 : -1; if (ret >= 0) { kodiData->forward = status.forward; @@ -403,19 +354,13 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) } case XFILE::EIoControl::IOCTRL_CACHE_SETRATE: { - if (!m_struct.toAddon->io_control_set_cache_rate) - return -1; - unsigned int& iParam = *static_cast(param); - return m_struct.toAddon->io_control_set_cache_rate(&m_struct, ctx, iParam) ? 1 : 0; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_set_cache_rate_v1(m_addonInstance, ctx, iParam) ? 1 : 0; } case XFILE::EIoControl::IOCTRL_SET_RETRY: { - if (!m_struct.toAddon->io_control_set_retry) - return -1; - bool& bParam = *static_cast(param); - return m_struct.toAddon->io_control_set_retry(&m_struct, ctx, bParam) ? 0 : -1; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_set_retry_v1(m_addonInstance, ctx, bParam) ? 0 : -1; } // Not by addon supported io's @@ -430,64 +375,47 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) bool CVFSEntry::Delete(const CURL& url) { - if (!m_struct.toAddon->delete_it) - return false; - CVFSURLWrapper url2(url); - return m_struct.toAddon->delete_it(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_delete_it_v1(m_addonInstance, &url2.url); } bool CVFSEntry::Rename(const CURL& url, const CURL& url2) { - if (!m_struct.toAddon->rename) - return false; - CVFSURLWrapper url3(url); CVFSURLWrapper url4(url2); - return m_struct.toAddon->rename(&m_struct, &url3.url, &url4.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_rename_v1(m_addonInstance, &url3.url, &url4.url); } void CVFSEntry::ClearOutIdle() { - if (m_struct.toAddon->clear_out_idle) - m_struct.toAddon->clear_out_idle(&m_struct); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_clear_out_idle_v1(m_addonInstance); } void CVFSEntry::DisconnectAll() { - if (m_struct.toAddon->disconnect_all) - m_struct.toAddon->disconnect_all(&m_struct); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_disconnect_all_v1(m_addonInstance); } bool CVFSEntry::DirectoryExists(const CURL& url) { - if (!m_struct.toAddon->directory_exists) - return false; - CVFSURLWrapper url2(url); - return m_struct.toAddon->directory_exists(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_exists_v1(m_addonInstance, &url2.url); } bool CVFSEntry::RemoveDirectory(const CURL& url) { - if (!m_struct.toAddon->remove_directory) - return false; - CVFSURLWrapper url2(url); - return m_struct.toAddon->remove_directory(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_remove_v1(m_addonInstance, &url2.url); } bool CVFSEntry::CreateDirectory(const CURL& url) { - if (!m_struct.toAddon->create_directory) - return false; - CVFSURLWrapper url2(url); - return m_struct.toAddon->create_directory(&m_struct, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_create_v1(m_addonInstance, &url2.url); } static void VFSDirEntriesToCFileItemList(int num_entries, - VFSDirEntry* entries, + VFS_DIR_ENTRY* entries, CFileItemList& items) { for (int i=0;iget_directory || !m_struct.toAddon->free_directory) - return false; - - VFSGetDirectoryCallbacks callbacks; - callbacks.ctx = ctx; - callbacks.get_keyboard_input = CVFSEntryIDirectoryWrapper::DoGetKeyboardInput; - callbacks.set_error_dialog = CVFSEntryIDirectoryWrapper::DoSetErrorDialog; - callbacks.require_authentication = CVFSEntryIDirectoryWrapper::DoRequireAuthentication; - - VFSDirEntry* entries = nullptr; - int num_entries = 0; + VFS_DIR_ENTRY* entries = nullptr; + size_t num_entries = 0; CVFSURLWrapper url2(url); bool ret = - m_struct.toAddon->get_directory(&m_struct, &url2.url, &entries, &num_entries, &callbacks); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_get_v1(m_addonInstance, &url2.url, &entries, &num_entries, ctx); if (ret) { VFSDirEntriesToCFileItemList(num_entries, entries, items); - m_struct.toAddon->free_directory(&m_struct, entries, num_entries); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_free_v1(entries, num_entries); } return ret; @@ -544,24 +463,24 @@ bool CVFSEntry::GetDirectory(const CURL& url, CFileItemList& items, bool CVFSEntry::ContainsFiles(const CURL& url, CFileItemList& items) { - if (!m_struct.toAddon->contains_files || !m_struct.toAddon->free_directory) - return false; - - VFSDirEntry* entries = nullptr; - int num_entries = 0; + VFS_DIR_ENTRY* entries = nullptr; + size_t num_entries = 0; CVFSURLWrapper url2(url); - char rootpath[ADDON_STANDARD_STRING_LENGTH]; + char* rootpath = nullptr; rootpath[0] = 0; bool ret = - m_struct.toAddon->contains_files(&m_struct, &url2.url, &entries, &num_entries, rootpath); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_contains_files_v1(m_addonInstance, &url2.url, &entries, &num_entries, &rootpath); if (!ret) return false; VFSDirEntriesToCFileItemList(num_entries, entries, items); - m_struct.toAddon->free_directory(&m_struct, entries, num_entries); - if (strlen(rootpath)) + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_free_v1(entries, num_entries); + if (rootpath) + { items.SetPath(rootpath); + free(rootpath); + } return true; } @@ -703,7 +622,7 @@ bool CVFSEntryIDirectoryWrapper::GetDirectory(const CURL& url, return m_addon->GetDirectory(url, items, this); } -bool CVFSEntryIDirectoryWrapper::DoGetKeyboardInput(void* ctx, +bool CVFSEntry::DoGetKeyboardInput(KODI_CTX_CB_HDL ctx, const char* heading, char** input, bool hidden_input) @@ -723,7 +642,7 @@ bool CVFSEntryIDirectoryWrapper::GetKeyboardInput2(const char* heading, return result; } -void CVFSEntryIDirectoryWrapper::DoSetErrorDialog(void* ctx, const char* heading, +void CVFSEntry::DoSetErrorDialog(KODI_CTX_CB_HDL ctx, const char* heading, const char* line1, const char* line2, const char* line3) @@ -747,7 +666,7 @@ void CVFSEntryIDirectoryWrapper::SetErrorDialog2(const char* heading, CVariant(std::string(line1)), l2, l3); } -void CVFSEntryIDirectoryWrapper::DoRequireAuthentication(void* ctx, +void CVFSEntry::DoRequireAuthentication(KODI_CTX_CB_HDL ctx, const char* url) { static_cast(ctx)->RequireAuthentication2(CURL(url)); diff --git a/xbmc/addons/VFSEntry.h b/xbmc/addons/VFSEntry.h index a16bfc9fb217c..4b00a457460ac 100644 --- a/xbmc/addons/VFSEntry.h +++ b/xbmc/addons/VFSEntry.h @@ -7,8 +7,10 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h" +#include "interface/InstanceHandler.h" +#include "FileItem.h" +#include "addons/AddonEvents.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h" #include "filesystem/IDirectory.h" #include "filesystem/IFile.h" #include "filesystem/IFileDirectory.h" @@ -21,7 +23,7 @@ namespace ADDON class CVFSEntry; typedef std::shared_ptr VFSEntryPtr; - class CVFSAddonCache : public CAddonDllInformer + class CVFSAddonCache //: public CAddonDllInformer { public: virtual ~CVFSAddonCache(); @@ -33,14 +35,14 @@ namespace ADDON protected: void Update(const std::string& id); void OnEvent(const AddonEvent& event); - bool IsInUse(const std::string& id) override; + bool IsInUse(const std::string& id);// override; CCriticalSection m_critSection; std::vector m_addonsInstances; }; //! \brief A virtual filesystem entry add-on. - class CVFSEntry : public IAddonInstanceHandler + class CVFSEntry : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: //! \brief A structure encapsulating properties of supplied protocol. @@ -82,7 +84,7 @@ namespace ADDON bool Delete(const CURL& url); bool Rename(const CURL& url, const CURL& url2); - bool GetDirectory(const CURL& url, CFileItemList& items, void* ctx); + bool GetDirectory(const CURL& url, CFileItemList& items, KODI_CTX_CB_HDL ctx); bool DirectoryExists(const CURL& url); bool RemoveDirectory(const CURL& url); bool CreateDirectory(const CURL& url); @@ -98,6 +100,22 @@ namespace ADDON bool HasFileDirectories() const { return m_filedirectories; } const std::string& GetZeroconfType() const { return m_zeroconf; } const ProtocolInfo& GetProtocolInfo() const { return m_protocolInfo; } + + //! \brief Helper for CVFSEntryIDirectoryWrapper doing a keyboard callback. + bool DoGetKeyboardInput(KODI_CTX_CB_HDL context, const char* heading, + char** input, bool hidden_input); + /*---AUTO_GEN_PARSE---*/ + + //! \brief Static helper for displaying an error dialog. + void DoSetErrorDialog(KODI_CTX_CB_HDL ctx, const char* heading, + const char* line1, const char* line2, + const char* line3); + /*---AUTO_GEN_PARSE---*/ + + //! \brief Static helper for requiring authentication. + void DoRequireAuthentication(KODI_CTX_CB_HDL ctx, const char* url); + /*---AUTO_GEN_PARSE---*/ + protected: std::string m_protocols; //!< Protocols for VFS entry. std::string m_extensions; //!< Extensions for VFS entry. @@ -106,7 +124,7 @@ namespace ADDON bool m_directories; //!< VFS entry can list directories. bool m_filedirectories; //!< VFS entry contains file directories. ProtocolInfo m_protocolInfo; //!< Info about protocol for network dialog. - AddonInstance_VFSEntry m_struct; //!< VFS callback table + KODI_HANDLE m_addonInstance; }; //! \brief Wrapper equipping a CVFSEntry with an IFile interface. @@ -224,25 +242,14 @@ namespace ADDON //! \param[in] url URL to delete. bool Create(const CURL& url) override; - //! \brief Static helper for doing a keyboard callback. - static bool DoGetKeyboardInput(void* context, const char* heading, - char** input, bool hidden_input); //! \brief Get keyboard input. bool GetKeyboardInput2(const char* heading, char** input, bool hidden_input); - //! \brief Static helper for displaying an error dialog. - static void DoSetErrorDialog(void* ctx, const char* heading, - const char* line1, const char* line2, - const char* line3); - //! \brief Show an error dialog. void SetErrorDialog2(const char* heading, const char* line1, const char* line2, const char* line3); - //! \brief Static helper for requiring authentication. - static void DoRequireAuthentication(void* ctx, const char* url); - //! \brief Require authentication. void RequireAuthentication2(const CURL& url); protected: diff --git a/xbmc/addons/Visualization.cpp b/xbmc/addons/Visualization.cpp index 78513ba406fe7..cc11d497b1080 100644 --- a/xbmc/addons/Visualization.cpp +++ b/xbmc/addons/Visualization.cpp @@ -8,6 +8,7 @@ #include "Visualization.h" +#include "addons/interface/api/addon-instance/visualization.h" #include "filesystem/SpecialProtocol.h" #include "guilib/GUIWindowManager.h" #include "utils/log.h" @@ -18,144 +19,91 @@ namespace ADDON CVisualization::CVisualization(const AddonInfoPtr& addonInfo, float x, float y, float w, float h) : IAddonInstanceHandler(ADDON_INSTANCE_VISUALIZATION, addonInfo) { - // Setup new Visualization instance - m_name = Name(); - m_presetsPath = CSpecialProtocol::TranslatePath(Path()); - m_profilePath = CSpecialProtocol::TranslatePath(Profile()); - - m_struct.props = new AddonProps_Visualization; - m_struct.props->x = static_cast(x); - m_struct.props->y = static_cast(y); - m_struct.props->width = static_cast(w); - m_struct.props->height = static_cast(h); - m_struct.props->device = CServiceBroker::GetWinSystem()->GetHWContext(); - m_struct.props->pixelRatio = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; - m_struct.props->name = m_name.c_str(); - m_struct.props->presets = m_presetsPath.c_str(); - m_struct.props->profile = m_profilePath.c_str(); - - m_struct.toKodi = new AddonToKodiFuncTable_Visualization; - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->transfer_preset = transfer_preset; - m_struct.toKodi->clear_presets = clear_presets; - - m_struct.toAddon = new KodiToAddonFuncTable_Visualization; - memset(m_struct.toAddon, 0, sizeof(KodiToAddonFuncTable_Visualization)); - /* Open the class "kodi::addon::CInstanceVisualization" on add-on side */ - if (CreateInstance(&m_struct) != ADDON_STATUS_OK) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) { CLog::Log(LOGFATAL, "Visualization: failed to create instance for '{}' and not usable!", ID()); return; } /* presets becomes send with "transfer_preset" during call of function below */ - if (m_struct.toAddon->get_presets) - m_struct.toAddon->get_presets(&m_struct); + m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_get_presets_v1(m_addonInstance); } CVisualization::~CVisualization() { /* Destroy the class "kodi::addon::CInstanceVisualization" on add-on side */ - DestroyInstance(); - - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; + DestroyInstance(m_addonInstance); } bool CVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, const std::string& songName) { - if (m_struct.toAddon->start) - return m_struct.toAddon->start(&m_struct, channels, samplesPerSec, bitsPerSample, songName.c_str()); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_start_v1(m_addonInstance, channels, samplesPerSec, bitsPerSample, songName.c_str()); } void CVisualization::Stop() { - if (m_struct.toAddon->stop) - m_struct.toAddon->stop(&m_struct); + m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_stop_v1(m_addonInstance); } void CVisualization::AudioData(const float* audioData, int audioDataLength, float *freqData, int freqDataLength) { - if (m_struct.toAddon->audio_data) - m_struct.toAddon->audio_data(&m_struct, audioData, audioDataLength, freqData, freqDataLength); + m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_audio_data_v1(m_addonInstance, audioData, audioDataLength, freqData, freqDataLength); } bool CVisualization::IsDirty() { - if (m_struct.toAddon->is_dirty) - return m_struct.toAddon->is_dirty(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_is_dirty_v1(m_addonInstance); } void CVisualization::Render() { - if (m_struct.toAddon->render) - m_struct.toAddon->render(&m_struct); + m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_render_v1(m_addonInstance); } void CVisualization::GetInfo(VIS_INFO *info) { - if (m_struct.toAddon->get_info) - m_struct.toAddon->get_info(&m_struct, info); + m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_get_info_v1(m_addonInstance, info); } bool CVisualization::NextPreset() { - if (m_struct.toAddon->next_preset) - return m_struct.toAddon->next_preset(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_next_preset_v1(m_addonInstance); } bool CVisualization::PrevPreset() { - if (m_struct.toAddon->prev_preset) - return m_struct.toAddon->prev_preset(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_prev_preset_v1(m_addonInstance); } bool CVisualization::LoadPreset(int select) { - if (m_struct.toAddon->load_preset) - return m_struct.toAddon->load_preset(&m_struct, select); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_load_preset_v1(m_addonInstance, select); } bool CVisualization::RandomPreset() { - if (m_struct.toAddon->random_preset) - return m_struct.toAddon->random_preset(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_random_preset_v1(m_addonInstance); } bool CVisualization::LockPreset() { - if (m_struct.toAddon->lock_preset) - return m_struct.toAddon->lock_preset(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_lock_preset_v1(m_addonInstance); } bool CVisualization::RatePreset(bool plus_minus) { - if (m_struct.toAddon->rate_preset) - return m_struct.toAddon->rate_preset(&m_struct, plus_minus); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_rate_preset_v1(m_addonInstance, plus_minus); } bool CVisualization::UpdateAlbumart(const char* albumart) { - if (m_struct.toAddon->update_albumart) - return m_struct.toAddon->update_albumart(&m_struct, albumart); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_update_albumart_v1(m_addonInstance, albumart); } bool CVisualization::UpdateTrack(const VIS_TRACK* track) { - if (m_struct.toAddon->update_track) - return m_struct.toAddon->update_track(&m_struct, track); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_update_track_v1(m_addonInstance, track); } bool CVisualization::HasPresets() @@ -171,9 +119,7 @@ bool CVisualization::GetPresetList(std::vector &vecpresets) int CVisualization::GetActivePreset() { - if (m_struct.toAddon->get_active_preset) - return m_struct.toAddon->get_active_preset(&m_struct); - return -1; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_get_active_preset_v1(m_addonInstance); } std::string CVisualization::GetActivePresetName() @@ -185,33 +131,33 @@ std::string CVisualization::GetActivePresetName() bool CVisualization::IsLocked() { - if (m_struct.toAddon->is_locked) - return m_struct.toAddon->is_locked(&m_struct); - return false; + return m_ifc->kodi_addoninstance_visualization_h->kodi_addon_visualization_is_locked_v1(m_addonInstance); } -void CVisualization::transfer_preset(void* kodiInstance, const char* preset) +void CVisualization::get_properties(struct VIS_PROPS* props) { - CVisualization *addon = static_cast(kodiInstance); - if (!addon || !preset) - { - CLog::Log(LOGERROR, "CVisualization::{} - invalid handler data", __FUNCTION__); + if (!props) return; - } - addon->m_presets.emplace_back(preset); + props->x = 0; + props->y = 0; + props->device = CServiceBroker::GetWinSystem()->GetHWContext(); + props->width = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); + props->height = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); + props->pixelRatio = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; + props->name = strdup(Name().c_str()); + props->presets = strdup(CSpecialProtocol::TranslatePath(Path()).c_str()); + props->profile = strdup(CSpecialProtocol::TranslatePath(Profile()).c_str()); } -void CVisualization::clear_presets(void* kodiInstance) +void CVisualization::transfer_preset(const char* preset) { - CVisualization* addon = static_cast(kodiInstance); - if (!addon) - { - CLog::Log(LOGERROR, "CVisualization::{} - invalid handler data", __FUNCTION__); - return; - } + m_presets.emplace_back(preset); +} - addon->m_presets.clear(); +void CVisualization::clear_presets() +{ + m_presets.clear(); } } /* namespace ADDON */ diff --git a/xbmc/addons/Visualization.h b/xbmc/addons/Visualization.h index a246b643b5d4b..c2535faca0183 100644 --- a/xbmc/addons/Visualization.h +++ b/xbmc/addons/Visualization.h @@ -8,13 +8,13 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h" +#include "interface/InstanceHandler.h" namespace ADDON { -class CVisualization : public IAddonInstanceHandler +class CVisualization : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: CVisualization(const AddonInfoPtr& addonInfo, float x, float y, float w, float h); @@ -40,17 +40,17 @@ class CVisualization : public IAddonInstanceHandler std::string GetActivePresetName(); bool IsLocked(); + void get_properties(struct VIS_PROPS* props); + /*---AUTO_GEN_PARSE---*/ + void transfer_preset(const char* preset); + /*---AUTO_GEN_PARSE---*/ + void clear_presets(); + /*---AUTO_GEN_PARSE---*/ + private: - std::string m_name; /*!< To add-on sended name */ - std::string m_presetsPath; /*!< To add-on sended preset path */ - std::string m_profilePath; /*!< To add-on sended profile path */ std::vector m_presets; /*!< cached preset list */ - AddonInstance_Visualization m_struct; /*!< Interface table who contains function addresses and fixed values */ - - // Static function to transfer data from add-on to kodi - static void transfer_preset(void* kodiInstance, const char* preset); - static void clear_presets(void* kodiInstance); + KODI_HANDLE m_addonInstance; }; } /* namespace ADDON */ diff --git a/xbmc/addons/addoninfo/AddonInfo.cpp b/xbmc/addons/addoninfo/AddonInfo.cpp index fa9762bf6bc4b..8de3ea789de71 100644 --- a/xbmc/addons/addoninfo/AddonInfo.cpp +++ b/xbmc/addons/addoninfo/AddonInfo.cpp @@ -153,7 +153,7 @@ CAddonInfo::CAddonInfo(std::string id, TYPE type) const CAddonType* CAddonInfo::Type(TYPE type) const { - static CAddonType dummy; + static CAddonType dummy(ADDON_UNKNOWN, AddonLanguage::Unknown); if (!m_types.empty()) { diff --git a/xbmc/addons/addoninfo/AddonInfo.h b/xbmc/addons/addoninfo/AddonInfo.h index d4e4682b094ce..afc85b7e3e296 100644 --- a/xbmc/addons/addoninfo/AddonInfo.h +++ b/xbmc/addons/addoninfo/AddonInfo.h @@ -194,6 +194,7 @@ class CAddonInfo const std::string& Forum() const { return m_forum; } const std::string& EMail() const { return m_email; } const std::string& Path() const { return m_path; } + const std::string& Profile() const { return m_profilePath; } const std::string& ChangeLog() const { return GetTranslatedText(m_changelog); } const std::string& Icon() const { return m_icon; } const ArtMap& Art() const { return m_art; } @@ -263,6 +264,7 @@ class CAddonInfo std::string m_libname; InfoMap m_extrainfo; std::vector m_platforms; + std::string m_profilePath; const std::string& GetTranslatedText(const std::unordered_map& locales) const; }; diff --git a/xbmc/addons/addoninfo/AddonInfoBuilder.cpp b/xbmc/addons/addoninfo/AddonInfoBuilder.cpp index 9a566f2f05a0b..e404ed8063b63 100644 --- a/xbmc/addons/addoninfo/AddonInfoBuilder.cpp +++ b/xbmc/addons/addoninfo/AddonInfoBuilder.cpp @@ -146,6 +146,8 @@ bool CAddonInfoBuilder::ParseXML(const AddonInfoPtr& addon, const TiXmlElement* return false; } + addon->m_profilePath = StringUtils::Format("special://profile/addon_data/{}/", addon->m_id); + // Check addon identifier for forbidden characters // The identifier is used e.g. in URLs so we shouldn't allow just // any character to go through. @@ -397,7 +399,7 @@ bool CAddonInfoBuilder::ParseXML(const AddonInfoPtr& addon, const TiXmlElement* return false; } - CAddonType addonType(type); + CAddonType addonType(type, AddonLanguage::Unknown); if (ParseXMLTypes(addonType, addon, child)) addon->m_types.emplace_back(std::move(addonType)); } @@ -409,7 +411,7 @@ bool CAddonInfoBuilder::ParseXML(const AddonInfoPtr& addon, const TiXmlElement* */ if (addon->m_types.empty()) { - CAddonType addonType(ADDON_UNKNOWN); + CAddonType addonType(ADDON_UNKNOWN, AddonLanguage::Unknown); addon->m_types.emplace_back(std::move(addonType)); } @@ -460,6 +462,10 @@ bool CAddonInfoBuilder::ParseXMLTypes(CAddonType& addonType, { addonType.m_libname = library; + const char* language = child->Attribute("language"); + if (language) + addonType.SetLanguage(language); + try { // linux is different and has the version number after the suffix diff --git a/xbmc/addons/addoninfo/AddonType.cpp b/xbmc/addons/addoninfo/AddonType.cpp index 0df7dda4f0a09..943c84c0d80e7 100644 --- a/xbmc/addons/addoninfo/AddonType.cpp +++ b/xbmc/addons/addoninfo/AddonType.cpp @@ -18,6 +18,22 @@ static const std::set dependencyTypes = { ADDON_SCRIPT_LIBRARY, ADDON_SCRIPT_MODULE, }; + +typedef struct +{ + AddonLanguage language; + std::string name; +} LanguageMapping; + +// clang-format off +static const LanguageMapping languages[] = + {{ AddonLanguage::Unknown, "unknown" }, + { AddonLanguage::C, "C" }, + { AddonLanguage::CPP, "C++" }, + { AddonLanguage::Python3, "Python3" } + }; +// clang-format on + } /* namespace ADDON */ using namespace ADDON; @@ -29,6 +45,21 @@ std::string CAddonType::LibPath() const return URIUtils::AddFileToFolder(m_path, m_libname); } +const std::string& CAddonType::LanguageName() const +{ + for (const LanguageMapping& map : languages) + { + if (map.language == m_language) + return map.name; + } + return languages[0].name; +} + +void CAddonType::SetType(TYPE type) +{ + m_type = type; +} + void CAddonType::SetProvides(const std::string& content) { if (!content.empty()) @@ -52,6 +83,19 @@ void CAddonType::SetProvides(const std::string& content) } } +void CAddonType::SetLanguage(const std::string& name) +{ + for (const LanguageMapping& map : languages) + { + if (map.name == name) + { + m_language = map.language; + return; + } + } + m_language = AddonLanguage::Unknown; +} + bool CAddonType::IsDependencyType(TYPE type) { return dependencyTypes.find(type) != dependencyTypes.end(); diff --git a/xbmc/addons/addoninfo/AddonType.h b/xbmc/addons/addoninfo/AddonType.h index 36b43a8cf687a..9d0ff1041874f 100644 --- a/xbmc/addons/addoninfo/AddonType.h +++ b/xbmc/addons/addoninfo/AddonType.h @@ -18,6 +18,14 @@ class TiXmlElement; namespace ADDON { +enum class AddonLanguage +{ + Unknown, + C, + CPP, + Python3 +}; + typedef enum { ADDON_UNKNOWN, @@ -77,11 +85,13 @@ class CAddonDatabaseSerializer; class CAddonType : public CAddonExtensions { public: - CAddonType(TYPE type = ADDON_UNKNOWN) : m_type(type) {} + CAddonType(TYPE type, AddonLanguage lang) : m_type(type), m_language(lang) {} TYPE Type() const { return m_type; } std::string LibPath() const; const std::string& LibName() const { return m_libname; } + AddonLanguage Language() const { return m_language; } + const std::string& LanguageName() const; bool ProvidesSubContent(const TYPE& content) const { @@ -111,9 +121,12 @@ class CAddonType : public CAddonExtensions friend class CAddonInfoBuilder; friend class CAddonDatabaseSerializer; + void SetType(TYPE type); void SetProvides(const std::string& content); + void SetLanguage(const std::string& name); TYPE m_type; + AddonLanguage m_language; std::string m_path; std::string m_libname; std::set m_providedSubContent; diff --git a/xbmc/addons/binary-addons/AddonDll.cpp b/xbmc/addons/binary-addons/AddonDll.cpp deleted file mode 100644 index 8e775a278781b..0000000000000 --- a/xbmc/addons/binary-addons/AddonDll.cpp +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "AddonDll.h" - -#include "ServiceBroker.h" -#include "addons/AddonStatusHandler.h" -#include "addons/binary-addons/BinaryAddonBase.h" -#include "addons/binary-addons/BinaryAddonManager.h" -#include "addons/settings/AddonSettings.h" -#include "events/EventLog.h" -#include "events/NotificationEvent.h" -#include "filesystem/File.h" -#include "filesystem/SpecialProtocol.h" -#include "messaging/helpers/DialogOKHelper.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" -#include "utils/log.h" - -#include - -using namespace KODI::MESSAGING; - -namespace ADDON -{ - -CAddonDll::CAddonDll(const AddonInfoPtr& addonInfo, BinaryAddonBasePtr addonBase) - : CAddon(addonInfo, addonInfo->MainType()), m_binaryAddonBase(std::move(addonBase)) -{ -} - -CAddonDll::CAddonDll(const AddonInfoPtr& addonInfo, TYPE addonType) - : CAddon(addonInfo, addonType), - m_binaryAddonBase(CServiceBroker::GetBinaryAddonManager().GetRunningAddonBase(addonInfo->ID())) -{ -} - -CAddonDll::~CAddonDll() -{ - if (m_initialized) - Destroy(); -} - -std::string CAddonDll::GetDllPath(const std::string &libPath) -{ - std::string strFileName = libPath; - std::string strLibName = URIUtils::GetFileName(strFileName); - - if (strLibName.empty()) - return ""; - - /* Check if lib being loaded exists, else check in XBMC binary location */ -#if defined(TARGET_ANDROID) - if (XFILE::CFile::Exists(strFileName)) - { - bool doCopy = true; - std::string dstfile = URIUtils::AddFileToFolder(CSpecialProtocol::TranslatePath("special://xbmcaltbinaddons/"), strLibName); - - struct __stat64 dstFileStat; - if (XFILE::CFile::Stat(dstfile, &dstFileStat) == 0) - { - struct __stat64 srcFileStat; - if (XFILE::CFile::Stat(strFileName, &srcFileStat) == 0) - { - if (dstFileStat.st_size == srcFileStat.st_size && dstFileStat.st_mtime > srcFileStat.st_mtime) - doCopy = false; - } - } - - if (doCopy) - { - CLog::Log(LOGDEBUG, "ADDON: caching {} to {}", strFileName, dstfile); - XFILE::CFile::Copy(strFileName, dstfile); - } - - strFileName = dstfile; - } - if (!XFILE::CFile::Exists(strFileName)) - { - std::string tempbin = getenv("KODI_ANDROID_LIBS"); - strFileName = tempbin + "/" + strLibName; - } -#endif - - if (!XFILE::CFile::Exists(strFileName)) - { - std::string strAltFileName; - - std::string altbin = CSpecialProtocol::TranslatePath("special://xbmcaltbinaddons/"); - if (!altbin.empty()) - { - strAltFileName = altbin + strLibName; - if (!XFILE::CFile::Exists(strAltFileName)) - { - std::string temp = CSpecialProtocol::TranslatePath("special://xbmc/addons/"); - strAltFileName = strFileName; - strAltFileName.erase(0, temp.size()); - strAltFileName = altbin + strAltFileName; - } - CLog::Log(LOGDEBUG, "ADDON: Trying to load {}", strAltFileName); - } - - if (XFILE::CFile::Exists(strAltFileName)) - strFileName = strAltFileName; - else - { - std::string temp = CSpecialProtocol::TranslatePath("special://xbmc/"); - std::string tempbin = CSpecialProtocol::TranslatePath("special://xbmcbin/"); - strFileName.erase(0, temp.size()); - strFileName = tempbin + strFileName; - if (!XFILE::CFile::Exists(strFileName)) - { - CLog::Log(LOGERROR, "ADDON: Could not locate {}", strLibName); - strFileName.clear(); - } - } - } - - return strFileName; -} - -std::string CAddonDll::LibPath() const -{ - return GetDllPath(CAddon::LibPath()); -} - -bool CAddonDll::LoadDll() -{ - if (m_pDll) - return true; - - std::string strFileName = LibPath(); - if (strFileName.empty()) - return false; - - /* Load the Dll */ - m_pDll = new DllAddon; - m_pDll->SetFile(strFileName); - m_pDll->EnableDelayedUnload(false); - if (!m_pDll->Load()) - { - delete m_pDll; - m_pDll = nullptr; - - std::string heading = - StringUtils::Format("{}: {}", CAddonInfo::TranslateType(Type(), true), Name()); - HELPERS::ShowOKDialogLines(CVariant{heading}, CVariant{24070}, CVariant{24071}); - - return false; - } - - return true; -} - -ADDON_STATUS CAddonDll::Create(KODI_HANDLE firstKodiInstance) -{ - CLog::Log(LOGDEBUG, "ADDON: Dll Initializing - {}", Name()); - m_initialized = false; - - if (!LoadDll()) - { - return ADDON_STATUS_PERMANENT_FAILURE; - } - - /* Check versions about global parts on add-on (parts used on all types) */ - for (unsigned int id = ADDON_GLOBAL_MAIN; id <= ADDON_GLOBAL_MAX; ++id) - { - if (!CheckAPIVersion(id)) - return ADDON_STATUS_PERMANENT_FAILURE; - } - - /* Allocate the helper function class to allow crosstalk over - helper add-on headers */ - if (!Interface_Base::InitInterface(this, m_interface, firstKodiInstance)) - return ADDON_STATUS_PERMANENT_FAILURE; - - /* Call Create to make connections, initializing data or whatever is - needed to become the AddOn running */ - ADDON_STATUS status = - m_pDll->Create(&m_interface, kodi::addon::GetTypeVersion(ADDON_GLOBAL_MAIN), nullptr); - - if (status == ADDON_STATUS_OK) - { - m_initialized = true; - } - else if (status == ADDON_STATUS_NEED_SETTINGS) - { - if ((status = TransferSettings()) == ADDON_STATUS_OK) - m_initialized = true; - else - new CAddonStatusHandler(ID(), status, "", false); - } - else - { // Addon failed initialization - CLog::Log(LOGERROR, - "ADDON: Dll {} - Client returned bad status ({}) from Create and is not usable", - Name(), status); - - // @todo currently a copy and paste from other function and becomes improved. - std::string heading = - StringUtils::Format("{}: {}", CAddonInfo::TranslateType(Type(), true), Name()); - HELPERS::ShowOKDialogLines(CVariant{ heading }, CVariant{ 24070 }, CVariant{ 24071 }); - } - - return status; -} - -void CAddonDll::Destroy() -{ - /* Unload library file */ - if (m_pDll) - { - if (m_interface.toAddon->destroy) - m_interface.toAddon->destroy(); - m_pDll->Unload(); - } - - Interface_Base::DeInitInterface(m_interface); - - if (m_pDll) - { - delete m_pDll; - m_pDll = nullptr; - CLog::Log(LOGINFO, "ADDON: Dll Destroyed - {}", Name()); - } - - ResetSettings(); - - m_initialized = false; -} - -ADDON_STATUS CAddonDll::CreateInstance(ADDON_TYPE instanceType, - ADDON_INSTANCE_HANDLER instanceClass, - const std::string& instanceID, - KODI_HANDLE instance, - KODI_HANDLE parentInstance) -{ - ADDON_STATUS status = ADDON_STATUS_OK; - - if (!m_initialized) - status = Create(instance); - if (status != ADDON_STATUS_OK) - return status; - - /* Check version of requested instance type */ - if (!CheckAPIVersion(instanceType)) - return ADDON_STATUS_PERMANENT_FAILURE; - - KODI_HANDLE addonInstance = nullptr; - status = m_interface.toAddon->create_instance(instanceType, instanceID.c_str(), instance, - kodi::addon::GetTypeVersion(instanceType), - &addonInstance, parentInstance); - - if (addonInstance) - { - m_usedInstances[instanceClass] = std::make_pair(instanceType, addonInstance); - } - - return status; -} - -void CAddonDll::DestroyInstance(ADDON_INSTANCE_HANDLER instanceClass) -{ - if (m_usedInstances.empty()) - return; - - auto it = m_usedInstances.find(instanceClass); - if (it != m_usedInstances.end()) - { - m_interface.toAddon->destroy_instance(it->second.first, it->second.second); - m_usedInstances.erase(it); - } - - if (m_usedInstances.empty()) - Destroy(); -} - -bool CAddonDll::IsInUse() const -{ - if (m_informer) - return m_informer->IsInUse(ID()); - return false; -} - -void CAddonDll::RegisterInformer(CAddonDllInformer* informer) -{ - m_informer = informer; -} - -AddonPtr CAddonDll::GetRunningInstance() const -{ - if (CServiceBroker::IsBinaryAddonCacheUp()) - return CServiceBroker::GetBinaryAddonManager().GetRunningAddon(ID()); - - return AddonPtr(); -} - -void CAddonDll::OnPreInstall() -{ - if (m_binaryAddonBase) - m_binaryAddonBase->OnPreInstall(); -} - -void CAddonDll::OnPostInstall(bool update, bool modal) -{ - if (m_binaryAddonBase) - m_binaryAddonBase->OnPostInstall(update, modal); -} - -void CAddonDll::OnPreUnInstall() -{ - if (m_binaryAddonBase) - m_binaryAddonBase->OnPreUnInstall(); -} - -void CAddonDll::OnPostUnInstall() -{ - if (m_binaryAddonBase) - m_binaryAddonBase->OnPostUnInstall(); -} - -bool CAddonDll::DllLoaded(void) const -{ - return m_pDll != nullptr; -} - -AddonVersion CAddonDll::GetTypeVersionDll(int type) const -{ - return AddonVersion(m_pDll ? m_pDll->GetAddonTypeVersion(type) : nullptr); -} - -AddonVersion CAddonDll::GetTypeMinVersionDll(int type) const -{ - return AddonVersion(m_pDll ? m_pDll->GetAddonTypeMinVersion(type) : nullptr); -} - -void CAddonDll::SaveSettings() -{ - // must save first, as TransferSettings() reloads saved settings! - CAddon::SaveSettings(); - if (m_initialized) - TransferSettings(); -} - -ADDON_STATUS CAddonDll::TransferSettings() -{ - if (!m_interface.toAddon->set_setting) - return ADDON_STATUS_NOT_IMPLEMENTED; - - bool restart = false; - ADDON_STATUS reportStatus = ADDON_STATUS_OK; - - CLog::Log(LOGDEBUG, "Calling TransferSettings for: {}", Name()); - - LoadSettings(false); - - auto settings = GetSettings(); - if (settings != nullptr) - { - for (const auto& section : settings->GetSections()) - { - for (const auto& category : section->GetCategories()) - { - for (const auto& group : category->GetGroups()) - { - for (const auto& setting : group->GetSettings()) - { - ADDON_STATUS status = ADDON_STATUS_OK; - const char* id = setting->GetId().c_str(); - switch (setting->GetType()) - { - case SettingType::Boolean: - { - bool tmp = std::static_pointer_cast(setting)->GetValue(); - status = m_interface.toAddon->set_setting(id, &tmp); - break; - } - - case SettingType::Integer: - { - int tmp = std::static_pointer_cast(setting)->GetValue(); - status = m_interface.toAddon->set_setting(id, &tmp); - break; - } - - case SettingType::Number: - { - float tmpf = static_cast(std::static_pointer_cast(setting)->GetValue()); - status = m_interface.toAddon->set_setting(id, &tmpf); - break; - } - - case SettingType::String: - status = m_interface.toAddon->set_setting( - id, std::static_pointer_cast(setting)->GetValue().c_str()); - break; - - default: - // log unknowns as an error, but go ahead and transfer the string - CLog::Log(LOGERROR, "Unknown setting type of '{}' for {}", id, Name()); - status = m_interface.toAddon->set_setting(id, setting->ToString().c_str()); - break; - } - - if (status == ADDON_STATUS_NEED_RESTART) - restart = true; - else if (status != ADDON_STATUS_OK) - reportStatus = status; - } - } - } - } - } - - if (restart || reportStatus != ADDON_STATUS_OK) - { - new CAddonStatusHandler(ID(), restart ? ADDON_STATUS_NEED_RESTART : reportStatus, "", true); - } - - return ADDON_STATUS_OK; -} - -bool CAddonDll::CheckAPIVersion(int type) -{ - /* check the API version */ - AddonVersion kodiMinVersion(kodi::addon::GetTypeMinVersion(type)); - AddonVersion addonVersion(m_pDll->GetAddonTypeVersion(type)); - AddonVersion addonMinVersion = m_pDll->GetAddonTypeMinVersion_available() - ? AddonVersion(m_pDll->GetAddonTypeMinVersion(type)) - : addonVersion; - - /* Check the global usage from addon - * if not used from addon, empty version is returned - */ - if (type <= ADDON_GLOBAL_MAX && addonVersion.empty()) - return true; - - /* If a instance (not global) version becomes checked must be the version - * present. - */ - if (kodiMinVersion > addonVersion || - addonMinVersion > AddonVersion(kodi::addon::GetTypeVersion(type))) - { - CLog::Log(LOGERROR, "Add-on '{}' is using an incompatible API version for type '{}'. Kodi API min version = '{}/{}', add-on API version '{}/{}'", - Name(), - kodi::addon::GetTypeName(type), - kodi::addon::GetTypeVersion(type), - kodiMinVersion.asString(), - addonMinVersion.asString(), - addonVersion.asString()); - - if (CServiceBroker::GetGUI()) - { - CEventLog &eventLog = CServiceBroker::GetEventLog(); - eventLog.AddWithNotification(EventPtr(new CNotificationEvent(Name(), 24152, EventLevel::Error))); - } - - return false; - } - - return true; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/binary-addons/AddonDll.h b/xbmc/addons/binary-addons/AddonDll.h deleted file mode 100644 index 47f9f286766a8..0000000000000 --- a/xbmc/addons/binary-addons/AddonDll.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "BinaryAddonManager.h" -#include "DllAddon.h" -#include "addons/Addon.h" -#include "utils/XMLUtils.h" - -// Global addon callback handle classes -#include "addons/interfaces/AddonBase.h" - -namespace ADDON -{ - -/*! - * Addon instance handler, used as identify for std::map to find related - * addon instance. This class itself not accessed here. - * - * @todo As long game addon system use CAddonDll itself and not - * IAddonInstanceHandler as parent, is the set of this as "void*" needed. - * After game system is changed should by this also changed to - * "const IAddonInstanceHandler*" or direct in map below. - */ -using ADDON_INSTANCE_HANDLER = const void*; - -/*! - * @brief Information class for use on addon type managers. - * - * This to query via @ref CAddonDll the manager so that work can be performed. - * If there are multiple instances it be harder to be informed about any changes. - */ -class CAddonDllInformer -{ -public: - virtual bool IsInUse(const std::string& id) = 0; -}; - -class CAddonDll : public CAddon -{ -public: - CAddonDll(const AddonInfoPtr& addonInfo, BinaryAddonBasePtr addonBase); - CAddonDll(const AddonInfoPtr& addonInfo, TYPE addonType); - ~CAddonDll() override; - - // Implementation of IAddon via CAddon - std::string LibPath() const override; - - // addon settings - void SaveSettings() override; - - bool DllLoaded(void) const; - - /*! - * @brief Get api version of moduleType type - * - * @return The version of requested type, if dll is loaded and supported by addon. - * If one of both do not match, an empty version is returned. - * - * @note This should only be called if the associated dll is loaded. - * Otherwise use @ref CAddonInfo::DependencyVersion(...) - */ - AddonVersion GetTypeVersionDll(int type) const; - - /*! - * @brief Get api min version of moduleType type - * - * @return The version of requested type, if dll is loaded and supported by addon. - * If one of both do not match, an empty version is returned. - * - * @note This should only be called if the associated dll is loaded. - * Otherwise use @ref CAddonInfo::DependencyMinVersion(...) - */ - AddonVersion GetTypeMinVersionDll(int type) const; - - /*! - * @brief Function to create a addon instance class - * - * @param[in] instanceType The wanted instance type class to open on addon - * @param[in] instanceClass The from Kodi used class for active instance - * @param[in] instanceID The from addon used ID string of active instance - * @param[in] instance Pointer where the interface functions from addon - * becomes stored during his instance creation. - * @param[in] parentInstance In case the instance class is related to another - * addon instance class becomes with the pointer - * given to addon. Is optional and most addon types - * not use it. - * @return The status of addon after the creation. - */ - ADDON_STATUS CreateInstance(ADDON_TYPE instanceType, - ADDON_INSTANCE_HANDLER instanceClass, - const std::string& instanceID, - KODI_HANDLE instance, - KODI_HANDLE parentInstance = nullptr); - - /*! - * @brief Function to destroy a on addon created instance class - * - * @param[in] instanceClass The from Kodi used class for active instance - */ - void DestroyInstance(ADDON_INSTANCE_HANDLER instanceClass); - - bool IsInUse() const override; - void RegisterInformer(CAddonDllInformer* informer); - AddonPtr GetRunningInstance() const override; - - void OnPreInstall() override; - void OnPostInstall(bool update, bool modal) override; - void OnPreUnInstall() override; - void OnPostUnInstall() override; - - bool Initialized() const { return m_initialized; } - -protected: - static std::string GetDllPath(const std::string& strFileName); - - std::string m_parentLib; - -private: - /*! - * @brief Main addon creation call function - * - * This becomes called only one time before a addon instance becomes created. - * If another instance becomes requested is this Create no more used. To see - * like a "int main()" on exe. - * - * @param[in] firstKodiInstance The first instance who becomes used. - * In case addon supports only one instance - * and not multiple together can addon use - * only one complete class for everything. - * This is used then to interact on interface. - * @return The status of addon after the creation. - */ - ADDON_STATUS Create(KODI_HANDLE firstKodiInstance); - - /*! - * @brief Main addon destroying call function - * - * This becomes called only one time after the last addon instance becomes destroyed. - */ - void Destroy(); - - bool CheckAPIVersion(int type); - - BinaryAddonBasePtr m_binaryAddonBase = nullptr; - DllAddon* m_pDll = nullptr; - bool m_initialized = false; - bool LoadDll(); - std::map> m_usedInstances; - CAddonDllInformer* m_informer = nullptr; - - virtual ADDON_STATUS TransferSettings(); - - /*! - * This structure, which is fixed to the addon headers, makes use of the at - * least supposed parts for the interface. - * This structure is defined in: - * /xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h - */ - AddonGlobalInterface m_interface = {}; -}; - -} /* namespace ADDON */ diff --git a/xbmc/addons/binary-addons/AddonInstanceHandler.cpp b/xbmc/addons/binary-addons/AddonInstanceHandler.cpp deleted file mode 100644 index fb2adad335d10..0000000000000 --- a/xbmc/addons/binary-addons/AddonInstanceHandler.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "AddonInstanceHandler.h" - -#include "ServiceBroker.h" -#include "utils/StringUtils.h" -#include "utils/log.h" - -namespace ADDON -{ - -CCriticalSection IAddonInstanceHandler::m_cdSec; - -IAddonInstanceHandler::IAddonInstanceHandler(ADDON_TYPE type, - const AddonInfoPtr& addonInfo, - KODI_HANDLE parentInstance /* = nullptr*/, - const std::string& instanceID /* = ""*/) - : m_type(type), m_parentInstance(parentInstance), m_addonInfo(addonInfo) -{ - // if no special instance ID is given generate one from class pointer (is - // faster as unique id and also safe enough for them). - m_instanceId = !instanceID.empty() ? instanceID : StringUtils::Format("{}", fmt::ptr(this)); - m_addonBase = CServiceBroker::GetBinaryAddonManager().GetAddonBase(addonInfo, this, m_addon); -} - -IAddonInstanceHandler::~IAddonInstanceHandler() -{ - CServiceBroker::GetBinaryAddonManager().ReleaseAddonBase(m_addonBase, this); -} - -std::string IAddonInstanceHandler::ID() const -{ - return m_addon ? m_addon->ID() : ""; -} - -std::string IAddonInstanceHandler::Name() const -{ - return m_addon ? m_addon->Name() : ""; -} - -std::string IAddonInstanceHandler::Author() const -{ - return m_addon ? m_addon->Author() : ""; -} - -std::string IAddonInstanceHandler::Icon() const -{ - return m_addon ? m_addon->Icon() : ""; -} - -std::string IAddonInstanceHandler::Path() const -{ - return m_addon ? m_addon->Path() : ""; -} - -std::string IAddonInstanceHandler::Profile() const -{ - return m_addon ? m_addon->Profile() : ""; -} - -AddonVersion IAddonInstanceHandler::Version() const -{ - return m_addon ? m_addon->Version() : AddonVersion(); -} - -ADDON_STATUS IAddonInstanceHandler::CreateInstance(KODI_HANDLE instance) -{ - if (!m_addon) - return ADDON_STATUS_UNKNOWN; - - CSingleLock lock(m_cdSec); - - ADDON_STATUS status = - m_addon->CreateInstance(m_type, this, m_instanceId, instance, m_parentInstance); - if (status != ADDON_STATUS_OK) - { - CLog::Log(LOGERROR, - "IAddonInstanceHandler::{}: {} returned bad status \"{}\" during instance creation", - __FUNCTION__, m_addon->ID(), kodi::TranslateAddonStatus(status)); - } - return status; -} - -void IAddonInstanceHandler::DestroyInstance() -{ - CSingleLock lock(m_cdSec); - if (m_addon) - m_addon->DestroyInstance(this); -} - -} /* namespace ADDON */ - diff --git a/xbmc/addons/binary-addons/AddonInstanceHandler.h b/xbmc/addons/binary-addons/AddonInstanceHandler.h deleted file mode 100644 index 16632652b9f06..0000000000000 --- a/xbmc/addons/binary-addons/AddonInstanceHandler.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "AddonDll.h" -#include "addons/AddonVersion.h" -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" - -#include - -namespace ADDON -{ - - class IAddonInstanceHandler - { - public: - IAddonInstanceHandler(ADDON_TYPE type, - const AddonInfoPtr& addonInfo, - KODI_HANDLE parentInstance = nullptr, - const std::string& instanceID = ""); - virtual ~IAddonInstanceHandler(); - - ADDON_TYPE UsedType() const { return m_type; } - const std::string& InstanceID() { return m_instanceId; } - - std::string ID() const; - std::string Name() const; - std::string Author() const; - std::string Icon() const; - std::string Path() const; - std::string Profile() const; - AddonVersion Version() const; - - ADDON_STATUS CreateInstance(KODI_HANDLE instance); - void DestroyInstance(); - const AddonDllPtr& Addon() const { return m_addon; } - AddonInfoPtr GetAddonInfo() const { return m_addonInfo; } - - virtual void OnPreInstall() {} - virtual void OnPostInstall(bool update, bool modal) {} - virtual void OnPreUnInstall() {} - virtual void OnPostUnInstall() {} - - private: - ADDON_TYPE m_type; - std::string m_instanceId; - KODI_HANDLE m_parentInstance; - AddonInfoPtr m_addonInfo; - BinaryAddonBasePtr m_addonBase; - AddonDllPtr m_addon; - static CCriticalSection m_cdSec; - }; - -} /* namespace ADDON */ - diff --git a/xbmc/addons/binary-addons/BinaryAddonBase.cpp b/xbmc/addons/binary-addons/BinaryAddonBase.cpp deleted file mode 100644 index 5285e7069d008..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonBase.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "BinaryAddonBase.h" - -#include "threads/SingleLock.h" -#include "utils/log.h" - -using namespace ADDON; - -const std::string& CBinaryAddonBase::ID() const -{ - return m_addonInfo->ID(); -} - -AddonDllPtr CBinaryAddonBase::GetAddon(IAddonInstanceHandler* handler) -{ - if (handler == nullptr) - { - CLog::Log(LOGERROR, "CBinaryAddonBase::{}: for Id '{}' called with empty instance handler", - __FUNCTION__, ID()); - return nullptr; - } - - CSingleLock lock(m_critSection); - - // If no 'm_activeAddon' is defined create it new. - if (m_activeAddon == nullptr) - m_activeAddon = std::make_shared(m_addonInfo, shared_from_this()); - - // add the instance handler to the info to know used amount on addon - m_activeAddonHandlers.insert(handler); - - return m_activeAddon; -} - -void CBinaryAddonBase::ReleaseAddon(IAddonInstanceHandler* handler) -{ - if (handler == nullptr) - { - CLog::Log(LOGERROR, "CBinaryAddonBase::{}: for Id '{}' called with empty instance handler", - __FUNCTION__, ID()); - return; - } - - CSingleLock lock(m_critSection); - - auto presentHandler = m_activeAddonHandlers.find(handler); - if (presentHandler == m_activeAddonHandlers.end()) - return; - - m_activeAddonHandlers.erase(presentHandler); - - // if no handler is present anymore reset and delete the add-on class on informations - if (m_activeAddonHandlers.empty()) - { - m_activeAddon.reset(); - } -} - -size_t CBinaryAddonBase::UsedInstanceCount() const -{ - CSingleLock lock(m_critSection); - return m_activeAddonHandlers.size(); -} - -AddonDllPtr CBinaryAddonBase::GetActiveAddon() -{ - CSingleLock lock(m_critSection); - return m_activeAddon; -} - -void CBinaryAddonBase::OnPreInstall() -{ - const std::unordered_set activeAddonHandlers = m_activeAddonHandlers; - for (const auto& instance : activeAddonHandlers) - instance->OnPreInstall(); -} - -void CBinaryAddonBase::OnPostInstall(bool update, bool modal) -{ - const std::unordered_set activeAddonHandlers = m_activeAddonHandlers; - for (const auto& instance : activeAddonHandlers) - instance->OnPostInstall(update, modal); -} - -void CBinaryAddonBase::OnPreUnInstall() -{ - const std::unordered_set activeAddonHandlers = m_activeAddonHandlers; - for (const auto& instance : activeAddonHandlers) - instance->OnPreUnInstall(); -} - -void CBinaryAddonBase::OnPostUnInstall() -{ - const std::unordered_set activeAddonHandlers = m_activeAddonHandlers; - for (const auto& instance : activeAddonHandlers) - instance->OnPostUnInstall(); -} diff --git a/xbmc/addons/binary-addons/BinaryAddonBase.h b/xbmc/addons/binary-addons/BinaryAddonBase.h deleted file mode 100644 index 4027f9d71d152..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonBase.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "AddonInstanceHandler.h" -#include "addons/addoninfo/AddonInfo.h" -#include "threads/CriticalSection.h" - -#include -#include -#include - -namespace ADDON -{ - - class IAddonInstanceHandler; - - class CAddonDll; - typedef std::shared_ptr AddonDllPtr; - - class CBinaryAddonBase : public std::enable_shared_from_this - { - public: - explicit CBinaryAddonBase(const AddonInfoPtr& addonInfo) : m_addonInfo(addonInfo) { } - - const std::string& ID() const; - - AddonDllPtr GetAddon(IAddonInstanceHandler* handler); - void ReleaseAddon(IAddonInstanceHandler* handler); - size_t UsedInstanceCount() const; - - AddonDllPtr GetActiveAddon(); - - void OnPreInstall(); - void OnPostInstall(bool update, bool modal); - void OnPreUnInstall(); - void OnPostUnInstall(); - - private: - AddonInfoPtr m_addonInfo; - - mutable CCriticalSection m_critSection; - AddonDllPtr m_activeAddon; - std::unordered_set m_activeAddonHandlers; - }; - -} /* namespace ADDON */ diff --git a/xbmc/addons/binary-addons/BinaryAddonManager.cpp b/xbmc/addons/binary-addons/BinaryAddonManager.cpp deleted file mode 100644 index ee927acda5acd..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonManager.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "BinaryAddonManager.h" - -#include "BinaryAddonBase.h" -#include "threads/SingleLock.h" -#include "utils/log.h" - -using namespace ADDON; - -BinaryAddonBasePtr CBinaryAddonManager::GetAddonBase(const AddonInfoPtr& addonInfo, - IAddonInstanceHandler* handler, - AddonDllPtr& addon) -{ - CSingleLock lock(m_critSection); - - BinaryAddonBasePtr addonBase; - - const auto& addonInstances = m_runningAddons.find(addonInfo->ID()); - if (addonInstances != m_runningAddons.end()) - { - addonBase = addonInstances->second; - } - else - { - addonBase = std::make_shared(addonInfo); - - m_runningAddons.emplace(addonInfo->ID(), addonBase); - } - - if (addonBase) - { - addon = addonBase->GetAddon(handler); - } - if (!addon) - { - CLog::Log(LOGFATAL, "CBinaryAddonManager::{}: Tried to get add-on '{}' who not available!", - __func__, addonInfo->ID()); - } - - return addonBase; -} - -void CBinaryAddonManager::ReleaseAddonBase(const BinaryAddonBasePtr& addonBase, - IAddonInstanceHandler* handler) -{ - const auto& addon = m_runningAddons.find(addonBase->ID()); - if (addon == m_runningAddons.end()) - return; - - addonBase->ReleaseAddon(handler); - - if (addonBase->UsedInstanceCount() > 0) - return; - - m_runningAddons.erase(addon); -} - -BinaryAddonBasePtr CBinaryAddonManager::GetRunningAddonBase(const std::string& addonId) const -{ - CSingleLock lock(m_critSection); - - const auto& addonInstances = m_runningAddons.find(addonId); - if (addonInstances != m_runningAddons.end()) - return addonInstances->second; - - return nullptr; -} - -AddonPtr CBinaryAddonManager::GetRunningAddon(const std::string& addonId) const -{ - CSingleLock lock(m_critSection); - - const BinaryAddonBasePtr base = GetRunningAddonBase(addonId); - if (base) - return base->GetActiveAddon(); - - return nullptr; -} diff --git a/xbmc/addons/binary-addons/BinaryAddonManager.h b/xbmc/addons/binary-addons/BinaryAddonManager.h deleted file mode 100644 index a6328e175808d..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonManager.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/AddonManager.h" -#include "threads/CriticalSection.h" - -#include - -namespace ADDON -{ - - class IAddonInstanceHandler; - - class CAddonDll; - typedef std::shared_ptr AddonDllPtr; - - class CBinaryAddonBase; - typedef std::shared_ptr BinaryAddonBasePtr; - - class CBinaryAddonManager - { - public: - CBinaryAddonManager() = default; - CBinaryAddonManager(const CBinaryAddonManager&) = delete; - ~CBinaryAddonManager() = default; - - /*! - * @brief Create or get available addon instance handle base. - * - * On first call the binary addon base class becomes created, on every next - * call of addon id, this becomes given again and a counter about in - * @ref CBinaryAddonBase increased. - * - * @param[in] addonBase related addon base to release - * @param[in] handler related instance handle class - * - * @warning This and @ref ReleaseAddonBase are only be called from - * @ref IAddonInstanceHandler, use nowhere else allowed! - * - */ - BinaryAddonBasePtr GetAddonBase(const AddonInfoPtr& addonInfo, - IAddonInstanceHandler* handler, - AddonDllPtr& addon); - - /*! - * @brief Release a running addon instance handle base. - * - * On last release call the here on map stored entry becomes - * removed and the dll unloaded. - * - * @param[in] addonBase related addon base to release - * @param[in] handler related instance handle class - * - */ - void ReleaseAddonBase(const BinaryAddonBasePtr& addonBase, IAddonInstanceHandler* handler); - - /*! - * @brief Get running addon base class for a given addon id. - * - * @param[in] addonId the addon id - * @return running addon base class if found, nullptr otherwise. - * - */ - BinaryAddonBasePtr GetRunningAddonBase(const std::string& addonId) const; - - /*! - * @brief Used from other addon manager to get active addon over a from him - * created CAddonDll. - * - * @param[in] addonId related addon id string - * @return if present the pointer to active one or nullptr if not present - * - */ - AddonPtr GetRunningAddon(const std::string& addonId) const; - - private: - mutable CCriticalSection m_critSection; - - std::map m_runningAddons; - }; - -} /* namespace ADDON */ diff --git a/xbmc/addons/binary-addons/CMakeLists.txt b/xbmc/addons/binary-addons/CMakeLists.txt deleted file mode 100644 index 33a72ce6b6a18..0000000000000 --- a/xbmc/addons/binary-addons/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCES BinaryAddonManager.cpp - AddonDll.cpp - AddonInstanceHandler.cpp - BinaryAddonBase.cpp) - -set(HEADERS BinaryAddonManager.h - AddonDll.h - AddonInstanceHandler.h - BinaryAddonBase.h - DllAddon.h) - -core_add_library(addons_binary-addons) diff --git a/xbmc/addons/binary-addons/DllAddon.h b/xbmc/addons/binary-addons/DllAddon.h deleted file mode 100644 index d5b5e48fd0dd6..0000000000000 --- a/xbmc/addons/binary-addons/DllAddon.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "DynamicDll.h" -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" - -class DllAddonInterface -{ -public: - virtual ~DllAddonInterface() = default; - virtual ADDON_STATUS Create(void* cb, const char* globalApiVersion, void* info) = 0; - virtual const char* GetAddonTypeVersion(int type)=0; - virtual const char* GetAddonTypeMinVersion(int type) = 0; -}; - -class DllAddon : public DllDynamic, public DllAddonInterface -{ -public: - DECLARE_DLL_WRAPPER_TEMPLATE(DllAddon) - DEFINE_METHOD3(ADDON_STATUS, Create, (void* p1, const char* p2, void* p3)) - DEFINE_METHOD1(const char*, GetAddonTypeVersion, (int p1)) - DEFINE_METHOD1(const char*, GetAddonTypeMinVersion, (int p1)) - bool GetAddonTypeMinVersion_available() { return m_GetAddonTypeMinVersion != nullptr; } - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(ADDON_Create, Create) - RESOLVE_METHOD_RENAME(ADDON_GetTypeVersion, GetAddonTypeVersion) - RESOLVE_METHOD_RENAME_OPTIONAL(ADDON_GetTypeMinVersion, GetAddonTypeMinVersion) - END_METHOD_RESOLVE() -}; - diff --git a/xbmc/addons/gui/GUIDialogAddonInfo.cpp b/xbmc/addons/gui/GUIDialogAddonInfo.cpp index f913ca0587a13..1435e634743b0 100644 --- a/xbmc/addons/gui/GUIDialogAddonInfo.cpp +++ b/xbmc/addons/gui/GUIDialogAddonInfo.cpp @@ -17,6 +17,7 @@ #include "addons/AddonManager.h" #include "addons/AddonRepos.h" #include "addons/AddonSystemSettings.h" +#include "addons/AudioDecoder.h" #include "addons/IAddon.h" #include "addons/gui/GUIDialogAddonSettings.h" #include "addons/gui/GUIHelpers.h" @@ -57,6 +58,7 @@ #define CONTROL_LIST_SCREENSHOTS 50 using namespace KODI; +using namespace KODI::ADDONS; using namespace ADDON; using namespace XFILE; using namespace KODI::MESSAGING; @@ -241,10 +243,20 @@ void CGUIDialogAddonInfo::UpdateControls(PerformButtonFocus performButtonFocus) CServiceBroker::GetAddonMgr().IsAutoUpdateable(m_localAddon->ID())); SET_CONTROL_LABEL(CONTROL_BTN_AUTOUPDATE, 21340); - CONTROL_ENABLE_ON_CONDITION( - CONTROL_BTN_SELECT, - m_addonEnabled && (CanOpen() || CanRun() || (CanUse() && !m_localAddon->IsInUse()))); - SET_CONTROL_LABEL(CONTROL_BTN_SELECT, CanUse() ? 21480 : (CanOpen() ? 21478 : 21479)); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SELECT, + m_addonEnabled && (CanShowSupportList() || CanOpen() || CanRun() || + (CanUse() && !m_localAddon->IsInUse()))); + + int label; + if (CanShowSupportList()) + label = 21484; + else if (CanUse()) + label = 21480; + else if (CanOpen()) + label = 21478; + else + label = 21479; + SET_CONTROL_LABEL(CONTROL_BTN_SELECT, label); CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SETTINGS, isInstalled && m_localAddon->HasSettings()); if (isInstalled && m_localAddon->HasSettings() && performButtonFocus == PerformButtonFocus::YES) @@ -471,6 +483,12 @@ void CGUIDialogAddonInfo::OnSelect() if (!m_localAddon) return; + if (CanShowSupportList()) + { + ShowSupportList(); + return; + } + Close(); if (CanOpen() || CanRun()) @@ -507,6 +525,11 @@ bool CGUIDialogAddonInfo::CanUse() const m_localAddon->Type() == ADDON_RESOURCE_UISOUNDS); } +bool CGUIDialogAddonInfo::CanShowSupportList() const +{ + return m_localAddon && m_localAddon->Type() == ADDON_AUDIODECODER; +} + bool CGUIDialogAddonInfo::PromptIfDependency(int heading, int line2) { if (!m_localAddon) @@ -710,6 +733,44 @@ bool CGUIDialogAddonInfo::ShowDependencyList(Reactivate reactivate, EntryPoint e return true; } +bool CGUIDialogAddonInfo::ShowSupportList() +{ + std::vector list; + if (m_localAddon->Type() == ADDON_AUDIODECODER) + CServiceBroker::GetAudioDecoderSupportList().GetSupportedPartsList(m_localAddon->ID(), list); + + auto pDialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_SELECT); + CFileItemList items; + for (const auto& entry : list) + { + // Ignore included extension about track support + if (StringUtils::EndsWith(entry.m_name, KODI_ADDON_AUDIODECODER_TRACK_EXT)) + continue; + + const CFileItemPtr item = std::make_shared(entry.m_name); + item->SetLabel2(entry.m_description); + if (!entry.m_icon.empty()) + item->SetArt("icon", entry.m_icon); + else if (entry.m_type == AddonSupportType::Extension) + item->SetArt("icon", "DefaultExtensionInfo.png"); + else if (entry.m_type == AddonSupportType::Mimetype) + item->SetArt("icon", "DefaultMimetypeInfo.png"); + item->SetProperty("addon_id", m_localAddon->ID()); + items.Add(item); + } + + pDialog->Reset(); + pDialog->SetHeading(21485); + pDialog->SetUseDetails(true); + for (auto& it : items) + pDialog->Add(*it); + pDialog->SetButtonFocus(true); + pDialog->Open(); + + return true; +} + bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item) { if (!item) diff --git a/xbmc/addons/gui/GUIDialogAddonInfo.h b/xbmc/addons/gui/GUIDialogAddonInfo.h index 3ac4dbb524a5d..697102141fd1a 100644 --- a/xbmc/addons/gui/GUIDialogAddonInfo.h +++ b/xbmc/addons/gui/GUIDialogAddonInfo.h @@ -106,6 +106,11 @@ class CGUIDialogAddonInfo : public CGUIDialog */ bool CanUse() const; + /*! + * @brief Returns true if current addon can be show list about supported parts + */ + bool CanShowSupportList() const; + /*! * @brief check if the add-on is a dependency of others, and if so prompt the user. * @@ -124,6 +129,11 @@ class CGUIDialogAddonInfo : public CGUIDialog */ bool ShowDependencyList(Reactivate reactivate, EntryPoint entryPoint); + /*! + * @brief Show a dialog with the addon's supported extensions and mimetypes. + */ + bool ShowSupportList(); + /*! * @brief Used to build up the dependency list shown by @ref ShowDependencyList() */ diff --git a/xbmc/addons/interface/CMakeLists.txt b/xbmc/addons/interface/CMakeLists.txt new file mode 100644 index 0000000000000..0c5e1725857a5 --- /dev/null +++ b/xbmc/addons/interface/CMakeLists.txt @@ -0,0 +1,26 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + Controller.cpp + GUICrashReporter.cpp + IMsgHdl.cpp + InstanceHandler.cpp + Interface.cpp + RunningProcess.cpp + RunningThread.cpp +) + +set(HEADERS + Controller.h + GUICrashReporter.h + IMsgHdl.h + InstanceHandler.h + Interface.h + RunningProcess.h + RunningThread.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface) +endif() diff --git a/xbmc/addons/interface/Controller.cpp b/xbmc/addons/interface/Controller.cpp new file mode 100644 index 0000000000000..dc22df232c887 --- /dev/null +++ b/xbmc/addons/interface/Controller.cpp @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "Controller.h" + +#include "CompileInfo.h" +#include "GUICrashReporter.h" +#include "RunningProcess.h" + +#include "filesystem/SpecialProtocol.h" +#include "utils/log.h" +#include "utils/StringUtils.h" + +#include + +using namespace std::chrono_literals; + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CController::CController(ADDON::CAddonMgr& addonMgr) + : CThread("KODI::ADDONS::INTERFACE::CController"), + m_addonMgr(addonMgr), + m_devkitLib(CSpecialProtocol::TranslatePath("special://xbmcbinaddons/kodi.binary.devkit/" DEVKIT_LIBRARY)) +{ +} + +CController::~CController() +{ + Deinit(); +} + +bool CController::Init() +{ + CThread::Create(); + m_running = true; + return true; +} + +void CController::Deinit() +{ + if (m_running) + { + m_running = false; + CThread::StopThread(); + } +} + +bool CController::AddonLanguageSupported(const std::shared_ptr& addon) const +{ + if (addon->Type(addon->Type())->Language() != ADDON::AddonLanguage::Unknown) + return true; + return false; +} + +bool CController::LaunchAddon(const std::shared_ptr& addon, std::vector& argv, bool waitForExit, std::shared_ptr& process) +{ + std::shared_ptr newProcess; + { + std::unique_lock lock(m_lock); + newProcess = std::make_shared(addon, + "kodi-subproc-" + StringUtils::CreateUUID(), + CheckNeedDirectDll(addon), + nullptr); + m_runningProcesses.emplace(addon->ID(), newProcess); + } + + if (!newProcess->Launch(argv, waitForExit)) + { + return false; + } + + if (waitForExit) + { + std::unique_lock lock(m_lock); + m_runningProcesses.erase(newProcess->GetAddonID()); + } + + process = newProcess; + return true; +} + +std::shared_ptr CController::GetAddonProcess(const std::shared_ptr& addonInfo, + IAddonInstanceHandler* handler, + const KODI_HANDLE kodiInstancePtr, + std::shared_ptr& addon) +{ + std::unique_lock lock(m_lock); + + std::shared_ptr newProcess; + + const auto& addonInstances = m_runningProcesses.find(addonInfo->ID()); + if (addonInstances != m_runningProcesses.end()) + { + newProcess = addonInstances->second; + addon = newProcess->GetAddon(); + } + else + { + addon = std::make_shared(addonInfo, addonInfo->MainType()); + newProcess = std::make_shared(addon, + "kodi-subproc-" + StringUtils::CreateUUID(), + CheckNeedDirectDll(addon), + kodiInstancePtr); + std::vector argv; + if (!newProcess->Launch(argv, false)) + { + return nullptr; + } + + m_runningProcesses.emplace(addonInfo->ID(), newProcess); + } + + newProcess->SetEndtime(30000); + newProcess->AddAddonInstance(handler); + + if (!addon) + { + CLog::Log(LOGFATAL, "CController:{}: Tried to get add-on '{}' who not available!", + __func__, addonInfo->ID()); + } + + return newProcess; +} + +void CController::ReleaseAddonProcess(const std::shared_ptr& process, IAddonInstanceHandler* handler) +{ + std::unique_lock lock(m_lock); + + const auto& addon = m_runningProcesses.find(process->GetAddonID()); + if (addon == m_runningProcesses.end()) + return; + + process->ReleaseAddonInstance(handler); + + if (process->UsedInstanceCount() > 0) + return; + + if (!process->UseEndTime()) + { + process->Kill(); + + m_runningProcesses.erase(addon); + } +} + +std::shared_ptr CController::GetRunningAddonProcess(const std::string& addonId) const +{ + std::unique_lock lock(m_lock); + + const auto& addonInstances = m_runningProcesses.find(addonId); + if (addonInstances != m_runningProcesses.end()) + return addonInstances->second; + + return nullptr; +} + +std::shared_ptr CController::GetRunningAddon(const std::string& addonId) const +{ + const std::shared_ptr process = GetRunningAddonProcess(addonId); + if (process) + return process->GetAddon(); + + return nullptr; +} + +std::vector CController::GetProcessInfoData() +{ + std::vector data; + + std::unique_lock lock(m_lock); + + for (const auto& process : m_runningProcesses) + { + data.emplace_back(process.second->GetProcessInfoData()); + } + + return data; +} + +void CController::Process() +{ + while (!m_bStop) + { + CThread::Sleep(500ms); + + std::unique_lock lock(m_lock); + + for (auto it = m_runningProcesses.cbegin(); it != m_runningProcesses.cend();) + { + /* + * Check the addon stopped itself, e.g. by normal way or with a crash. + */ + ChildStatus status = it->second->ProcessActive(); + if (it->second->ProcessActive() != ChildStatus::Running) + { + fprintf(stderr, "Stopped!!!!!!!!!!!!! %i\n", status); + CLog::Log(LOGFATAL, "CController::{}: Addon '{}' process was uncontrolled stopped!", __func__, it->second->GetAddonID()); + it->second->InformStopReport(status); + it->second->Kill(); + m_runningProcesses.erase(it++); + continue; + } + + /* + * Check run of addon, if it is ununsed a amount of time do a stop of it. + * This mainly relates to addons where processed by Kodi, e.g. PVR, audiodecoder + * and so on related addons. + */ + if (it->second->UseEndTime() && !it->second->IsInUse()) + { + if (it->second->EndTimeLeft() == 0) + { + fprintf(stderr, "-------------- %i\n", it->second->EndTimeLeft()); + CLog::Log(LOGDEBUG, "CController::{}: Addon '{}' process was inactive and becomes stopped", __func__, it->second->GetAddonID()); + it->second->Kill(); + m_runningProcesses.erase(it++); + continue; + } + } + + it++; + } + } +} + +bool CController::CheckNeedDirectDll(const std::shared_ptr& addon) +{ + try + { + // linux is different and has the version number after the suffix + static const std::regex libRegex("^.*" + + CCompileInfo::CCompileInfo::GetSharedLibrarySuffix() + + "\\.?[0-9]*\\.?[0-9]*\\.?[0-9]*$"); + if (std::regex_match(addon->Type(addon->MainType())->LibPath(), libRegex)) + { + return true; + } + } + catch (const std::regex_error& e) + { + CLog::Log(LOGERROR, "CAddonInfoBuilder::{}: Regex error caught: {}", __func__, + e.what()); + } + + return false; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/Controller.h b/xbmc/addons/interface/Controller.h new file mode 100644 index 0000000000000..4cf872ff9628e --- /dev/null +++ b/xbmc/addons/interface/Controller.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "Interface.h" +#include "processinfo/ProcessInfo.h" + +#include "threads/Thread.h" + +#include +#include +#include +#include +#include + +namespace ADDON +{ +class CAddonInfo; +class CAddonMgr; +class IAddon; +} /* namespace ADDON */ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningProcess; +class IAddonInstanceHandler; + +class CController : private CThread +{ +public: + CController(ADDON::CAddonMgr& addonMgr); + ~CController(); + + bool Init(); + void Deinit(); + + bool AddonLanguageSupported(const std::shared_ptr& addon) const; + bool LaunchAddon(const std::shared_ptr& addon, + std::vector& argv, + bool waitForExit, + std::shared_ptr& process); + std::shared_ptr GetAddonProcess(const std::shared_ptr& addonInfo, + IAddonInstanceHandler* handler, + const KODI_HANDLE kodiInstancePtr, + std::shared_ptr& addon); + void ReleaseAddonProcess(const std::shared_ptr& process, IAddonInstanceHandler* handler); + std::shared_ptr GetRunningAddonProcess(const std::string& addonId) const; + std::shared_ptr GetRunningAddon(const std::string& addonId) const; + + std::vector GetProcessInfoData(); + const std::string& GetDevkitLibPath() const { return m_devkitLib; } + +private: + void Process() override; + + bool CheckNeedDirectDll(const std::shared_ptr& addon); + + ADDON::CAddonMgr& m_addonMgr; + const std::string m_devkitLib; + std::atomic_bool m_running{false}; + mutable std::mutex m_lock; + std::map> m_runningProcesses; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/GUICrashReporter.cpp b/xbmc/addons/interface/GUICrashReporter.cpp new file mode 100644 index 0000000000000..508ee7100d7e5 --- /dev/null +++ b/xbmc/addons/interface/GUICrashReporter.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "GUICrashReporter.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CGUICrashReporter::CGUICrashReporter() + : CGUIDialog(WINDOW_DIALOG_ADDON_CRASH_REPORTER, "DialogAddonCrashReporter.xml") +{ + +} + +CGUICrashReporter::~CGUICrashReporter() +{ + +} + +void CGUICrashReporter::OnInitWindow() +{ + CGUIDialog::OnInitWindow(); +} + +bool CGUICrashReporter::OnAction(const CAction& action) +{ + + return CGUIDialog::OnAction(action); +} + +bool CGUICrashReporter::OnMessage(CGUIMessage& message) +{ + return CGUIDialog::OnMessage(message); +} + +void CGUICrashReporter::ReportCrash(const std::shared_ptr& addon) +{ + +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/GUICrashReporter.h b/xbmc/addons/interface/GUICrashReporter.h new file mode 100644 index 0000000000000..9950fc0836d71 --- /dev/null +++ b/xbmc/addons/interface/GUICrashReporter.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "addons/IAddon.h" +#include "guilib/GUIDialog.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CGUICrashReporter : public CGUIDialog +{ +public: + CGUICrashReporter(void); + ~CGUICrashReporter(void) override; + + bool OnMessage(CGUIMessage& message) override; + bool OnAction(const CAction& action) override; + + static void ReportCrash(const std::shared_ptr& addon); + +private: + void OnInitWindow() override; + +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/IMsgHdl.cpp b/xbmc/addons/interface/IMsgHdl.cpp new file mode 100644 index 0000000000000..fd3955e6e9db9 --- /dev/null +++ b/xbmc/addons/interface/IMsgHdl.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "IMsgHdl.h" +#include "RunningProcess.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +IMsgHdl::IMsgHdl(CInterface& interface) + : m_interface(interface), + m_process(interface.m_process) +{ +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/IMsgHdl.h b/xbmc/addons/interface/IMsgHdl.h new file mode 100644 index 0000000000000..55d5874a61f79 --- /dev/null +++ b/xbmc/addons/interface/IMsgHdl.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "../../addons/addoninfo/AddonInfo.h" + +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CInterface; +class CRunningProcess; + +class IMsgHdl +{ +public: + IMsgHdl(CInterface& interface); + virtual ~IMsgHdl() = default; + + virtual bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) = 0; + +protected: + CInterface& m_interface; + CRunningProcess* const m_process; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/InstanceHandler.cpp b/xbmc/addons/interface/InstanceHandler.cpp new file mode 100644 index 0000000000000..566708a6e8cdd --- /dev/null +++ b/xbmc/addons/interface/InstanceHandler.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "InstanceHandler.h" + +#include "Controller.h" + +#include "ServiceBroker.h" +#include "utils/StringUtils.h" +#include "utils/log.h" +#include "api/addon_base.h" + +using namespace ADDON; + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +std::mutex IAddonInstanceHandler::m_cdSec; + +IAddonInstanceHandler::IAddonInstanceHandler(ADDON_INSTANCE type, + const AddonInfoPtr& addonInfo, + ADDON_HANDLE parentInstance /* = nullptr*/, + const std::string& instanceID /* = ""*/) + : m_type(type), m_parentInstance(parentInstance), m_addonInfo(addonInfo) +{ + // if no special instance ID is given generate one from class pointer (is + // faster as unique id and also safe enough for them). + m_instanceId = !instanceID.empty() ? instanceID : StringUtils::Format("%p", static_cast(this)); +} + +IAddonInstanceHandler::~IAddonInstanceHandler() +{ +} + +std::string IAddonInstanceHandler::ID() const +{ + return m_addonInfo ? m_addonInfo->ID() : ""; +} + +std::string IAddonInstanceHandler::Name() const +{ + return m_addonInfo ? m_addonInfo->Name() : ""; +} + +std::string IAddonInstanceHandler::Author() const +{ + return m_addonInfo ? m_addonInfo->Author() : ""; +} + +std::string IAddonInstanceHandler::Icon() const +{ + return m_addonInfo ? m_addonInfo->Icon() : ""; +} + +std::string IAddonInstanceHandler::Path() const +{ + return m_addonInfo ? m_addonInfo->Path() : ""; +} + +std::string IAddonInstanceHandler::Profile() const +{ + return m_addonInfo ? m_addonInfo->Profile() : ""; +} + +AddonVersion IAddonInstanceHandler::Version() const +{ + return m_addonInfo ? m_addonInfo->Version() : AddonVersion(); +} + +ADDON_STATUS IAddonInstanceHandler::CreateInstance(const KODI_HANDLE kodi, ADDON_HANDLE& instance) +{ + m_process = CServiceBroker::GetAddonIfcCtrl().GetAddonProcess(m_addonInfo, this, kodi, m_addon); + if (!m_process) + { + CLog::Log(LOGERROR, "IAddonInstanceHandler::{}: {} failed to get addon process during instance creation", + __func__, + m_addonInfo->ID()); + return ADDON_STATUS_UNKNOWN; + } + m_ifc = &m_process->GetIfc(); + + if (!m_addon || ! m_ifc) + return ADDON_STATUS_UNKNOWN; + + std::unique_lock lock(m_cdSec); + + ADDON_STATUS status = m_ifc->kodi_addon_base_h->kodi_addon_create_instance_v1(m_process->m_hdl, m_type, m_instanceId, kodi, &instance, m_parentInstance); + if (status != ADDON_STATUS_OK) + { + CLog::Log(LOGERROR, "IAddonInstanceHandler::{}: {} returned bad status \"{}\" during instance creation", + __func__, + m_addonInfo->ID(), + status); + } + return status; +} + +void IAddonInstanceHandler::DestroyInstance(ADDON_HANDLE instance) +{ + std::unique_lock lock(m_cdSec); + if (m_addon && m_ifc) + { + m_ifc->kodi_addon_base_h->kodi_addon_destroy_instance_v1(m_process->m_hdl, m_type, instance); + m_ifc = nullptr; + } + + CServiceBroker::GetAddonIfcCtrl().ReleaseAddonProcess(m_process, this); + m_process = nullptr; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/InstanceHandler.h b/xbmc/addons/interface/InstanceHandler.h new file mode 100644 index 0000000000000..a5efa317d5b19 --- /dev/null +++ b/xbmc/addons/interface/InstanceHandler.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "RunningProcess.h" +#include "addons/AddonVersion.h" +#include "addons/IAddon.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon_base.h" + +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CInterface; +typedef void* ADDON_HANDLE; +typedef void* KODI_HANDLE; + +class IAddonInstanceHandler +{ +public: + IAddonInstanceHandler(ADDON_INSTANCE type, + const std::shared_ptr& addonInfo, + ADDON_HANDLE parentInstance = nullptr, + const std::string& instanceID = ""); + virtual ~IAddonInstanceHandler(); + + ADDON_INSTANCE UsedType() const { return m_type; } + const std::string& InstanceID() { return m_instanceId; } + + std::string ID() const; + std::string Name() const; + std::string Author() const; + std::string Icon() const; + std::string Path() const; + std::string Profile() const; + ADDON::AddonVersion Version() const; + + ADDON_STATUS CreateInstance(const KODI_HANDLE kodi, ADDON_HANDLE& instance); + void DestroyInstance(ADDON_HANDLE instance); + const std::shared_ptr& Addon() const { return m_addon; } + const std::shared_ptr& GetAddonInfo() const { return m_addonInfo; } + const std::shared_ptr& GetProcess() const { return m_process; } + + virtual void StopReport(ChildStatus status) {} + virtual void OnPreInstall() {} + virtual void OnPostInstall(bool update, bool modal) {} + virtual void OnPreUnInstall() {} + virtual void OnPostUnInstall() {} + +protected: + CInterface* m_ifc; + +private: + ADDON_INSTANCE m_type; + std::string m_instanceId; + ADDON_HANDLE m_parentInstance; + std::shared_ptr m_process; + std::shared_ptr m_addonInfo; + std::shared_ptr m_addon; + static std::mutex m_cdSec; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/Interface.cpp b/xbmc/addons/interface/Interface.cpp new file mode 100644 index 0000000000000..a67398511792c --- /dev/null +++ b/xbmc/addons/interface/Interface.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "Interface.h" + +#include "addons/kodi-dev-kit/src/shared/DirectData.h" + +/*---AUTO_GEN_PARSE---*/ +#include "api/addon_base.h" +#include "api/audio_engine.h" +#include "api/filesystem.h" +#include "api/general.h" +#include "api/monitor.h" +#include "api/network.h" +#include "api/addon-instance/audiodecoder.h" +#include "api/addon-instance/audioencoder.h" +#include "api/addon-instance/game.h" +#include "api/addon-instance/imagedecoder.h" +#include "api/addon-instance/inputstream.h" +#include "api/addon-instance/peripheral.h" +#include "api/addon-instance/pvr.h" +#include "api/addon-instance/screensaver.h" +#include "api/addon-instance/vfs.h" +#include "api/addon-instance/videocodec.h" +#include "api/addon-instance/visualization.h" +#include "api/gui/general.h" +#include "api/gui/list_item.h" +#include "api/gui/window.h" +#include "api/gui/controls/button.h" +#include "api/gui/controls/edit.h" +#include "api/gui/controls/fade_label.h" +#include "api/gui/controls/image.h" +#include "api/gui/controls/label.h" +#include "api/gui/controls/progress.h" +#include "api/gui/controls/radio_button.h" +#include "api/gui/controls/rendering.h" +#include "api/gui/controls/settings_slider.h" +#include "api/gui/controls/slider.h" +#include "api/gui/controls/spin.h" +#include "api/gui/controls/text_box.h" +#include "api/gui/dialogs/context_menu.h" +#include "api/gui/dialogs/extended_progress.h" +#include "api/gui/dialogs/filebrowser.h" +#include "api/gui/dialogs/keyboard.h" +#include "api/gui/dialogs/numeric.h" +#include "api/gui/dialogs/ok.h" +#include "api/gui/dialogs/progress.h" +#include "api/gui/dialogs/select.h" +#include "api/gui/dialogs/text_viewer.h" +#include "api/gui/dialogs/yes_no.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CInterface::CInterface(CRunningProcess* process, bool directDll) + : m_process(process), + m_directIfc(directDll ? new DirectAddonIfc() : nullptr), + m_directDll(directDll) +{ + /*---AUTO_GEN_PARSE---*/ + kodi_addon_base_h = new CHdl_kodi_addon_base_h(*this); + m_handlers[funcGroup_addon_base_h] = kodi_addon_base_h; + kodi_audio_engine_h = new CHdl_kodi_audio_engine_h(*this); + m_handlers[funcGroup_audio_engine_h] = kodi_audio_engine_h; + kodi_filesystem_h = new CHdl_kodi_filesystem_h(*this); + m_handlers[funcGroup_filesystem_h] = kodi_filesystem_h; + kodi_general_h = new CHdl_kodi_general_h(*this); + m_handlers[funcGroup_general_h] = kodi_general_h; + kodi_monitor_h = new CHdl_kodi_monitor_h(*this); + m_handlers[funcGroup_monitor_h] = kodi_monitor_h; + kodi_network_h = new CHdl_kodi_network_h(*this); + m_handlers[funcGroup_network_h] = kodi_network_h; + kodi_addoninstance_audiodecoder_h = new CHdl_kodi_addoninstance_audiodecoder_h(*this); + m_handlers[funcGroup_addoninstance_audiodecoder_h] = kodi_addoninstance_audiodecoder_h; + kodi_addoninstance_audioencoder_h = new CHdl_kodi_addoninstance_audioencoder_h(*this); + m_handlers[funcGroup_addoninstance_audioencoder_h] = kodi_addoninstance_audioencoder_h; + kodi_addoninstance_game_h = new CHdl_kodi_addoninstance_game_h(*this); + m_handlers[funcGroup_addoninstance_game_h] = kodi_addoninstance_game_h; + kodi_addoninstance_imagedecoder_h = new CHdl_kodi_addoninstance_imagedecoder_h(*this); + m_handlers[funcGroup_addoninstance_imagedecoder_h] = kodi_addoninstance_imagedecoder_h; + kodi_addoninstance_inputstream_h = new CHdl_kodi_addoninstance_inputstream_h(*this); + m_handlers[funcGroup_addoninstance_inputstream_h] = kodi_addoninstance_inputstream_h; + kodi_addoninstance_peripheral_h = new CHdl_kodi_addoninstance_peripheral_h(*this); + m_handlers[funcGroup_addoninstance_peripheral_h] = kodi_addoninstance_peripheral_h; + kodi_addoninstance_pvr_h = new CHdl_kodi_addoninstance_pvr_h(*this); + m_handlers[funcGroup_addoninstance_pvr_h] = kodi_addoninstance_pvr_h; + kodi_addoninstance_screensaver_h = new CHdl_kodi_addoninstance_screensaver_h(*this); + m_handlers[funcGroup_addoninstance_screensaver_h] = kodi_addoninstance_screensaver_h; + kodi_addoninstance_vfs_h = new CHdl_kodi_addoninstance_vfs_h(*this); + m_handlers[funcGroup_addoninstance_vfs_h] = kodi_addoninstance_vfs_h; + kodi_addoninstance_videocodec_h = new CHdl_kodi_addoninstance_videocodec_h(*this); + m_handlers[funcGroup_addoninstance_videocodec_h] = kodi_addoninstance_videocodec_h; + kodi_addoninstance_visualization_h = new CHdl_kodi_addoninstance_visualization_h(*this); + m_handlers[funcGroup_addoninstance_visualization_h] = kodi_addoninstance_visualization_h; + kodi_gui_general_h = new CHdl_kodi_gui_general_h(*this); + m_handlers[funcGroup_gui_general_h] = kodi_gui_general_h; + kodi_gui_list_item_h = new CHdl_kodi_gui_list_item_h(*this); + m_handlers[funcGroup_gui_list_item_h] = kodi_gui_list_item_h; + kodi_gui_window_h = new CHdl_kodi_gui_window_h(*this); + m_handlers[funcGroup_gui_window_h] = kodi_gui_window_h; + kodi_gui_controls_button_h = new CHdl_kodi_gui_controls_button_h(*this); + m_handlers[funcGroup_gui_controls_button_h] = kodi_gui_controls_button_h; + kodi_gui_controls_edit_h = new CHdl_kodi_gui_controls_edit_h(*this); + m_handlers[funcGroup_gui_controls_edit_h] = kodi_gui_controls_edit_h; + kodi_gui_controls_fade_label_h = new CHdl_kodi_gui_controls_fade_label_h(*this); + m_handlers[funcGroup_gui_controls_fade_label_h] = kodi_gui_controls_fade_label_h; + kodi_gui_controls_image_h = new CHdl_kodi_gui_controls_image_h(*this); + m_handlers[funcGroup_gui_controls_image_h] = kodi_gui_controls_image_h; + kodi_gui_controls_label_h = new CHdl_kodi_gui_controls_label_h(*this); + m_handlers[funcGroup_gui_controls_label_h] = kodi_gui_controls_label_h; + kodi_gui_controls_progress_h = new CHdl_kodi_gui_controls_progress_h(*this); + m_handlers[funcGroup_gui_controls_progress_h] = kodi_gui_controls_progress_h; + kodi_gui_controls_radio_button_h = new CHdl_kodi_gui_controls_radio_button_h(*this); + m_handlers[funcGroup_gui_controls_radio_button_h] = kodi_gui_controls_radio_button_h; + kodi_gui_controls_rendering_h = new CHdl_kodi_gui_controls_rendering_h(*this); + m_handlers[funcGroup_gui_controls_rendering_h] = kodi_gui_controls_rendering_h; + kodi_gui_controls_settings_slider_h = new CHdl_kodi_gui_controls_settings_slider_h(*this); + m_handlers[funcGroup_gui_controls_settings_slider_h] = kodi_gui_controls_settings_slider_h; + kodi_gui_controls_slider_h = new CHdl_kodi_gui_controls_slider_h(*this); + m_handlers[funcGroup_gui_controls_slider_h] = kodi_gui_controls_slider_h; + kodi_gui_controls_spin_h = new CHdl_kodi_gui_controls_spin_h(*this); + m_handlers[funcGroup_gui_controls_spin_h] = kodi_gui_controls_spin_h; + kodi_gui_controls_text_box_h = new CHdl_kodi_gui_controls_text_box_h(*this); + m_handlers[funcGroup_gui_controls_text_box_h] = kodi_gui_controls_text_box_h; + kodi_gui_dialogs_context_menu_h = new CHdl_kodi_gui_dialogs_context_menu_h(*this); + m_handlers[funcGroup_gui_dialogs_context_menu_h] = kodi_gui_dialogs_context_menu_h; + kodi_gui_dialogs_extended_progress_h = new CHdl_kodi_gui_dialogs_extended_progress_h(*this); + m_handlers[funcGroup_gui_dialogs_extended_progress_h] = kodi_gui_dialogs_extended_progress_h; + kodi_gui_dialogs_filebrowser_h = new CHdl_kodi_gui_dialogs_filebrowser_h(*this); + m_handlers[funcGroup_gui_dialogs_filebrowser_h] = kodi_gui_dialogs_filebrowser_h; + kodi_gui_dialogs_keyboard_h = new CHdl_kodi_gui_dialogs_keyboard_h(*this); + m_handlers[funcGroup_gui_dialogs_keyboard_h] = kodi_gui_dialogs_keyboard_h; + kodi_gui_dialogs_numeric_h = new CHdl_kodi_gui_dialogs_numeric_h(*this); + m_handlers[funcGroup_gui_dialogs_numeric_h] = kodi_gui_dialogs_numeric_h; + kodi_gui_dialogs_ok_h = new CHdl_kodi_gui_dialogs_ok_h(*this); + m_handlers[funcGroup_gui_dialogs_ok_h] = kodi_gui_dialogs_ok_h; + kodi_gui_dialogs_progress_h = new CHdl_kodi_gui_dialogs_progress_h(*this); + m_handlers[funcGroup_gui_dialogs_progress_h] = kodi_gui_dialogs_progress_h; + kodi_gui_dialogs_select_h = new CHdl_kodi_gui_dialogs_select_h(*this); + m_handlers[funcGroup_gui_dialogs_select_h] = kodi_gui_dialogs_select_h; + kodi_gui_dialogs_text_viewer_h = new CHdl_kodi_gui_dialogs_text_viewer_h(*this); + m_handlers[funcGroup_gui_dialogs_text_viewer_h] = kodi_gui_dialogs_text_viewer_h; + kodi_gui_dialogs_yes_no_h = new CHdl_kodi_gui_dialogs_yes_no_h(*this); + m_handlers[funcGroup_gui_dialogs_yes_no_h] = kodi_gui_dialogs_yes_no_h; + + if (m_directIfc != nullptr) + { + kodi_addon_base_h->InitDirect(&m_directIfc->to_kodi.addon_base_h, &m_directIfc->to_addon.addon_base_h); + kodi_audio_engine_h->InitDirect(&m_directIfc->to_kodi.audio_engine_h, &m_directIfc->to_addon.audio_engine_h); + kodi_filesystem_h->InitDirect(&m_directIfc->to_kodi.filesystem_h, &m_directIfc->to_addon.filesystem_h); + kodi_general_h->InitDirect(&m_directIfc->to_kodi.general_h, &m_directIfc->to_addon.general_h); + kodi_monitor_h->InitDirect(&m_directIfc->to_kodi.monitor_h, &m_directIfc->to_addon.monitor_h); + kodi_network_h->InitDirect(&m_directIfc->to_kodi.network_h, &m_directIfc->to_addon.network_h); + kodi_addoninstance_audiodecoder_h->InitDirect(&m_directIfc->to_kodi.addoninstance_audiodecoder_h, &m_directIfc->to_addon.addoninstance_audiodecoder_h); + kodi_addoninstance_audioencoder_h->InitDirect(&m_directIfc->to_kodi.addoninstance_audioencoder_h, &m_directIfc->to_addon.addoninstance_audioencoder_h); + kodi_addoninstance_game_h->InitDirect(&m_directIfc->to_kodi.addoninstance_game_h, &m_directIfc->to_addon.addoninstance_game_h); + kodi_addoninstance_imagedecoder_h->InitDirect(&m_directIfc->to_kodi.addoninstance_imagedecoder_h, &m_directIfc->to_addon.addoninstance_imagedecoder_h); + kodi_addoninstance_inputstream_h->InitDirect(&m_directIfc->to_kodi.addoninstance_inputstream_h, &m_directIfc->to_addon.addoninstance_inputstream_h); + kodi_addoninstance_peripheral_h->InitDirect(&m_directIfc->to_kodi.addoninstance_peripheral_h, &m_directIfc->to_addon.addoninstance_peripheral_h); + kodi_addoninstance_pvr_h->InitDirect(&m_directIfc->to_kodi.addoninstance_pvr_h, &m_directIfc->to_addon.addoninstance_pvr_h); + kodi_addoninstance_screensaver_h->InitDirect(&m_directIfc->to_kodi.addoninstance_screensaver_h, &m_directIfc->to_addon.addoninstance_screensaver_h); + kodi_addoninstance_vfs_h->InitDirect(&m_directIfc->to_kodi.addoninstance_vfs_h, &m_directIfc->to_addon.addoninstance_vfs_h); + kodi_addoninstance_videocodec_h->InitDirect(&m_directIfc->to_kodi.addoninstance_videocodec_h, &m_directIfc->to_addon.addoninstance_videocodec_h); + kodi_addoninstance_visualization_h->InitDirect(&m_directIfc->to_kodi.addoninstance_visualization_h, &m_directIfc->to_addon.addoninstance_visualization_h); + kodi_gui_general_h->InitDirect(&m_directIfc->to_kodi.gui_general_h, &m_directIfc->to_addon.gui_general_h); + kodi_gui_list_item_h->InitDirect(&m_directIfc->to_kodi.gui_list_item_h, &m_directIfc->to_addon.gui_list_item_h); + kodi_gui_window_h->InitDirect(&m_directIfc->to_kodi.gui_window_h, &m_directIfc->to_addon.gui_window_h); + kodi_gui_controls_button_h->InitDirect(&m_directIfc->to_kodi.gui_controls_button_h, &m_directIfc->to_addon.gui_controls_button_h); + kodi_gui_controls_edit_h->InitDirect(&m_directIfc->to_kodi.gui_controls_edit_h, &m_directIfc->to_addon.gui_controls_edit_h); + kodi_gui_controls_fade_label_h->InitDirect(&m_directIfc->to_kodi.gui_controls_fade_label_h, &m_directIfc->to_addon.gui_controls_fade_label_h); + kodi_gui_controls_image_h->InitDirect(&m_directIfc->to_kodi.gui_controls_image_h, &m_directIfc->to_addon.gui_controls_image_h); + kodi_gui_controls_label_h->InitDirect(&m_directIfc->to_kodi.gui_controls_label_h, &m_directIfc->to_addon.gui_controls_label_h); + kodi_gui_controls_progress_h->InitDirect(&m_directIfc->to_kodi.gui_controls_progress_h, &m_directIfc->to_addon.gui_controls_progress_h); + kodi_gui_controls_radio_button_h->InitDirect(&m_directIfc->to_kodi.gui_controls_radio_button_h, &m_directIfc->to_addon.gui_controls_radio_button_h); + kodi_gui_controls_rendering_h->InitDirect(&m_directIfc->to_kodi.gui_controls_rendering_h, &m_directIfc->to_addon.gui_controls_rendering_h); + kodi_gui_controls_settings_slider_h->InitDirect(&m_directIfc->to_kodi.gui_controls_settings_slider_h, &m_directIfc->to_addon.gui_controls_settings_slider_h); + kodi_gui_controls_slider_h->InitDirect(&m_directIfc->to_kodi.gui_controls_slider_h, &m_directIfc->to_addon.gui_controls_slider_h); + kodi_gui_controls_spin_h->InitDirect(&m_directIfc->to_kodi.gui_controls_spin_h, &m_directIfc->to_addon.gui_controls_spin_h); + kodi_gui_controls_text_box_h->InitDirect(&m_directIfc->to_kodi.gui_controls_text_box_h, &m_directIfc->to_addon.gui_controls_text_box_h); + kodi_gui_dialogs_context_menu_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_context_menu_h, &m_directIfc->to_addon.gui_dialogs_context_menu_h); + kodi_gui_dialogs_extended_progress_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_extended_progress_h, &m_directIfc->to_addon.gui_dialogs_extended_progress_h); + kodi_gui_dialogs_filebrowser_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_filebrowser_h, &m_directIfc->to_addon.gui_dialogs_filebrowser_h); + kodi_gui_dialogs_keyboard_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_keyboard_h, &m_directIfc->to_addon.gui_dialogs_keyboard_h); + kodi_gui_dialogs_numeric_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_numeric_h, &m_directIfc->to_addon.gui_dialogs_numeric_h); + kodi_gui_dialogs_ok_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_ok_h, &m_directIfc->to_addon.gui_dialogs_ok_h); + kodi_gui_dialogs_progress_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_progress_h, &m_directIfc->to_addon.gui_dialogs_progress_h); + kodi_gui_dialogs_select_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_select_h, &m_directIfc->to_addon.gui_dialogs_select_h); + kodi_gui_dialogs_text_viewer_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_text_viewer_h, &m_directIfc->to_addon.gui_dialogs_text_viewer_h); + kodi_gui_dialogs_yes_no_h->InitDirect(&m_directIfc->to_kodi.gui_dialogs_yes_no_h, &m_directIfc->to_addon.gui_dialogs_yes_no_h); + } + /*---AUTO_GEN_PARSE---*/ +} + +CInterface::~CInterface() +{ + for (auto& handler : m_handlers) + { + delete handler; + } +} + +bool CInterface::FuncCall(int group, int func, const msgpack::unpacked& in, msgpack::sbuffer& out) +{ + if (m_handlers[group]) + return m_handlers[group]->HandleMessage(group, func, in, out); + return false; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/Interface.h b/xbmc/addons/interface/Interface.h new file mode 100644 index 0000000000000..319b07df6038d --- /dev/null +++ b/xbmc/addons/interface/Interface.h @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "../kodi-dev-kit/src/shared/SharedGroups.h" +#include "IMsgHdl.h" + +#include + +namespace ADDON +{ +class CAddonInfo; +} /* namespace ADDON */ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/*---AUTO_GEN_PARSE---*/ +class CHdl_kodi_addon_base_h; +class CHdl_kodi_audio_engine_h; +class CHdl_kodi_filesystem_h; +class CHdl_kodi_general_h; +class CHdl_kodi_monitor_h; +class CHdl_kodi_network_h; +class CHdl_kodi_addoninstance_audiodecoder_h; +class CHdl_kodi_addoninstance_audioencoder_h; +class CHdl_kodi_addoninstance_game_h; +class CHdl_kodi_addoninstance_imagedecoder_h; +class CHdl_kodi_addoninstance_inputstream_h; +class CHdl_kodi_addoninstance_peripheral_h; +class CHdl_kodi_addoninstance_pvr_h; +class CHdl_kodi_addoninstance_screensaver_h; +class CHdl_kodi_addoninstance_vfs_h; +class CHdl_kodi_addoninstance_videocodec_h; +class CHdl_kodi_addoninstance_visualization_h; +class CHdl_kodi_gui_general_h; +class CHdl_kodi_gui_list_item_h; +class CHdl_kodi_gui_window_h; +class CHdl_kodi_gui_controls_button_h; +class CHdl_kodi_gui_controls_edit_h; +class CHdl_kodi_gui_controls_fade_label_h; +class CHdl_kodi_gui_controls_image_h; +class CHdl_kodi_gui_controls_label_h; +class CHdl_kodi_gui_controls_progress_h; +class CHdl_kodi_gui_controls_radio_button_h; +class CHdl_kodi_gui_controls_rendering_h; +class CHdl_kodi_gui_controls_settings_slider_h; +class CHdl_kodi_gui_controls_slider_h; +class CHdl_kodi_gui_controls_spin_h; +class CHdl_kodi_gui_controls_text_box_h; +class CHdl_kodi_gui_dialogs_context_menu_h; +class CHdl_kodi_gui_dialogs_extended_progress_h; +class CHdl_kodi_gui_dialogs_filebrowser_h; +class CHdl_kodi_gui_dialogs_keyboard_h; +class CHdl_kodi_gui_dialogs_numeric_h; +class CHdl_kodi_gui_dialogs_ok_h; +class CHdl_kodi_gui_dialogs_progress_h; +class CHdl_kodi_gui_dialogs_select_h; +class CHdl_kodi_gui_dialogs_text_viewer_h; +class CHdl_kodi_gui_dialogs_yes_no_h; +/*---AUTO_GEN_PARSE---*/ + +struct DirectAddonIfc; + +enum class InterfaceKodiClass +{ + CFile, + CHttpHeader, + IAEStream, +}; + +class IInterfaceClassHdl +{ +public: + IInterfaceClassHdl(InterfaceKodiClass ifcClass) : m_ifcClass(ifcClass) {} + virtual ~IInterfaceClassHdl() = default; + + const InterfaceKodiClass m_ifcClass; +}; + +class CInterface +{ +public: + CInterface(CRunningProcess* process, bool directDll); + ~CInterface(); + + bool FuncCall(int group, int func, const msgpack::unpacked& in, msgpack::sbuffer& out); + + /*---AUTO_GEN_PARSE---*/ + CHdl_kodi_addon_base_h* kodi_addon_base_h; + CHdl_kodi_audio_engine_h* kodi_audio_engine_h; + CHdl_kodi_filesystem_h* kodi_filesystem_h; + CHdl_kodi_general_h* kodi_general_h; + CHdl_kodi_monitor_h* kodi_monitor_h; + CHdl_kodi_network_h* kodi_network_h; + CHdl_kodi_addoninstance_audiodecoder_h* kodi_addoninstance_audiodecoder_h; + CHdl_kodi_addoninstance_audioencoder_h* kodi_addoninstance_audioencoder_h; + CHdl_kodi_addoninstance_game_h* kodi_addoninstance_game_h; + CHdl_kodi_addoninstance_imagedecoder_h* kodi_addoninstance_imagedecoder_h; + CHdl_kodi_addoninstance_inputstream_h* kodi_addoninstance_inputstream_h; + CHdl_kodi_addoninstance_peripheral_h* kodi_addoninstance_peripheral_h; + CHdl_kodi_addoninstance_pvr_h* kodi_addoninstance_pvr_h; + CHdl_kodi_addoninstance_screensaver_h* kodi_addoninstance_screensaver_h; + CHdl_kodi_addoninstance_vfs_h* kodi_addoninstance_vfs_h; + CHdl_kodi_addoninstance_videocodec_h* kodi_addoninstance_videocodec_h; + CHdl_kodi_addoninstance_visualization_h* kodi_addoninstance_visualization_h; + CHdl_kodi_gui_general_h* kodi_gui_general_h; + CHdl_kodi_gui_list_item_h* kodi_gui_list_item_h; + CHdl_kodi_gui_window_h* kodi_gui_window_h; + CHdl_kodi_gui_controls_button_h* kodi_gui_controls_button_h; + CHdl_kodi_gui_controls_edit_h* kodi_gui_controls_edit_h; + CHdl_kodi_gui_controls_fade_label_h* kodi_gui_controls_fade_label_h; + CHdl_kodi_gui_controls_image_h* kodi_gui_controls_image_h; + CHdl_kodi_gui_controls_label_h* kodi_gui_controls_label_h; + CHdl_kodi_gui_controls_progress_h* kodi_gui_controls_progress_h; + CHdl_kodi_gui_controls_radio_button_h* kodi_gui_controls_radio_button_h; + CHdl_kodi_gui_controls_rendering_h* kodi_gui_controls_rendering_h; + CHdl_kodi_gui_controls_settings_slider_h* kodi_gui_controls_settings_slider_h; + CHdl_kodi_gui_controls_slider_h* kodi_gui_controls_slider_h; + CHdl_kodi_gui_controls_spin_h* kodi_gui_controls_spin_h; + CHdl_kodi_gui_controls_text_box_h* kodi_gui_controls_text_box_h; + CHdl_kodi_gui_dialogs_context_menu_h* kodi_gui_dialogs_context_menu_h; + CHdl_kodi_gui_dialogs_extended_progress_h* kodi_gui_dialogs_extended_progress_h; + CHdl_kodi_gui_dialogs_filebrowser_h* kodi_gui_dialogs_filebrowser_h; + CHdl_kodi_gui_dialogs_keyboard_h* kodi_gui_dialogs_keyboard_h; + CHdl_kodi_gui_dialogs_numeric_h* kodi_gui_dialogs_numeric_h; + CHdl_kodi_gui_dialogs_ok_h* kodi_gui_dialogs_ok_h; + CHdl_kodi_gui_dialogs_progress_h* kodi_gui_dialogs_progress_h; + CHdl_kodi_gui_dialogs_select_h* kodi_gui_dialogs_select_h; + CHdl_kodi_gui_dialogs_text_viewer_h* kodi_gui_dialogs_text_viewer_h; + CHdl_kodi_gui_dialogs_yes_no_h* kodi_gui_dialogs_yes_no_h; + /*---AUTO_GEN_PARSE---*/ + + CRunningProcess* const m_process; + DirectAddonIfc* const m_directIfc; + const bool m_directDll; + +private: + std::array m_handlers{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/RunningProcess.cpp b/xbmc/addons/interface/RunningProcess.cpp new file mode 100644 index 0000000000000..9293046c08f57 --- /dev/null +++ b/xbmc/addons/interface/RunningProcess.cpp @@ -0,0 +1,463 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "RunningProcess.h" + +// Interface +#include "Controller.h" +#include "InstanceHandler.h" +#include "RunningThread.h" +#include "api/addon_base.h" + +// Kodi +#include "ServiceBroker.h" +#include "addons/addoninfo/AddonInfo.h" +#include "addons/kodi-dev-kit/src/shared/DirectData.h" +#include "addons/kodi-dev-kit/src/shared/SharedData.h" +#include "addons/kodi-dev-kit/src/shared/api/processor.h" +#include "filesystem/File.h" +#include "utils/log.h" + +#ifdef TARGET_LINUX +#include "processinfo/ProcessInfoLinux.h" +#endif +#include "launcher/LauncherDirectDll.h" +#ifdef TARGET_POSIX +#include "launcher/LauncherPosix.h" +#elif TARGET_WINDOWS +#include "launcher/LauncherWindows.h" +#else +#error No valid OS defined +#endif + +using namespace std::chrono_literals; + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CRunningProcess::CRunningProcess(const std::shared_ptr& addon, + const std::string& uuid, + bool directDll, + const KODI_HANDLE kodiInstancePtr) + : CThread("CRunningProcess"), + m_addon(addon), + m_uuid(uuid), +#ifndef KODI_INHIBIT_SHARED + m_directDll(directDll), +#else + m_directDll(true), +#endif + m_kodiInitInstancePtr(kodiInstancePtr), + m_mainThread(m_threadIdentfier++, this), + m_interface(this, m_directDll) +{ + if (m_directDll) + m_launcher = new CLauncherDirectDll(addon, uuid); +#ifndef KODI_INHIBIT_SHARED + else +#ifdef TARGET_POSIX + m_launcher = new CLauncherPosix(addon, uuid); +#elif TARGET_WINDOWS + m_launcher = nullptr; +#else + m_launcher = nullptr; +#endif +#endif +} + +CRunningProcess::~CRunningProcess() +{ + Kill(); + delete m_launcher; + delete m_processInfo; +} + +bool CRunningProcess::Launch(const std::vector& argv, bool waitForExit) +{ + /* + * Confirm the wanted executable is really present. + */ + const std::string exe = m_addon->Type(m_addon->MainType())->LibPath(); + if (exe.empty() || !XFILE::CFile::Exists(exe)) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: Wanted {} '{}' not present", __func__, m_directDll ? "library" : "executable", exe); + return false; + } + + /* + * Start the addon main thread receiver. + * NOTE This not relate to a real thread process itself only that it handle + * addon his thread calls. + */ + if (!m_mainThread.Create(waitForExit)) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: Failed to create process thread interface for addon", + __func__, m_addon->ID()); + return false; + } + + m_argv = argv; + + /* + * Start addon from here, if wait for exit is set, as it should return direct + * after performed work. + * + * This thought for helper apps where do one time by call the wanted work. + * + * For the normal cases the running thread becomes created where also start + * the executable. + */ + if (waitForExit || (m_directDll && m_launcher->SupportNonBlocking(exe))) + { + const std::string exe = m_addon->Type(m_addon->MainType())->LibPath(); + const std::string mainSharedId = "--main-shared=" + m_uuid; + const std::string kodiLibPath = StringUtils::Format("--dl={}", CServiceBroker::GetAddonIfcCtrl().GetDevkitLibPath()); + const std::string direct_api = StringUtils::Format("--direct-api={}", static_cast(m_interface.m_directIfc)); + const std::string first_instance = StringUtils::Format("--first-instance={}", static_cast(m_kodiInitInstancePtr)); + + std::vector argv_cstr; + argv_cstr.reserve(m_argv.size() + 7); + argv_cstr.emplace_back(const_cast(exe.c_str())); + for (const auto& arg : m_argv) + argv_cstr.emplace_back(const_cast(arg.c_str())); + argv_cstr.emplace_back(const_cast(mainSharedId.c_str())); + argv_cstr.emplace_back(const_cast(kodiLibPath.c_str())); + if (m_directDll) + argv_cstr.emplace_back(const_cast(direct_api.c_str())); + if (m_kodiInitInstancePtr) + argv_cstr.emplace_back(const_cast(first_instance.c_str())); + argv_cstr.emplace_back(nullptr); + + if (!m_launcher->Launch(argv_cstr, waitForExit)) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: Failed to start addon '{}' process", __func__, + m_addon->ID()); + m_startFailed = true; + return false; + } + + m_startFailed = false; + } + else + { + /* + * Start here the thread and wait until done. + * This wait needed to have addon usable for other Kodi places, otherwise + * it can come that Kodi wants to call a non present place, e.g. + * kodi_addon_create below. + */ + CThread::Create(); + while (!m_startDone) + { + CThread::Sleep(1ms); + } + } + + if (!m_startFailed) + { + m_interface.kodi_addon_base_h->kodi_addon_create_v1(&m_hdl); + } + + + return !m_startFailed; +} + +bool CRunningProcess::Kill() +{ + // Check addon is running, if yes stop by normal way + if (ProcessActive() == ChildStatus::Running) + { + m_interface.kodi_addon_base_h->kodi_addon_destroy_v1(m_hdl); + + // Inform addon of requested kill and to allow him needed work (e.g. stop process thread). + if (!m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_processor_KillChild(m_uuid)); + SendMessage(funcGroup_Main, kodi_processor_KillChild, in); + } + else + { + void* hdl = m_interface.m_directIfc->to_addon.processor_h.thisClassHdl; + if (m_interface.m_directIfc->to_addon.processor_h.kodi_kill_child) + { + m_interface.m_directIfc->to_addon.processor_h.kodi_kill_child(hdl, m_uuid.c_str()); + } + } + + // Make the process kill with wait until done (if exceeds a time delay a kill becomes forced), + m_launcher->Kill(true); + } + + for (const auto thread : m_runningSubThreads) + thread->Destroy(); + m_runningSubThreads.clear(); + m_mainThread.Destroy(); + + CThread::StopThread(); + + return true; +} + +ProcessInfoData CRunningProcess::GetProcessInfoData() +{ + static ProcessInfoData dummy; + + if (ProcessActive() != ChildStatus::Running) + { + return dummy; + } + + if (!m_processInfo) + { +#ifdef TARGET_LINUX + m_processInfo = new CProcessInfoLinux(m_addon, m_launcher->GetMainProcessPID()); +#endif + } + + return m_processInfo->Calculate(); +} + +ChildStatus CRunningProcess::ProcessActive() +{ + if (m_launcher) + return m_launcher->ProcessActive(); + + return ChildStatus::NotStarted; +} + +bool CRunningProcess::FuncCall(int group, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (group == funcGroup_Main) + { + switch (func) + { + case kodi_processor_CreateForNewThread: + { + msgParent__IN_kodi_processor_CreateForNewThread t = in.get().as(); + + if (m_mainThread.GetID() != std::get<0>(t)) + { + CLog::Log(LOGERROR, + "CRunningProcess::{}: Addon '{}' interface creation called from invalid place " + "'{}' (should '{}')", + __func__, m_addon->ID(), std::get<0>(t), m_mainThread.GetID()); + return false; + } + + std::shared_ptr thread = + std::make_shared(m_threadIdentfier++, this); + if (!thread->Create(true)) + { + CLog::Log(LOGERROR, + "CRunningProcess::{}: Failed to create new thread process for addon '{}'", + __func__, m_addon->ID()); + return false; + } + + m_runningSubThreads.emplace(thread); + + msgpack::pack(out, msgParent_OUT_kodi_processor_CreateForNewThread(thread->GetID(), + thread->GetThreadID())); + return true; + } + default: + return false; + } + } + + return m_interface.FuncCall(group, func, in, out); +} + +bool CRunningProcess::SendMessage(int group, int func) +{ + // TODO Call with other thread? + return m_mainThread.SendMessage(group, func); +} + +bool CRunningProcess::SendMessage(int group, int func, const msgpack::sbuffer& in) +{ + // TODO Call with other thread? + return m_mainThread.SendMessage(group, func, in); +} + +bool CRunningProcess::SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret) +{ + // TODO Call with other thread? + return m_mainThread.SendMessage(group, func, in, ret); +} + +bool CRunningProcess::SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret) +{ + // TODO Call with other thread? + return m_mainThread.SendMessageOnlyGetReturn(group, func, ret); +} + +void CRunningProcess::RegisterClass(IInterfaceClassHdl* ifcClass) +{ + std::unique_lock lock(m_classRegisterMutex); + m_activeIfcClasses.emplace(ifcClass); +} + +void CRunningProcess::UnregisterClass(IInterfaceClassHdl* ifcClass) +{ + std::unique_lock lock(m_classRegisterMutex); + m_activeIfcClasses.erase(ifcClass); +} + +void CRunningProcess::AddAddonInstance(IAddonInstanceHandler* handler) +{ + // Paranoia check, if there a nullptr, then is really something wrong. + if (handler == nullptr) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: for Id '{}' called with empty instance handler", + __func__, GetAddonID()); + return; + } + + std::unique_lock lock(m_mutex); + + // add the instance handler to the info to know used amount on addon + m_activeAddonHandlers.insert(handler); +} + +void CRunningProcess::ReleaseAddonInstance(IAddonInstanceHandler* handler) +{ + // Paranoia check, if there a nullptr, then is really something wrong. + if (handler == nullptr) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: for Id '{}' called with empty instance handler", + __func__, GetAddonID()); + return; + } + + std::unique_lock lock(m_mutex); + + auto presentHandler = m_activeAddonHandlers.find(handler); + if (presentHandler == m_activeAddonHandlers.end()) + return; + + m_activeAddonHandlers.erase(presentHandler); +} + +void CRunningProcess::InformStopReport(ChildStatus status) +{ + std::unique_lock lock(m_mutex); + + /* + * Inform all running instances about uncontrolled stop by e.g. segemention + * fault on addon. + * + * They can then stop his related threads and destroy related classes. + * This also the reason about "++it;" as there can in for loop the amount + * decreased. + */ + for (auto it = m_activeAddonHandlers.cbegin(); it != m_activeAddonHandlers.cend();) + { + (*it)->StopReport(status); + ++it; + } +} + +size_t CRunningProcess::UsedInstanceCount() const +{ + std::unique_lock lock(m_mutex); + return m_activeAddonHandlers.size(); +} + +void CRunningProcess::SetEndtime(unsigned int milliseconds) +{ + /* + * Set the used endtime, this mostly used by addons where Kodi use as his + * extension, e.g. PVR, audiodecoder and so on. + * + * Other independent running addons not use it as they stop itself. + */ + m_endMilliseconds = milliseconds; + m_endTimer.Set(milliseconds); +} + +bool CRunningProcess::IsInUse() const +{ + /* + * If no active instances are present return false and let wait timer expire + * or in case of new instance to reset below again. + */ + if (m_activeAddonHandlers.empty()) + return false; + + /* + * Reset endtime to start. + * Done on ever call (where normally only by "CController::Process()") to use + * after addon no more used and stop his executable. + */ + m_endTimer.Set(m_endMilliseconds); + return true; +} + +void CRunningProcess::Process() +{ + { + /* + * Launch addon from running thread. + * This done for safeness, if the addon was started on another thread where + * becomes stopped somewhere, becomes also the started executable stopped. + */ + const std::string exe = m_addon->Type(m_addon->MainType())->LibPath(); + const std::string mainSharedId = "--main-shared=" + m_uuid; + const std::string kodiLibPath = StringUtils::Format("--dl={}", CServiceBroker::GetAddonIfcCtrl().GetDevkitLibPath()); + const std::string direct_api = StringUtils::Format("--direct-api={}", static_cast(m_interface.m_directIfc)); + const std::string first_instance = StringUtils::Format("--first-instance={}", static_cast(m_kodiInitInstancePtr)); + + std::vector argv_cstr; + argv_cstr.reserve(m_argv.size() + 7); + argv_cstr.emplace_back(const_cast(exe.c_str())); + for (const auto& arg : m_argv) + argv_cstr.emplace_back(const_cast(arg.c_str())); + argv_cstr.emplace_back(const_cast(mainSharedId.c_str())); + argv_cstr.emplace_back(const_cast(kodiLibPath.c_str())); + if (m_directDll) + argv_cstr.emplace_back(const_cast(direct_api.c_str())); + if (m_kodiInitInstancePtr) + argv_cstr.emplace_back(const_cast(first_instance.c_str())); + argv_cstr.emplace_back(nullptr); + + if (!m_launcher->Launch(argv_cstr, false)) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: Failed to start addon '{}' process", __func__, + m_addon->ID()); + m_startFailed = true; + m_startDone = true; + return; + } + + m_startDone = true; + } + + /* + * Do below the addon call to Kodi requests where done by his main thread. + */ + while (!m_bStop) + { + if (!m_mainThread.ProcessOutside()) + { + break; + } + } +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/RunningProcess.h b/xbmc/addons/interface/RunningProcess.h new file mode 100644 index 0000000000000..8c0abce1506e2 --- /dev/null +++ b/xbmc/addons/interface/RunningProcess.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "launcher/ILauncher.h" +#include "Interface.h" +#include "processinfo/ProcessInfo.h" +#include "RunningThread.h" +#include "addons/Addon.h" +#include "threads/SystemClock.h" +#include "threads/Thread.h" + +#include +#include +#include +#include +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningThread; +class IAddonInstanceHandler; + +class CRunningProcess : private CThread +{ +public: + CRunningProcess(const std::shared_ptr& addon, const std::string& uuid, bool directDll, const KODI_HANDLE kodiInstancePtr); + ~CRunningProcess(); + + bool Launch(const std::vector& argv, bool waitForExit); + bool Kill(); + ChildStatus ProcessActive(); + + bool FuncCall(int group, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out); + + bool SendMessage(int group, int func); + bool SendMessage(int group, int func, const msgpack::sbuffer& in); + bool SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret); + bool SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret); + + void RegisterClass(IInterfaceClassHdl* ifcClass); + void UnregisterClass(IInterfaceClassHdl* ifcClass); + + void AddAddonInstance(IAddonInstanceHandler* handler); + void ReleaseAddonInstance(IAddonInstanceHandler* handler); + + void InformStopReport(ChildStatus status); + + const std::string& GetUUID() const { return m_uuid; } + const std::shared_ptr& GetAddon() const { return m_addon; } + std::string GetAddonID() const { return m_addon->ID(); } + size_t UsedInstanceCount() const; + + CInterface& GetIfc() { return m_interface; } + + void SetEndtime(unsigned int milliseconds); + unsigned int EndTimeLeft() const { return m_endTimer.MillisLeft(); } + bool UseEndTime() const { return m_endMilliseconds > 0; } + bool IsInUse() const; + + ProcessInfoData GetProcessInfoData(); + + void* m_hdl; + +private: + void Process() override; + + const std::shared_ptr m_addon; + const std::string m_uuid; + const bool m_directDll; + const KODI_HANDLE m_kodiInitInstancePtr; + std::atomic_bool m_startDone{false}; + bool m_startFailed{false}; + std::vector m_argv; + int64_t m_threadIdentfier{0}; + CRunningThread m_mainThread; + CInterface m_interface; + ILauncher* m_launcher; + std::set> m_runningSubThreads; + std::unordered_set m_activeIfcClasses; + std::unordered_set m_activeAddonHandlers; + mutable std::mutex m_mutex; + mutable std::mutex m_classRegisterMutex; + unsigned int m_endMilliseconds{0}; + mutable XbmcThreads::EndTime m_endTimer; + CProcessInfo* m_processInfo{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/RunningThread.cpp b/xbmc/addons/interface/RunningThread.cpp new file mode 100644 index 0000000000000..43fcddc132c13 --- /dev/null +++ b/xbmc/addons/interface/RunningThread.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "RunningThread.h" + +#include "RunningProcess.h" +#include "addons/addoninfo/AddonInfo.h" +#include "addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h" +#include "addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.h" +#include "utils/StringUtils.h" +#include "utils/log.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CRunningThread::CRunningThread(int64_t identifier, CRunningProcess* const process) + : m_mainThread(identifier == 0), + m_identifier(identifier), + m_id(StringUtils::Format("{}-ifc-{:05}", process->GetUUID().c_str(), m_identifier)), + m_process(process) +{ + m_shareProcessReceiver = new CShareProcessReceiver(m_id + "-chlsrv", m_mainThread); + m_shareProcessTransmitter = new CShareProcessTransmitter(m_id + "-srvchl", m_mainThread); +} + +CRunningThread::~CRunningThread() +{ + Destroy(); + delete m_shareProcessReceiver; + delete m_shareProcessTransmitter; +} + +bool CRunningThread::Create(bool useThread) +{ + if (!m_shareProcessTransmitter->Create(true)) + { + CLog::Log(LOGERROR, + "CRunningThread::{}: Failed to create shared process memory from Kodi to addon '{}' " + "(ERROR {})", + __func__, m_process->GetAddon()->ID(), m_shareProcessTransmitter->GetLastErrorText()); + return false; + } + + if (!m_shareProcessReceiver->Create(true, useThread)) + { + CLog::Log(LOGERROR, + "CRunningThread::{}: Failed to create shared process memory from addon to Kodi '{}' " + "(ERROR {})", + __func__, m_process->GetAddon()->ID(), m_shareProcessReceiver->GetLastErrorText()); + return false; + } + + m_shareProcessReceiver->RegisterReceiver( + std::bind(&CRunningProcess::FuncCall, m_process, std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3, std::placeholders::_4)); + + return true; +} + +void CRunningThread::Destroy() +{ + m_shareProcessTransmitter->Destroy(); + m_shareProcessReceiver->Destroy(); +} + +bool CRunningThread::SendMessage(int group, int func) +{ + return m_shareProcessTransmitter->SendMessage(group, func); +} + +bool CRunningThread::SendMessage(int group, int func, const msgpack::sbuffer& in) +{ + return m_shareProcessTransmitter->SendMessage(group, func, in); +} + +bool CRunningThread::SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret) +{ + return m_shareProcessTransmitter->SendMessage(group, func, in, ret); +} + +bool CRunningThread::SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret) +{ + return m_shareProcessTransmitter->SendMessageOnlyGetReturn(group, func, ret); +} + +bool CRunningThread::ProcessOutside() +{ + return m_shareProcessReceiver->ProcessOutside(); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/RunningThread.h b/xbmc/addons/interface/RunningThread.h new file mode 100644 index 0000000000000..935c6fc7cce38 --- /dev/null +++ b/xbmc/addons/interface/RunningThread.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningProcess; +class CShareProcessReceiver; +class CShareProcessTransmitter; + +class CRunningThread +{ +public: + CRunningThread(int64_t identifier, CRunningProcess* const process); + ~CRunningThread(); + + bool Create(bool useThread); + void Destroy(); + + bool SendMessage(int group, int func); + bool SendMessage(int group, int func, const msgpack::sbuffer& in); + bool SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret); + bool SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret); + + bool ProcessOutside(); + + int64_t GetThreadID() const { return m_identifier; } + const std::string& GetID() const { return m_id; } + +private: + const bool m_mainThread; + const int64_t m_identifier; + const std::string m_id; + CRunningProcess* const m_process; + + int64_t m_pid{-1}; + CShareProcessReceiver* m_shareProcessReceiver{nullptr}; + CShareProcessTransmitter* m_shareProcessTransmitter{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/CMakeLists.txt b/xbmc/addons/interface/api/CMakeLists.txt new file mode 100644 index 0000000000000..c1043a4fd7b8f --- /dev/null +++ b/xbmc/addons/interface/api/CMakeLists.txt @@ -0,0 +1,24 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + addon_base.cpp + audio_engine.cpp + filesystem.cpp + general.cpp + monitor.cpp + network.cpp +) + +set(HEADERS + addon_base.h + audio_engine.h + filesystem.h + general.h + monitor.h + network.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_api) +endif() diff --git a/xbmc/addons/interface/api/addon-instance/CMakeLists.txt b/xbmc/addons/interface/api/addon-instance/CMakeLists.txt new file mode 100644 index 0000000000000..493e36f8feda0 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/CMakeLists.txt @@ -0,0 +1,34 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + audiodecoder.cpp + audioencoder.cpp + game.cpp + imagedecoder.cpp + inputstream.cpp + peripheral.cpp + pvr.cpp + screensaver.cpp + vfs.cpp + videocodec.cpp + visualization.cpp +) + +set(HEADERS + audiodecoder.h + audioencoder.h + game.h + imagedecoder.h + inputstream.h + peripheral.h + pvr.h + screensaver.h + vfs.h + videocodec.h + visualization.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_api_addon-instance) +endif() diff --git a/xbmc/addons/interface/api/addon-instance/audiodecoder.cpp b/xbmc/addons/interface/api/addon-instance/audiodecoder.cpp new file mode 100644 index 0000000000000..b43167018e91f --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audiodecoder.cpp @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audiodecoder.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_audiodecoder_h::InitDirect( + directFuncToKodi_addoninstance_audiodecoder_h* ifcToKodi, + directFuncToAddon_addoninstance_audiodecoder_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_audiodecoder_h) + return false; + + switch (func) + { + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_audiodecoder_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_audiodecoder_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_AUDIODECODER_HDL CHdl_kodi_addoninstance_audiodecoder_h:: + kodi_addon_audiodecoder_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_AUDIODECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CREATE_V1)( KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_destroy_v1( + KODI_ADDON_AUDIODECODER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1)( KODI_ADDON_AUDIODECODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_audiodecoder_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_can_operate_file_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_audiodecoder_can_operate_file_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_can_operate_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_can_operate_file_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_can_operate_file_v1(m_ifcToAddon->thisClassHdl, hdl, + file); +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_init_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + unsigned int filecache, + int* channels, + int* samplerate, + int* bitspersample, + int64_t* totaltime, + int* bitrate, + enum AudioEngineDataFormat* format, + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_INIT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, unsigned int filecache, int* channels, int* samplerate, int* bitspersample, int64_t* totaltime, int* bitrate, enum AudioEngineDataFormat* format, enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); + // Tuple in: typedef std::tuple> msgChild__IN_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + std::array ifc_info; + std::memcpy(ifc_info.data(), info, sizeof(enum AudioEngineChannel) * AUDIOENGINE_CH_MAX); + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_init_v1( + PtrValue(hdl), file, filecache, *channels, *samplerate, *bitspersample, + *totaltime, *bitrate, *format, ifc_info)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_init_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_init_v1 t = ident.get().as(); + *channels = std::get<1>(t); + *samplerate = std::get<2>(t); + *bitspersample = std::get<3>(t); + *totaltime = std::get<4>(t); + *bitrate = std::get<5>(t); + *format = std::get<6>(t); + std::memcpy(info, std::get<7>(t).data(), sizeof(enum AudioEngineChannel) * AUDIOENGINE_CH_MAX); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_init_v1( + m_ifcToAddon->thisClassHdl, hdl, file, filecache, channels, samplerate, bitspersample, + totaltime, bitrate, format, info); +} + +int CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_read_pcm_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, uint8_t* buffer, size_t size, size_t* actualsize) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, uint8_t* buffer, size_t size, size_t* actualsize); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_audiodecoder_read_pcm_v1(PtrValue(hdl), size, *actualsize)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_read_pcm_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_read_pcm_v1 t = ident.get().as(); + std::memcpy(buffer, std::get<1>(t).data(), sizeof(uint8_t) * size); + *actualsize = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_read_pcm_v1(m_ifcToAddon->thisClassHdl, hdl, buffer, + size, actualsize); +} + +int64_t CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_seek_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SEEK_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_seek_v1(PtrValue(hdl), time)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_seek_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_seek_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_seek_v1(m_ifcToAddon->thisClassHdl, hdl, time); +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_read_tag_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_read_tag_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_read_tag_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_read_tag_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(tag); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_read_tag_v1(m_ifcToAddon->thisClassHdl, hdl, file, + tag); +} + +int CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_track_count_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audiodecoder_track_count_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_track_count_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_track_count_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_track_count_v1(m_ifcToAddon->thisClassHdl, hdl, + file); +} + +// Callbacks from addon to Kodi +/* NOTE: unused (no callbacks here) */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/audiodecoder.h b/xbmc/addons/interface/api/addon-instance/audiodecoder.h new file mode 100644 index 0000000000000..b8a7572106fc4 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audiodecoder.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_audiodecoder_h; +struct directFuncToKodi_addoninstance_audiodecoder_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_audiodecoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_audiodecoder_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_audiodecoder_h* ifcToKodi, + directFuncToAddon_addoninstance_audiodecoder_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_AUDIODECODER_HDL kodi_addon_audiodecoder_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_audiodecoder_destroy_v1(KODI_ADDON_AUDIODECODER_HDL hdl); // Added with API 1 + + bool kodi_addon_audiodecoder_can_operate_file_v1(const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file); // Added with API 1 + + bool kodi_addon_audiodecoder_init_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + unsigned int filecache, + int* channels, + int* samplerate, + int* bitspersample, + int64_t* totaltime, + int* bitrate, + enum AudioEngineDataFormat* format, + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); // Added with API 1 + + int kodi_addon_audiodecoder_read_pcm_v1(const KODI_ADDON_AUDIODECODER_HDL hdl, + uint8_t* buffer, + size_t size, + size_t* actualsize); // Added with API 1 + + int64_t kodi_addon_audiodecoder_seek_v1(const KODI_ADDON_AUDIODECODER_HDL hdl, + int64_t time); // Added with API 1 + + bool kodi_addon_audiodecoder_read_tag_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); // Added with API 1 + + int kodi_addon_audiodecoder_track_count_v1(const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + + directFuncToAddon_addoninstance_audiodecoder_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/audioencoder.cpp b/xbmc/addons/interface/api/addon-instance/audioencoder.cpp new file mode 100644 index 0000000000000..49d5763d425a2 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audioencoder.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audioencoder.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h" + +// Kodi +#include "addons/AudioEncoder.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_audioencoder_h::InitDirect( + directFuncToKodi_addoninstance_audioencoder_h* ifcToKodi, + directFuncToAddon_addoninstance_audioencoder_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_audioencoder_write_v1 = kodi_addon_audioencoder_write_v1; + ifcToKodi->kodi_addon_audioencoder_seek_v1 = kodi_addon_audioencoder_seek_v1; +} + +bool CHdl_kodi_addoninstance_audioencoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_audioencoder_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_audioencoder_write_v1: + { + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_OWN_HDL hdl, const uint8_t* data, size_t len) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_addon_audioencoder_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_write_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_audioencoder_write_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::vector& data = std::get<1>(t); + size_t len = std::get<2>(t); + ssize_t auto_gen_ret = kodi_addon_audioencoder_write_v1(this, hdl, data.data(), len); + msgpack::pack(out, msgParent_OUT_kodi_addon_audioencoder_write_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_audioencoder_seek_v1: + { + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_OWN_HDL hdl, size_t pos, int whence) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_audioencoder_seek_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + size_t pos = std::get<1>(t); + int whence = std::get<2>(t); + ssize_t auto_gen_ret = kodi_addon_audioencoder_seek_v1(this, hdl, pos, whence); + msgpack::pack(out, msgParent_OUT_kodi_addon_audioencoder_seek_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_audioencoder_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_audioencoder_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_AUDIOENCODER_HDL CHdl_kodi_addoninstance_audioencoder_h:: + kodi_addon_audioencoder_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_AUDIOENCODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audioencoder_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_audioencoder_h, + funcChild_kodi_addon_audioencoder_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audioencoder_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audioencoder_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_destroy_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_audioencoder_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_audioencoder_h, + funcChild_kodi_addon_audioencoder_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_audioencoder_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_start_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl, const struct AUDIOENCODER_INFO_TAG* tag) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct AUDIOENCODER_INFO_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_start_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audioencoder_start_v1(PtrValue(hdl), tag)); + if (!m_process->SendMessage(funcGroup_addoninstance_audioencoder_h, + funcChild_kodi_addon_audioencoder_start_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audioencoder_start_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audioencoder_start_v1(m_ifcToAddon->thisClassHdl, hdl, tag); +} + +ssize_t CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_encode_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl, const uint8_t* pbt_stream, size_t num_bytes_read) +{ + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const uint8_t* pbt_stream, size_t num_bytes_read); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_audioencoder_encode_v1( + PtrValue(hdl), std::vector(pbt_stream, pbt_stream + num_bytes_read), + num_bytes_read)); + if (!m_process->SendMessage(funcGroup_addoninstance_audioencoder_h, + funcChild_kodi_addon_audioencoder_encode_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audioencoder_encode_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audioencoder_encode_v1(m_ifcToAddon->thisClassHdl, hdl, + pbt_stream, num_bytes_read); +} + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_finish_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_audioencoder_finish_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_audioencoder_h, + funcChild_kodi_addon_audioencoder_finish_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audioencoder_finish_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audioencoder_finish_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// Callbacks from addon to Kodi + +ssize_t CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_write_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const uint8_t* data, size_t len) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CAudioEncoder" with "int Write(const uint8_t* data, int len); /*---AUTO_GEN_PARSE---*/" on "addons/AudioEncoder.h". + + ADDON::CAudioEncoder* cb = static_cast(hdl); + return cb->Write(data, len); + /*---AUTO_GEN_PARSE---*/ +} + +ssize_t CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_seek_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + size_t pos, + int whence) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CAudioEncoder" with "int64_t Seek(int64_t pos, int whence); /*---AUTO_GEN_PARSE---*/" on "addons/AudioEncoder.h". + + ADDON::CAudioEncoder* cb = static_cast(hdl); + return cb->Seek(pos, whence); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/audioencoder.h b/xbmc/addons/interface/api/addon-instance/audioencoder.h new file mode 100644 index 0000000000000..cde30dafe124c --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audioencoder.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audioencoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_audioencoder_h; +struct directFuncToKodi_addoninstance_audioencoder_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_audioencoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_audioencoder_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_audioencoder_h* ifcToKodi, + directFuncToAddon_addoninstance_audioencoder_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_AUDIOENCODER_HDL kodi_addon_audioencoder_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_audioencoder_destroy_v1(KODI_ADDON_AUDIOENCODER_HDL hdl); // Added with API 1 + + bool kodi_addon_audioencoder_start_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl, const struct AUDIOENCODER_INFO_TAG* tag); // Added with API 1 + + ssize_t kodi_addon_audioencoder_encode_v1(KODI_ADDON_AUDIOENCODER_HDL hdl, + const uint8_t* pbt_stream, + size_t num_bytes_read); // Added with API 1 + + bool kodi_addon_audioencoder_finish_v1(KODI_ADDON_AUDIOENCODER_HDL hdl); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static ssize_t kodi_addon_audioencoder_write_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const uint8_t* data, + size_t len); // Added with API 1 + + static ssize_t kodi_addon_audioencoder_seek_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + size_t pos, + int whence); // Added with API 1 + + + directFuncToAddon_addoninstance_audioencoder_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/game.cpp b/xbmc/addons/interface/api/addon-instance/game.cpp new file mode 100644 index 0000000000000..076986f6dd244 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/game.cpp @@ -0,0 +1,443 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "game.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/game.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "games/addons/GameClient.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_game_h::InitDirect(directFuncToKodi_addoninstance_game_h* ifcToKodi, + directFuncToAddon_addoninstance_game_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_game_close_v1 = kodi_addon_game_close_v1; + ifcToKodi->kodi_addon_game_open_stream_v1 = kodi_addon_game_open_stream_v1; + ifcToKodi->kodi_addon_game_get_stream_buffer_v1 = kodi_addon_game_get_stream_buffer_v1; + ifcToKodi->kodi_addon_game_add_stream_data_v1 = kodi_addon_game_add_stream_data_v1; + ifcToKodi->kodi_addon_game_release_stream_buffer_v1 = kodi_addon_game_release_stream_buffer_v1; + ifcToKodi->kodi_addon_game_close_stream_v1 = kodi_addon_game_close_stream_v1; + ifcToKodi->kodi_addon_hw_get_proc_address_v1 = kodi_addon_hw_get_proc_address_v1; + ifcToKodi->kodi_addon_game_input_event_v1 = kodi_addon_game_input_event_v1; +} + +bool CHdl_kodi_addoninstance_game_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_game_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_game_h::{}: addon called with unknown function id '{}' on " + "group 'addoninstance_game_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_GAME_HDL CHdl_kodi_addoninstance_game_h::kodi_addon_game_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_GAME_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + + return m_ifcToAddon->kodi_addon_game_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_destroy_v1(KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_DESTROY_V1)(KODI_ADDON_GAME_HDL hdl); + + m_ifcToAddon->kodi_addon_game_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_game_v1( + const KODI_ADDON_GAME_HDL hdl, const char* url) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_GAME_V1)(const KODI_ADDON_GAME_HDL hdl, const char* url); + + return m_ifcToAddon->kodi_addon_game_load_game_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_game_special_v1( + const KODI_ADDON_GAME_HDL hdl, enum SPECIAL_GAME_TYPE type, const char** urls, size_t urlCount) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1)(const KODI_ADDON_GAME_HDL hdl, enum SPECIAL_GAME_TYPE type, const char** urls, size_t urlCount); + + return m_ifcToAddon->kodi_addon_game_load_game_special_v1(m_ifcToAddon->thisClassHdl, hdl, type, + urls, urlCount); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_standalone_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_STANDALONE_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_load_standalone_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_unload_game_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_UNLOAD_GAME_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_unload_game_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_game_timing_v1( + const KODI_ADDON_GAME_HDL hdl, struct game_system_timing* timing_info) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_GAME_TIMING_V1)(const KODI_ADDON_GAME_HDL hdl, struct game_system_timing* timing_info); + + return m_ifcToAddon->kodi_addon_game_get_game_timing_v1(m_ifcToAddon->thisClassHdl, hdl, + timing_info); +} + +enum GAME_REGION CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_region_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_REGION(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_REGION_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_get_region_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_requires_game_loop_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_requires_game_loop_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_run_frame_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RUN_FRAME_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_run_frame_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_reset_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_reset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_hw_context_reset_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_hw_context_reset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_hw_context_destroy_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_hw_context_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_has_feature_v1(const KODI_ADDON_GAME_HDL hdl, + const char* controller_id, + const char* feature_name) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HAS_FEATURE_V1)(const KODI_ADDON_GAME_HDL hdl, const char* controller_id, const char* feature_name); + + return m_ifcToAddon->kodi_addon_game_has_feature_v1(m_ifcToAddon->thisClassHdl, hdl, + controller_id, feature_name); +} + +struct game_input_topology* CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_topology_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef struct game_input_topology*(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_TOPOLOGY_V1)( const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_get_topology_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_free_topology_v1( + const KODI_ADDON_GAME_HDL hdl, struct game_input_topology* topology) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_FREE_TOPOLOGY_V1)(const KODI_ADDON_GAME_HDL hdl, struct game_input_topology* topology); + + m_ifcToAddon->kodi_addon_game_free_topology_v1(m_ifcToAddon->thisClassHdl, hdl, topology); +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_set_controller_layouts_v1( + const KODI_ADDON_GAME_HDL hdl, + const struct game_controller_layout* controllers, + size_t controller_count) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1)( const KODI_ADDON_GAME_HDL hdl, const struct game_controller_layout* controllers, size_t controller_count); + + m_ifcToAddon->kodi_addon_game_set_controller_layouts_v1(m_ifcToAddon->thisClassHdl, hdl, + controllers, controller_count); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_enable_keyboard_v1( + const KODI_ADDON_GAME_HDL hdl, bool enable, const char* controller_id) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1)(const KODI_ADDON_GAME_HDL hdl, bool enable, const char* controller_id); + + return m_ifcToAddon->kodi_addon_game_enable_keyboard_v1(m_ifcToAddon->thisClassHdl, hdl, enable, + controller_id); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_enable_mouse_v1(const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_ENABLE_MOUSE_V1)(const KODI_ADDON_GAME_HDL hdl, bool enable, const char* controller_id); + + return m_ifcToAddon->kodi_addon_game_enable_mouse_v1(m_ifcToAddon->thisClassHdl, hdl, enable, + controller_id); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_connect_controller_v1( + const KODI_ADDON_GAME_HDL hdl, + bool connect, + const char* port_address, + const char* controller_id) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1)(const KODI_ADDON_GAME_HDL hdl, bool connect, const char* port_address, const char* controller_id); + + return m_ifcToAddon->kodi_addon_game_connect_controller_v1(m_ifcToAddon->thisClassHdl, hdl, + connect, port_address, controller_id); +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_input_event_v1( + const KODI_ADDON_GAME_HDL hdl, const struct game_input_event* event) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_INPUT_EVENT_V1)(const KODI_ADDON_GAME_HDL hdl, const struct game_input_event* event); + + return m_ifcToAddon->kodi_addon_game_input_event_v1(m_ifcToAddon->thisClassHdl, hdl, event); +} + +size_t CHdl_kodi_addoninstance_game_h::kodi_addon_game_serialize_size_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef size_t(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SERIALIZE_SIZE_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_serialize_size_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_serialize_v1( + const KODI_ADDON_GAME_HDL hdl, uint8_t* data, size_t size) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SERIALIZE_V1)(const KODI_ADDON_GAME_HDL hdl, uint8_t* data, size_t size); + + return m_ifcToAddon->kodi_addon_game_serialize_v1(m_ifcToAddon->thisClassHdl, hdl, data, size); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_deserialize_v1( + const KODI_ADDON_GAME_HDL hdl, const uint8_t* data, size_t size) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_DESERIALIZE_V1)(const KODI_ADDON_GAME_HDL hdl, const uint8_t* data, size_t size); + + return m_ifcToAddon->kodi_addon_game_deserialize_v1(m_ifcToAddon->thisClassHdl, hdl, data, size); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_cheat_reset_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CHEAT_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_cheat_reset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_memory_v1( + const KODI_ADDON_GAME_HDL hdl, enum GAME_MEMORY type, uint8_t** data, size_t* size) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_MEMORY_V1)(const KODI_ADDON_GAME_HDL hdl, enum GAME_MEMORY type, uint8_t** data, size_t* size); + + return m_ifcToAddon->kodi_addon_game_get_memory_v1(m_ifcToAddon->thisClassHdl, hdl, type, data, + size); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_set_cheat_v1( + const KODI_ADDON_GAME_HDL hdl, unsigned int index, bool enabled, const char* code) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SET_CHEAT_V1)(const KODI_ADDON_GAME_HDL hdl, unsigned int index, bool enabled, const char* code); + + return m_ifcToAddon->kodi_addon_game_set_cheat_v1(m_ifcToAddon->thisClassHdl, hdl, index, enabled, + code); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_close_v1(void* thisClassHdl, KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "void cb_close_game()" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + cb->cb_close_game(); + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GAME_STREAM_HANDLE CHdl_kodi_addoninstance_game_h::kodi_addon_game_open_stream_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const struct game_stream_properties* properties) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "KODI_GAME_STREAM_HANDLE cb_open_stream(const game_stream_properties* properties)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + return cb->cb_open_stream(properties); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_stream_buffer_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + unsigned int width, + unsigned int height, + struct game_stream_buffer* buffer) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "bool cb_get_stream_buffer(KODI_GAME_STREAM_HANDLE stream,unsigned int width,unsigned int height,game_stream_buffer* buffer)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + return cb->cb_get_stream_buffer(game_hdl, width, height, buffer); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_add_stream_data_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + const struct game_stream_packet* packet) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "void cb_add_stream_data(KODI_GAME_STREAM_HANDLE stream,const game_stream_packet* packet)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + cb->cb_add_stream_data(game_hdl, packet); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_release_stream_buffer_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + struct game_stream_buffer* buffer) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "void cb_release_stream_buffer(KODI_GAME_STREAM_HANDLE stream,game_stream_buffer* buffer)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + cb->cb_release_stream_buffer(game_hdl, buffer); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_close_stream_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "void cb_close_stream(KODI_GAME_STREAM_HANDLE stream)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + cb->cb_close_stream(game_hdl); + /*---AUTO_GEN_PARSE---*/ +} + +game_proc_address_t CHdl_kodi_addoninstance_game_h::kodi_addon_hw_get_proc_address_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const char* symbol) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + return nullptr; +#warning Function "CHdl_kodi_addoninstance_game_h::kodi_addon_hw_get_proc_address" must be set by hand. Alternatively add /*---AUTO_GEN_PARSE---*/ on back of target function in header to find on scan. + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_input_event_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const struct game_input_event* event) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "bool cb_input_event(const game_input_event* event)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + return cb->cb_input_event(event); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/game.h b/xbmc/addons/interface/api/addon-instance/game.h new file mode 100644 index 0000000000000..b70ca557dd8df --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/game.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_game_h; +struct directFuncToKodi_addoninstance_game_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_game_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_game_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_game_h* ifcToKodi, + directFuncToAddon_addoninstance_game_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_GAME_HDL kodi_addon_game_create_v1(KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_game_destroy_v1(KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_load_game_v1(const KODI_ADDON_GAME_HDL hdl, + const char* url); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_load_game_special_v1(const KODI_ADDON_GAME_HDL hdl, + enum SPECIAL_GAME_TYPE type, + const char** urls, + size_t urlCount); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_load_standalone_v1( + const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_unload_game_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_get_game_timing_v1( + const KODI_ADDON_GAME_HDL hdl, struct game_system_timing* timing_info); // Added with API 1 + + enum GAME_REGION kodi_addon_game_get_region_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + bool kodi_addon_game_requires_game_loop_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_run_frame_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_reset_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_hw_context_reset_v1( + const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_hw_context_destroy_v1( + const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + bool kodi_addon_game_has_feature_v1(const KODI_ADDON_GAME_HDL hdl, + const char* controller_id, + const char* feature_name); // Added with API 1 + + struct game_input_topology* kodi_addon_game_get_topology_v1( + const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + void kodi_addon_game_free_topology_v1(const KODI_ADDON_GAME_HDL hdl, + struct game_input_topology* topology); // Added with API 1 + + void kodi_addon_game_set_controller_layouts_v1(const KODI_ADDON_GAME_HDL hdl, + const struct game_controller_layout* controllers, + size_t controller_count); // Added with API 1 + + bool kodi_addon_game_enable_keyboard_v1(const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id); // Added with API 1 + + bool kodi_addon_game_enable_mouse_v1(const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id); // Added with API 1 + + bool kodi_addon_game_connect_controller_v1(const KODI_ADDON_GAME_HDL hdl, + bool connect, + const char* port_address, + const char* controller_id); // Added with API 1 + + bool kodi_addon_game_input_event_v1(const KODI_ADDON_GAME_HDL hdl, + const struct game_input_event* event); // Added with API 1 + + size_t kodi_addon_game_serialize_size_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_serialize_v1(const KODI_ADDON_GAME_HDL hdl, + uint8_t* data, + size_t size); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_deserialize_v1(const KODI_ADDON_GAME_HDL hdl, + const uint8_t* data, + size_t size); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_cheat_reset_v1(const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_get_memory_v1(const KODI_ADDON_GAME_HDL hdl, + enum GAME_MEMORY type, + uint8_t** data, + size_t* size); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_set_cheat_v1(const KODI_ADDON_GAME_HDL hdl, + unsigned int index, + bool enabled, + const char* code); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_addon_game_close_v1(void* thisClassHdl, KODI_OWN_HDL hdl); // Added with API 1 + + static KODI_GAME_STREAM_HANDLE kodi_addon_game_open_stream_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const struct game_stream_properties* properties); // Added with API 1 + + static bool kodi_addon_game_get_stream_buffer_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + unsigned int width, + unsigned int height, + struct game_stream_buffer* buffer); // Added with API 1 + + static void kodi_addon_game_add_stream_data_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + const struct game_stream_packet* packet); // Added with API 1 + + static void kodi_addon_game_release_stream_buffer_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + struct game_stream_buffer* buffer); // Added with API 1 + + static void kodi_addon_game_close_stream_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl); // Added with API 1 + + static game_proc_address_t kodi_addon_hw_get_proc_address_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const char* symbol); // Added with API 1 + + static bool kodi_addon_game_input_event_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const struct game_input_event* event); // Added with API 1 + + + directFuncToAddon_addoninstance_game_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/imagedecoder.cpp b/xbmc/addons/interface/api/addon-instance/imagedecoder.cpp new file mode 100644 index 0000000000000..7232680e57241 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/imagedecoder.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "imagedecoder.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h" + +// Kodi +#include "addons/ImageDecoder.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "addons/ImageDecoder.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_imagedecoder_h::InitDirect( + directFuncToKodi_addoninstance_imagedecoder_h* ifcToKodi, + directFuncToAddon_addoninstance_imagedecoder_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_imagedecoder_mimetype_v1 = kodi_addon_imagedecoder_mimetype_v1; +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_imagedecoder_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_imagedecoder_mimetype_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_imagedecoder_mimetype(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_imagedecoder_mimetype_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_addon_imagedecoder_mimetype_v1(this, hdl); + msgpack::pack( + out, msgParent_OUT_kodi_addon_imagedecoder_mimetype_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_imagedecoder_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_imagedecoder_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_IMAGEDECODER_HDL CHdl_kodi_addoninstance_imagedecoder_h:: + kodi_addon_imagedecoder_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_IMAGEDECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_imagedecoder_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_imagedecoder_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_imagedecoder_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_destroy_v1( + KODI_ADDON_IMAGEDECODER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_imagedecoder_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_imagedecoder_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_load_image_from_memory_v1( + KODI_ADDON_IMAGEDECODER_HDL hdl, + const uint8_t* buffer, + size_t buf_size, + unsigned int* width, + unsigned int* height) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)( KODI_ADDON_IMAGEDECODER_HDL hdl, const uint8_t* buffer, size_t buf_size, unsigned int* width, unsigned int* height); + // Tuple in: typedef std::tuple, size_t, unsigned int, unsigned int> msgChild__IN_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_imagedecoder_load_image_from_memory_v1( + PtrValue(hdl), std::vector(buffer, buffer + buf_size), buf_size, + *width, *height)); + if (!m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_load_image_from_memory_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_imagedecoder_load_image_from_memory_v1 t = + ident.get().as(); + *width = std::get<1>(t); + *height = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_imagedecoder_load_image_from_memory_v1( + m_ifcToAddon->thisClassHdl, hdl, buffer, buf_size, width, height); +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_decode_v1( + KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, + unsigned int width, + unsigned int height, + unsigned int pitch, + enum ADDON_IMG_FMT format) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl, uint8_t* pixels, size_t pixels_size, unsigned int width, unsigned int height, unsigned int pitch, enum ADDON_IMG_FMT format); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_imagedecoder_decode_v1(PtrValue(hdl), pixels_size, + width, height, pitch, format)); + if (!m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_decode_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_imagedecoder_decode_v1 t = ident.get().as(); + std::memcpy(pixels, std::get<1>(t).data(), sizeof(uint8_t) * pixels_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_imagedecoder_decode_v1(m_ifcToAddon->thisClassHdl, hdl, pixels, + pixels_size, width, height, pitch, format); +} + +// Callbacks from addon to Kodi + +char* CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_mimetype_v1( + void* thisClassHdl, KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CImageDecoder" with "const std::string& GetMimeType() const { return m_mimetype; } /*---AUTO_GEN_PARSE---*/" on "addons/ImageDecoder.h". + + ADDON::CImageDecoder* cb = static_cast(hdl); + return strdup(cb->GetMimeType().c_str()); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/imagedecoder.h b/xbmc/addons/interface/api/addon-instance/imagedecoder.h new file mode 100644 index 0000000000000..2866a1e3122f4 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/imagedecoder.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/imagedecoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_imagedecoder_h; +struct directFuncToKodi_addoninstance_imagedecoder_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_imagedecoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_imagedecoder_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_imagedecoder_h* ifcToKodi, + directFuncToAddon_addoninstance_imagedecoder_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_IMAGEDECODER_HDL kodi_addon_imagedecoder_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_imagedecoder_destroy_v1(KODI_ADDON_IMAGEDECODER_HDL hdl); // Added with API 1 + + bool kodi_addon_imagedecoder_load_image_from_memory_v1(KODI_ADDON_IMAGEDECODER_HDL hdl, + const uint8_t* buffer, + size_t buf_size, + unsigned int* width, + unsigned int* height); // Added with API 1 + + bool kodi_addon_imagedecoder_decode_v1(KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, + unsigned int width, + unsigned int height, + unsigned int pitch, + enum ADDON_IMG_FMT format); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static char* kodi_addon_imagedecoder_mimetype_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + + directFuncToAddon_addoninstance_imagedecoder_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/inputstream.cpp b/xbmc/addons/interface/api/addon-instance/inputstream.cpp new file mode 100644 index 0000000000000..b52bd1ca6a955 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/inputstream.cpp @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "inputstream.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_inputstream_h::InitDirect( + directFuncToKodi_addoninstance_inputstream_h* ifcToKodi, + directFuncToAddon_addoninstance_inputstream_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_inputstream_allocate_demux_packet_v1 = + kodi_addon_inputstream_allocate_demux_packet_v1; + ifcToKodi->kodi_addon_inputstream_allocate_encrypted_demux_packet_v1 = + kodi_addon_inputstream_allocate_encrypted_demux_packet_v1; + ifcToKodi->kodi_addon_inputstream_free_demux_packet_v1 = + kodi_addon_inputstream_free_demux_packet_v1; +} + +bool CHdl_kodi_addoninstance_inputstream_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_inputstream_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_inputstream_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_inputstream_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_INPUTSTREAM_HDL CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_create_v1( + KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_INPUTSTREAM_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + + return m_ifcToAddon->kodi_addon_inputstream_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_destroy_v1( + KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DESTROY_V1)(KODI_ADDON_INPUTSTREAM_HDL hdl); + + m_ifcToAddon->kodi_addon_inputstream_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_open_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_PROPERTY* props) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_OPEN_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_PROPERTY* props); + + return m_ifcToAddon->kodi_addon_inputstream_open_v1(m_ifcToAddon->thisClassHdl, hdl, props); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_close_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CLOSE_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + m_ifcToAddon->kodi_addon_inputstream_close_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +const char* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_path_list_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_get_path_list_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_capabilities_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_CAPABILITIES* capabilities) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_CAPABILITIES* capabilities); + + m_ifcToAddon->kodi_addon_inputstream_get_capabilities_v1(m_ifcToAddon->thisClassHdl, hdl, + capabilities); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_stream_ids_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_IDS* ids) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_IDS* ids); + + return m_ifcToAddon->kodi_addon_inputstream_get_stream_ids_v1(m_ifcToAddon->thisClassHdl, hdl, + ids); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + struct INPUTSTREAM_INFO* info, + KODI_OWN_HDL* demuxStream, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid, struct INPUTSTREAM_INFO* info, KODI_OWN_HDL* demuxStream, PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream); + + return m_ifcToAddon->kodi_addon_inputstream_get_stream_v1( + m_ifcToAddon->thisClassHdl, hdl, streamid, info, demuxStream, transfer_stream); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_enable_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid, bool enable) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid, bool enable); + + m_ifcToAddon->kodi_addon_inputstream_enable_stream_v1(m_ifcToAddon->thisClassHdl, hdl, streamid, + enable); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_open_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid); + + return m_ifcToAddon->kodi_addon_inputstream_open_stream_v1(m_ifcToAddon->thisClassHdl, hdl, + streamid); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_reset_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + m_ifcToAddon->kodi_addon_inputstream_demux_reset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_abort_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + m_ifcToAddon->kodi_addon_inputstream_demux_abort_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_flush_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + m_ifcToAddon->kodi_addon_inputstream_demux_flush_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +struct DEMUX_PACKET* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_read_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef struct DEMUX_PACKET*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_demux_read_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_seek_time_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, double time, bool backwards, double* startpts) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, double time, bool backwards, double* startpts); + + return m_ifcToAddon->kodi_addon_inputstream_demux_seek_time_v1(m_ifcToAddon->thisClassHdl, hdl, + time, backwards, startpts); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_set_speed_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int speed) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int speed); + + m_ifcToAddon->kodi_addon_inputstream_demux_set_speed_v1(m_ifcToAddon->thisClassHdl, hdl, speed); +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_set_video_resolution_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int width, int height) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl, int width, int height); + + m_ifcToAddon->kodi_addon_inputstream_set_video_resolution_v1(m_ifcToAddon->thisClassHdl, hdl, + width, height); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_total_time_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_get_total_time_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_time_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_get_time_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_times_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_TIMES* times) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_TIMES* times); + + return m_ifcToAddon->kodi_addon_inputstream_get_times_v1(m_ifcToAddon->thisClassHdl, hdl, times); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_pos_time_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int ms) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_POS_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int ms); + + return m_ifcToAddon->kodi_addon_inputstream_pos_time_v1(m_ifcToAddon->thisClassHdl, hdl, ms); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_read_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, uint8_t* buffer, unsigned int bufferSize) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, uint8_t* buffer, unsigned int bufferSize); + + return m_ifcToAddon->kodi_addon_inputstream_read_stream_v1(m_ifcToAddon->thisClassHdl, hdl, + buffer, bufferSize); +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_seek_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int64_t position, int whence) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int64_t position, int whence); + + return m_ifcToAddon->kodi_addon_inputstream_seek_stream_v1(m_ifcToAddon->thisClassHdl, hdl, + position, whence); +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_position_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_position_stream_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_length_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_length_stream_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_is_real_time_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_is_real_time_stream_v1(m_ifcToAddon->thisClassHdl, + hdl); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_get_chapter_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_count_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_get_chapter_count_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +const char* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_name_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) +{ + // Original API call: typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1)( const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch); + + return m_ifcToAddon->kodi_addon_inputstream_get_chapter_name_v1(m_ifcToAddon->thisClassHdl, hdl, + ch); +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_pos_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch); + + return m_ifcToAddon->kodi_addon_inputstream_get_chapter_pos_v1(m_ifcToAddon->thisClassHdl, hdl, + ch); +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_seek_chapter_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch); + + return m_ifcToAddon->kodi_addon_inputstream_seek_chapter_v1(m_ifcToAddon->thisClassHdl, hdl, ch); +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_block_size_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + return m_ifcToAddon->kodi_addon_inputstream_block_size_stream_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// Callbacks from addon to Kodi + +struct DEMUX_PACKET* CHdl_kodi_addoninstance_inputstream_h:: + kodi_addon_inputstream_allocate_demux_packet_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + int data_size) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "CInputStreamAddon" with "DEMUX_PACKET* cb_allocate_demux_packet(int iDataSize = 0)" on "cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h". + + CInputStreamAddon* cb = static_cast(hdl); + return cb->cb_allocate_demux_packet(data_size); + /*---AUTO_GEN_PARSE---*/ +} + +struct DEMUX_PACKET* CHdl_kodi_addoninstance_inputstream_h:: + kodi_addon_inputstream_allocate_encrypted_demux_packet_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + unsigned int data_size, + unsigned int encrypted_subsample_count) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "CInputStreamAddon" with "DEMUX_PACKET* cb_allocate_encrypted_demux_packet(unsigned int dataSize,unsigned int encryptedSubsampleCount)" on "cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h". + + CInputStreamAddon* cb = static_cast(hdl); + return cb->cb_allocate_encrypted_demux_packet(data_size, encrypted_subsample_count); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_free_demux_packet_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct DEMUX_PACKET* packet) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "CInputStreamAddon" with "void cb_free_demux_packet(DEMUX_PACKET* pPacket)" on "cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h". + + CInputStreamAddon* cb = static_cast(hdl); + cb->cb_free_demux_packet(packet); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/inputstream.h b/xbmc/addons/interface/api/addon-instance/inputstream.h new file mode 100644 index 0000000000000..6814cb270d38b --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/inputstream.h @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_inputstream_h; +struct directFuncToKodi_addoninstance_inputstream_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_inputstream_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_inputstream_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_inputstream_h* ifcToKodi, + directFuncToAddon_addoninstance_inputstream_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_INPUTSTREAM_HDL kodi_addon_inputstream_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_inputstream_destroy_v1(KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + bool kodi_addon_inputstream_open_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_PROPERTY* props); // Added with API 1 + + void kodi_addon_inputstream_close_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + const char* kodi_addon_inputstream_get_path_list_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + void kodi_addon_inputstream_get_capabilities_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_CAPABILITIES* capabilities); // Added with API 1 + + bool kodi_addon_inputstream_get_stream_ids_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_IDS* ids); // Added with API 1 + + bool kodi_addon_inputstream_get_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + struct INPUTSTREAM_INFO* info, + KODI_OWN_HDL* demuxStream, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream); // Added with API 1 + + void kodi_addon_inputstream_enable_stream_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + bool enable); // Added with API 1 + + bool kodi_addon_inputstream_open_stream_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid); // Added with API 1 + + void kodi_addon_inputstream_demux_reset_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + void kodi_addon_inputstream_demux_abort_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + void kodi_addon_inputstream_demux_flush_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + struct DEMUX_PACKET* kodi_addon_inputstream_demux_read_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + bool kodi_addon_inputstream_demux_seek_time_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + double time, + bool backwards, + double* startpts); // Added with API 1 + + void kodi_addon_inputstream_demux_set_speed_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int speed); // Added with API 1 + + void kodi_addon_inputstream_set_video_resolution_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int width, + int height); // Added with API 1 + + int kodi_addon_inputstream_get_total_time_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + int kodi_addon_inputstream_get_time_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + bool kodi_addon_inputstream_get_times_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_TIMES* times); // Added with API 1 + + bool kodi_addon_inputstream_pos_time_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ms); // Added with API 1 + + int kodi_addon_inputstream_read_stream_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + uint8_t* buffer, + unsigned int bufferSize); // Added with API 1 + + int64_t kodi_addon_inputstream_seek_stream_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int64_t position, + int whence); // Added with API 1 + + int64_t kodi_addon_inputstream_position_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + int64_t kodi_addon_inputstream_length_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + bool kodi_addon_inputstream_is_real_time_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + int kodi_addon_inputstream_get_chapter_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + int kodi_addon_inputstream_get_chapter_count_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + const char* kodi_addon_inputstream_get_chapter_name_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); // Added with API 1 + + int64_t kodi_addon_inputstream_get_chapter_pos_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); // Added with API 1 + + bool kodi_addon_inputstream_seek_chapter_v1(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); // Added with API 1 + + int kodi_addon_inputstream_block_size_stream_v1( + const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static struct DEMUX_PACKET* kodi_addon_inputstream_allocate_demux_packet_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, int data_size); // Added with API 1 + + static struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + unsigned int data_size, + unsigned int encrypted_subsample_count); // Added with API 1 + + static void kodi_addon_inputstream_free_demux_packet_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct DEMUX_PACKET* packet); // Added with API 1 + + + directFuncToAddon_addoninstance_inputstream_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/peripheral.cpp b/xbmc/addons/interface/api/addon-instance/peripheral.cpp new file mode 100644 index 0000000000000..0e95fb54e89d7 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/peripheral.cpp @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "peripheral.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "peripherals/addons/PeripheralAddon.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_peripheral_h::InitDirect( + directFuncToKodi_addoninstance_peripheral_h* ifcToKodi, + directFuncToAddon_addoninstance_peripheral_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_peripheral_trigger_scan_v1 = kodi_addon_peripheral_trigger_scan_v1; + ifcToKodi->kodi_addon_peripheral_refresh_button_maps_v1 = + kodi_addon_peripheral_refresh_button_maps_v1; + ifcToKodi->kodi_addon_peripheral_feature_count_v1 = kodi_addon_peripheral_feature_count_v1; + ifcToKodi->kodi_addon_peripheral_feature_type_v1 = kodi_addon_peripheral_feature_type_v1; +} + +bool CHdl_kodi_addoninstance_peripheral_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_peripheral_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_peripheral_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_peripheral_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_PERIPHERAL_HDL CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_create_v1( + KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_PERIPHERAL_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_CREATE_V1)( KODI_OWN_HDL kodi_hdl); + + return m_ifcToAddon->kodi_addon_peripheral_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_destroy_v1( + KODI_ADDON_PERIPHERAL_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_DESTROY_V1)(KODI_ADDON_PERIPHERAL_HDL hdl); + + m_ifcToAddon->kodi_addon_peripheral_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_capabilities_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_CAPABILITIES* capabilities) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_CAPABILITIES* capabilities); + + m_ifcToAddon->kodi_addon_peripheral_get_capabilities_v1(m_ifcToAddon->thisClassHdl, hdl, + capabilities); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_perform_device_scan_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO** scan_results, + size_t* peripheral_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_INFO** scan_results, size_t* peripheral_count); + + return m_ifcToAddon->kodi_addon_peripheral_perform_device_scan_v1(m_ifcToAddon->thisClassHdl, hdl, + scan_results, peripheral_count); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_scan_results_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_INFO* scan_results, size_t peripheral_count) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_INFO* scan_results, size_t peripheral_count); + + m_ifcToAddon->kodi_addon_peripheral_free_scan_results_v1(m_ifcToAddon->thisClassHdl, hdl, + scan_results, peripheral_count); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_events_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_EVENT** events, size_t* event_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_EVENT** events, size_t* event_count); + + return m_ifcToAddon->kodi_addon_peripheral_get_events_v1(m_ifcToAddon->thisClassHdl, hdl, events, + event_count); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_events_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_EVENT* events, size_t event_count) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_EVENT* events, size_t event_count); + + m_ifcToAddon->kodi_addon_peripheral_free_events_v1(m_ifcToAddon->thisClassHdl, hdl, events, + event_count); +} + +bool CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_send_event_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct PERIPHERAL_EVENT* event) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, const struct PERIPHERAL_EVENT* event); + + return m_ifcToAddon->kodi_addon_peripheral_send_event_v1(m_ifcToAddon->thisClassHdl, hdl, event); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_get_joystick_info_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index, + struct JOYSTICK_INFO* info) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index, struct JOYSTICK_INFO* info); + + return m_ifcToAddon->kodi_addon_peripheral_get_joystick_info_v1(m_ifcToAddon->thisClassHdl, hdl, + index, info); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_joystick_info_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct JOYSTICK_INFO* info) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, struct JOYSTICK_INFO* info); + + m_ifcToAddon->kodi_addon_peripheral_free_joystick_info_v1(m_ifcToAddon->thisClassHdl, hdl, info); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_features_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + struct JOYSTICK_FEATURE** features, + size_t* feature_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const char* controller_id, struct JOYSTICK_FEATURE** features, size_t* feature_count); + + return m_ifcToAddon->kodi_addon_peripheral_get_features_v1( + m_ifcToAddon->thisClassHdl, hdl, joystick, controller_id, features, feature_count); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_features_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, struct JOYSTICK_FEATURE* features, size_t feature_count) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, struct JOYSTICK_FEATURE* features, size_t feature_count); + + m_ifcToAddon->kodi_addon_peripheral_free_features_v1(m_ifcToAddon->thisClassHdl, hdl, features, + feature_count); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_map_features_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + const struct JOYSTICK_FEATURE* features, + size_t feature_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const char* controller_id, const struct JOYSTICK_FEATURE* features, size_t feature_count); + + return m_ifcToAddon->kodi_addon_peripheral_map_features_v1( + m_ifcToAddon->thisClassHdl, hdl, joystick, controller_id, features, feature_count); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_get_ignored_primitives_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + struct JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, struct JOYSTICK_DRIVER_PRIMITIVE** primitives, size_t* primitive_count); + + return m_ifcToAddon->kodi_addon_peripheral_get_ignored_primitives_v1( + m_ifcToAddon->thisClassHdl, hdl, joystick, primitives, primitive_count); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_primitives_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, struct JOYSTICK_DRIVER_PRIMITIVE* primitives, size_t primitive_count); + + m_ifcToAddon->kodi_addon_peripheral_free_primitives_v1(m_ifcToAddon->thisClassHdl, hdl, + primitives, primitive_count); +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_set_ignored_primitives_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) +{ + // Original API call: typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, size_t primitive_count); + + return m_ifcToAddon->kodi_addon_peripheral_set_ignored_primitives_v1( + m_ifcToAddon->thisClassHdl, hdl, joystick, primitives, primitive_count); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_save_button_map_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); + + m_ifcToAddon->kodi_addon_peripheral_save_button_map_v1(m_ifcToAddon->thisClassHdl, hdl, joystick); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_revert_button_map_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); + + m_ifcToAddon->kodi_addon_peripheral_revert_button_map_v1(m_ifcToAddon->thisClassHdl, hdl, + joystick); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_reset_button_map_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const char* controller_id) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1)( KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const char* controller_id); + + m_ifcToAddon->kodi_addon_peripheral_reset_button_map_v1(m_ifcToAddon->thisClassHdl, hdl, joystick, + controller_id); +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_power_off_joystick_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index); + + m_ifcToAddon->kodi_addon_peripheral_power_off_joystick_v1(m_ifcToAddon->thisClassHdl, hdl, index); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_trigger_scan_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PERIPHERALS::CPeripheralAddon" with "void TriggerDeviceScan()" on "peripherals/addons/PeripheralAddon.h". + + PERIPHERALS::CPeripheralAddon* cb = static_cast(hdl); + cb->TriggerDeviceScan(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_refresh_button_maps_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const char* device_name, const char* controller_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PERIPHERALS::CPeripheralAddon" with "void RefreshButtonMaps(const std::string& strDeviceName, const std::string& controllerId = "")" on "peripherals/addons/PeripheralAddon.h". + + PERIPHERALS::CPeripheralAddon* cb = static_cast(hdl); + cb->RefreshButtonMaps(device_name, controller_id); + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_feature_count_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* controller_id, + enum JOYSTICK_FEATURE_TYPE type) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PERIPHERALS::CPeripheralAddon" with "unsigned int FeatureCount(const std::string& controllerId, JOYSTICK_FEATURE_TYPE type) const" on "peripherals/addons/PeripheralAddon.h". + + PERIPHERALS::CPeripheralAddon* cb = static_cast(hdl); + return cb->FeatureCount(controller_id, type); + /*---AUTO_GEN_PARSE---*/ +} + +enum JOYSTICK_FEATURE_TYPE CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_feature_type_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* controller_id, + const char* feature_name) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return JOYSTICK_FEATURE_TYPE_UNKNOWN; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PERIPHERALS::CPeripheralAddon" with "JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId,const std::string& featureName) const" on "peripherals/addons/PeripheralAddon.h". + + PERIPHERALS::CPeripheralAddon* cb = static_cast(hdl); + return cb->FeatureType(controller_id, feature_name); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/peripheral.h b/xbmc/addons/interface/api/addon-instance/peripheral.h new file mode 100644 index 0000000000000..f3610e896cfb8 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/peripheral.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_peripheral_h; +struct directFuncToKodi_addoninstance_peripheral_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_peripheral_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_peripheral_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_peripheral_h* ifcToKodi, + directFuncToAddon_addoninstance_peripheral_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_PERIPHERAL_HDL kodi_addon_peripheral_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_peripheral_destroy_v1(KODI_ADDON_PERIPHERAL_HDL hdl); // Added with API 1 + + void kodi_addon_peripheral_get_capabilities_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_CAPABILITIES* capabilities); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_perform_device_scan_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO** scan_results, + size_t* peripheral_count); // Added with API 1 + + void kodi_addon_peripheral_free_scan_results_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO* scan_results, + size_t peripheral_count); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_get_events_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT** events, + size_t* event_count); // Added with API 1 + + void kodi_addon_peripheral_free_events_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT* events, + size_t event_count); // Added with API 1 + + bool kodi_addon_peripheral_send_event_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct PERIPHERAL_EVENT* event); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_get_joystick_info_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index, + struct JOYSTICK_INFO* info); // Added with API 1 + + void kodi_addon_peripheral_free_joystick_info_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_INFO* info); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_get_features_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + struct JOYSTICK_FEATURE** features, + size_t* feature_count); // Added with API 1 + + void kodi_addon_peripheral_free_features_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_FEATURE* features, + size_t feature_count); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_map_features_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + const struct JOYSTICK_FEATURE* features, + size_t feature_count); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_get_ignored_primitives_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + struct JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count); // Added with API 1 + + void kodi_addon_peripheral_free_primitives_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); // Added with API 1 + + enum PERIPHERAL_ERROR kodi_addon_peripheral_set_ignored_primitives_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); // Added with API 1 + + void kodi_addon_peripheral_save_button_map_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); // Added with API 1 + + void kodi_addon_peripheral_revert_button_map_v1( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); // Added with API 1 + + void kodi_addon_peripheral_reset_button_map_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id); // Added with API 1 + + void kodi_addon_peripheral_power_off_joystick_v1(KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_addon_peripheral_trigger_scan_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_peripheral_refresh_button_maps_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* device_name, + const char* controller_id); // Added with API 1 + + static unsigned int kodi_addon_peripheral_feature_count_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* controller_id, + enum JOYSTICK_FEATURE_TYPE type); // Added with API 1 + + static enum JOYSTICK_FEATURE_TYPE kodi_addon_peripheral_feature_type_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* controller_id, + const char* feature_name); // Added with API 1 + + + directFuncToAddon_addoninstance_peripheral_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/pvr.cpp b/xbmc/addons/interface/api/addon-instance/pvr.cpp new file mode 100644 index 0000000000000..7dd85baf189f7 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/pvr.cpp @@ -0,0 +1,2206 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "pvr.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "pvr/addons/PVRClient.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_pvr_h::InitDirect(directFuncToKodi_addoninstance_pvr_h* ifcToKodi, + directFuncToAddon_addoninstance_pvr_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_pvr_get_epg_max_future_days_v1 = kodi_addon_pvr_get_epg_max_future_days_v1; + ifcToKodi->kodi_addon_pvr_get_epg_max_past_days_v1 = kodi_addon_pvr_get_epg_max_past_days_v1; + ifcToKodi->kodi_addon_pvr_add_menu_hook_v1 = kodi_addon_pvr_add_menu_hook_v1; + ifcToKodi->kodi_addon_pvr_recording_notification_v1 = kodi_addon_pvr_recording_notification_v1; + ifcToKodi->kodi_addon_pvr_connection_state_change_v1 = kodi_addon_pvr_connection_state_change_v1; + ifcToKodi->kodi_addon_pvr_epg_event_state_change_v1 = kodi_addon_pvr_epg_event_state_change_v1; + ifcToKodi->kodi_addon_pvr_transfer_channel_entry_v1 = kodi_addon_pvr_transfer_channel_entry_v1; + ifcToKodi->kodi_addon_pvr_transfer_provider_entry_v1 = kodi_addon_pvr_transfer_provider_entry_v1; + ifcToKodi->kodi_addon_pvr_transfer_channel_group_v1 = kodi_addon_pvr_transfer_channel_group_v1; + ifcToKodi->kodi_addon_pvr_transfer_channel_group_member_v1 = + kodi_addon_pvr_transfer_channel_group_member_v1; + ifcToKodi->kodi_addon_pvr_transfer_epg_entry_v1 = kodi_addon_pvr_transfer_epg_entry_v1; + ifcToKodi->kodi_addon_pvr_transfer_recording_entry_v1 = + kodi_addon_pvr_transfer_recording_entry_v1; + ifcToKodi->kodi_addon_pvr_transfer_timer_entry_v1 = kodi_addon_pvr_transfer_timer_entry_v1; + ifcToKodi->kodi_addon_pvr_trigger_channel_update_v1 = kodi_addon_pvr_trigger_channel_update_v1; + ifcToKodi->kodi_addon_pvr_trigger_providers_update_v1 = + kodi_addon_pvr_trigger_providers_update_v1; + ifcToKodi->kodi_addon_pvr_trigger_channel_groups_update_v1 = + kodi_addon_pvr_trigger_channel_groups_update_v1; + ifcToKodi->kodi_addon_pvr_trigger_epg_update_v1 = kodi_addon_pvr_trigger_epg_update_v1; + ifcToKodi->kodi_addon_pvr_trigger_recording_update_v1 = + kodi_addon_pvr_trigger_recording_update_v1; + ifcToKodi->kodi_addon_pvr_trigger_timer_update_v1 = kodi_addon_pvr_trigger_timer_update_v1; +} + +bool CHdl_kodi_addoninstance_pvr_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_pvr_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_pvr_get_epg_max_future_days_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_get_epg_max_future_days_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_addon_pvr_get_epg_max_future_days_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_addon_pvr_get_epg_max_future_days_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_pvr_get_epg_max_past_days_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_get_epg_max_past_days_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_addon_pvr_get_epg_max_past_days_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_addon_pvr_get_epg_max_past_days_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_pvr_add_menu_hook_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_OWN_HDL hdl, const struct PVR_MENUHOOK* hook) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_add_menu_hook_v1 t = in.get().as(); + PVR_MENUHOOK hook; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + std::get<1>(t).SetCStructure(&hook); + kodi_addon_pvr_add_menu_hook_v1(this, hdl, &hook); + return true; + } + case funcParent_kodi_addon_pvr_recording_notification_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_OWN_HDL hdl, const char* name, const char* fileName, bool on) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_recording_notification_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::string& name = std::get<1>(t); + const std::string& fileName = std::get<2>(t); + bool on = std::get<3>(t); + kodi_addon_pvr_recording_notification_v1(this, hdl, name.c_str(), fileName.c_str(), on); + return true; + } + case funcParent_kodi_addon_pvr_connection_state_change_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_connection_state_change(KODI_OWN_HDL hdl, const char* strConnectionString, enum PVR_CONNECTION_STATE newState, const char* strMessage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_connection_state_change_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::string& strConnectionString = std::get<1>(t); + enum PVR_CONNECTION_STATE newState = std::get<2>(t); + const std::string& strMessage = std::get<3>(t); + kodi_addon_pvr_connection_state_change_v1(this, hdl, strConnectionString.c_str(), newState, + strMessage.c_str()); + return true; + } + case funcParent_kodi_addon_pvr_epg_event_state_change_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_epg_event_state_change(KODI_OWN_HDL hdl, struct EPG_TAG* tag, enum EPG_EVENT_STATE newState) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_epg_event_state_change_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + struct EPG_TAG tag; + enum EPG_EVENT_STATE newState = std::get<1>(t); + kodi_addon_pvr_epg_event_state_change_v1(this, hdl, &tag, newState); + msgpack::pack(out, msgParent_OUT_kodi_addon_pvr_epg_event_state_change_v1(&tag)); + return true; + } + case funcParent_kodi_addon_pvr_transfer_channel_entry_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL* chan) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1 t = in.get().as(); + PVR_CHANNEL chan; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&chan); + kodi_addon_pvr_transfer_channel_entry_v1(this, hdl, handle, &chan); + return true; + } + case funcParent_kodi_addon_pvr_transfer_provider_entry_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_provider_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_PROVIDER* chanProvider) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1 t = in.get().as(); + PVR_PROVIDER chanProvider; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&chanProvider); + kodi_addon_pvr_transfer_provider_entry_v1(this, hdl, handle, &chanProvider); + return true; + } + case funcParent_kodi_addon_pvr_transfer_channel_group_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1 t = in.get().as(); + PVR_CHANNEL_GROUP group; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&group); + kodi_addon_pvr_transfer_channel_group_v1(this, hdl, handle, &group); + return true; + } + case funcParent_kodi_addon_pvr_transfer_channel_group_member_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group_member( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP_MEMBER* member) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1 t = in.get().as(); + PVR_CHANNEL_GROUP_MEMBER member; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&member); + kodi_addon_pvr_transfer_channel_group_member_v1(this, hdl, handle, &member); + return true; + } + case funcParent_kodi_addon_pvr_transfer_epg_entry_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_epg_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct EPG_TAG* epgentry) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1 t = in.get().as(); + EPG_TAG epgentry; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&epgentry); + kodi_addon_pvr_transfer_epg_entry_v1(this, hdl, handle, &epgentry); + return true; + } + case funcParent_kodi_addon_pvr_transfer_recording_entry_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_recording_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_RECORDING* recording) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1 t = in.get().as(); + PVR_RECORDING recording; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&recording); + kodi_addon_pvr_transfer_recording_entry_v1(this, hdl, handle, &recording); + return true; + } + case funcParent_kodi_addon_pvr_transfer_timer_entry_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_timer_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_TIMER* timer) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1 t = in.get().as(); + PVR_TIMER timer; + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&timer); + kodi_addon_pvr_transfer_timer_entry_v1(this, hdl, handle, &timer); + return true; + } + case funcParent_kodi_addon_pvr_trigger_channel_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_channel_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_pvr_trigger_channel_update_v1(this, hdl); + return true; + } + case funcParent_kodi_addon_pvr_trigger_providers_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_providers_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_pvr_trigger_providers_update_v1(this, hdl); + return true; + } + case funcParent_kodi_addon_pvr_trigger_channel_groups_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_channel_groups_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_pvr_trigger_channel_groups_update_v1(this, hdl); + return true; + } + case funcParent_kodi_addon_pvr_trigger_epg_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_OWN_HDL hdl, unsigned int iChannelUid) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_epg_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int iChannelUid = std::get<1>(t); + kodi_addon_pvr_trigger_epg_update_v1(this, hdl, iChannelUid); + return true; + } + case funcParent_kodi_addon_pvr_trigger_recording_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_recording_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_pvr_trigger_recording_update_v1(this, hdl); + return true; + } + case funcParent_kodi_addon_pvr_trigger_timer_update_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_pvr_trigger_timer_update_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_pvr_trigger_timer_update_v1(this, hdl); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_pvr_h::{}: addon called with unknown function id '{}' on " + "group 'addoninstance_pvr_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_capabilities_v1( + KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_capabilities_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_capabilities_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_capabilities_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(capabilities); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_capabilities_v1(m_ifcToAddon->thisClassHdl, hdl, + capabilities); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_name_v1( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_backend_name_v1(PtrValue(hdl), mem_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_backend_name_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_backend_name_v1 t = ident.get().as(); + strncpy(str, std::get<1>(t).c_str(), mem_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_backend_name_v1(m_ifcToAddon->thisClassHdl, hdl, str, + mem_size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_version_v1( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_backend_version_v1(PtrValue(hdl), mem_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_backend_version_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_backend_version_v1 t = ident.get().as(); + strncpy(str, std::get<1>(t).c_str(), mem_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_backend_version_v1(m_ifcToAddon->thisClassHdl, hdl, str, + mem_size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_hostname_v1( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_backend_hostname_v1(PtrValue(hdl), mem_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_backend_hostname_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_backend_hostname_v1 t = ident.get().as(); + strncpy(str, std::get<1>(t).c_str(), mem_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_backend_hostname_v1(m_ifcToAddon->thisClassHdl, hdl, str, + mem_size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_connection_string_v1( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_get_connection_string_v1(PtrValue(hdl), mem_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_connection_string_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_connection_string_v1 t = ident.get().as(); + strncpy(str, std::get<1>(t).c_str(), mem_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_connection_string_v1(m_ifcToAddon->thisClassHdl, hdl, str, + mem_size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_drive_space_v1( + KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1)( KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_drive_space_v1(PtrValue(hdl), *total, *used)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_drive_space_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_drive_space_v1 t = ident.get().as(); + *total = std::get<1>(t); + *used = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_drive_space_v1(m_ifcToAddon->thisClassHdl, hdl, total, + used); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_settings_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_call_settings_menu_hook_v1(PtrValue(hdl), menuhook)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_call_settings_menu_hook_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_call_settings_menu_hook_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_call_settings_menu_hook_v1(m_ifcToAddon->thisClassHdl, hdl, + menuhook); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channels_amount_v1( + KODI_ADDON_PVR_HDL hdl, int* amount) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_channels_amount_v1(PtrValue(hdl), *amount)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channels_amount_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channels_amount_v1 t = ident.get().as(); + *amount = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channels_amount_v1(m_ifcToAddon->thisClassHdl, hdl, + amount); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channels_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_get_channels_v1(PtrValue(hdl), PtrValue(handle), radio)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channels_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channels_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channels_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + radio); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_channel_stream_properties_v1( + PtrValue(hdl), channel, *properties_count)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channel_stream_properties_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channel_stream_properties_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(properties); + *properties_count = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channel_stream_properties_v1( + m_ifcToAddon->thisClassHdl, hdl, channel, properties, properties_count); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_signal_status_v1( + KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_SIGNAL_STATUS* signal_status) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_SIGNAL_STATUS* signal_status); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_signal_status_v1(PtrValue(hdl), channel_uid)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_signal_status_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_signal_status_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(signal_status); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_signal_status_v1(m_ifcToAddon->thisClassHdl, hdl, + channel_uid, signal_status); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_descramble_info_v1( + KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_DESCRAMBLE_INFO* descramble_info) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_DESCRAMBLE_INFO* descramble_info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_get_descramble_info_v1(PtrValue(hdl), channel_uid)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_descramble_info_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_descramble_info_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(descramble_info); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_descramble_info_v1(m_ifcToAddon->thisClassHdl, hdl, + channel_uid, descramble_info); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_providers_amount_v1( + KODI_ADDON_PVR_HDL hdl, int* amount) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_providers_amount_v1(PtrValue(hdl), *amount)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_providers_amount_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_providers_amount_v1 t = ident.get().as(); + *amount = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_providers_amount_v1(m_ifcToAddon->thisClassHdl, hdl, + amount); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_providers_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_get_providers_v1(PtrValue(hdl), PtrValue(handle))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_providers_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_providers_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_providers_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_groups_amount_v1( + KODI_ADDON_PVR_HDL hdl, int* amount) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_get_channel_groups_amount_v1(PtrValue(hdl), *amount)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channel_groups_amount_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channel_groups_amount_v1 t = ident.get().as(); + *amount = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channel_groups_amount_v1(m_ifcToAddon->thisClassHdl, hdl, + amount); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_groups_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_channel_groups_v1(PtrValue(hdl), + PtrValue(handle), radio)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channel_groups_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channel_groups_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channel_groups_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + radio); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_group_members_v1( + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_channel_group_members_v1( + PtrValue(hdl), PtrValue(handle), group)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_channel_group_members_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_channel_group_members_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_channel_group_members_v1(m_ifcToAddon->thisClassHdl, hdl, + handle, group); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_channel_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_delete_channel_v1(PtrValue(hdl), channel)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_delete_channel_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_delete_channel_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_delete_channel_v1(m_ifcToAddon->thisClassHdl, hdl, channel); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_rename_channel_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_rename_channel_v1(PtrValue(hdl), channel)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_rename_channel_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_rename_channel_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_rename_channel_v1(m_ifcToAddon->thisClassHdl, hdl, channel); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_settings_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_open_dialog_channel_settings_v1(PtrValue(hdl), channel)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_open_dialog_channel_settings_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_open_dialog_channel_settings_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_open_dialog_channel_settings_v1(m_ifcToAddon->thisClassHdl, + hdl, channel); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_add_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_open_dialog_channel_add_v1(PtrValue(hdl), channel)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_open_dialog_channel_add_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_open_dialog_channel_add_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_open_dialog_channel_add_v1(m_ifcToAddon->thisClassHdl, hdl, + channel); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_scan_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_open_dialog_channel_scan_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_open_dialog_channel_scan_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_open_dialog_channel_scan_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_open_dialog_channel_scan_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_channel_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_CHANNEL* channel) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_call_channel_menu_hook_v1(PtrValue(hdl), menuhook, + channel)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_call_channel_menu_hook_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_call_channel_menu_hook_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_call_channel_menu_hook_v1(m_ifcToAddon->thisClassHdl, hdl, + menuhook, channel); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_for_channel_v1( + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + int channel_uid, + time_t start, + time_t end) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, int channel_uid, time_t start, time_t end); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_epg_for_channel_v1( + PtrValue(hdl), PtrValue(handle), channel_uid, start, end)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_epg_for_channel_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_epg_for_channel_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_epg_for_channel_v1(m_ifcToAddon->thisClassHdl, hdl, + handle, channel_uid, start, end); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_is_epg_tag_recordable_v1( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_recordable) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_recordable); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_is_epg_tag_recordable_v1(PtrValue(hdl), tag, + *is_recordable)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_is_epg_tag_recordable_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_is_epg_tag_recordable_v1 t = ident.get().as(); + *is_recordable = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_is_epg_tag_recordable_v1(m_ifcToAddon->thisClassHdl, hdl, tag, + is_recordable); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_is_epg_tag_playable_v1( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_playable) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_playable); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_is_epg_tag_playable_v1(PtrValue(hdl), tag, *is_playable)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_is_epg_tag_playable_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_is_epg_tag_playable_v1 t = ident.get().as(); + *is_playable = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_is_epg_tag_playable_v1(m_ifcToAddon->thisClassHdl, hdl, tag, + is_playable); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_tag_edl_v1( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_EDL_ENTRY edl[], size_t* size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_EDL_ENTRY edl[], size_t* size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + std::vector ifc_edl(*size); + for (size_t i = 0; i < *size; ++i) + { + ifc_edl[i] = IFC_PVR_EDL_ENTRY(&edl[i]); + } + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_get_epg_tag_edl_v1(PtrValue(hdl), tag, ifc_edl, *size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_epg_tag_edl_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_epg_tag_edl_v1 t = ident.get().as(); + std::vector& ifc_out_edl = std::get<1>(t); + *size = std::get<2>(t); + for (size_t i = 0; i < *size; ++i) + { + ifc_out_edl[i].SetCStructure(&edl[i]); + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_epg_tag_edl_v1(m_ifcToAddon->thisClassHdl, hdl, tag, edl, + size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_tag_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_epg_tag_stream_properties_v1( + PtrValue(hdl), tag, *properties_count)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_epg_tag_stream_properties_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_epg_tag_stream_properties_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(properties); + *properties_count = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_epg_tag_stream_properties_v1( + m_ifcToAddon->thisClassHdl, hdl, tag, properties, properties_count); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_epg_max_past_days_v1( + KODI_ADDON_PVR_HDL hdl, int past_days) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int past_days); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_set_epg_max_past_days_v1(PtrValue(hdl), past_days)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_set_epg_max_past_days_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_set_epg_max_past_days_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_set_epg_max_past_days_v1(m_ifcToAddon->thisClassHdl, hdl, + past_days); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_epg_max_future_days_v1( + KODI_ADDON_PVR_HDL hdl, int future_days) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int future_days); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_set_epg_max_future_days_v1(PtrValue(hdl), future_days)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_set_epg_max_future_days_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_set_epg_max_future_days_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_set_epg_max_future_days_v1(m_ifcToAddon->thisClassHdl, hdl, + future_days); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_epg_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct EPG_TAG* tag) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct EPG_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_call_epg_menu_hook_v1(PtrValue(hdl), menuhook, tag)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_call_epg_menu_hook_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_call_epg_menu_hook_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_call_epg_menu_hook_v1(m_ifcToAddon->thisClassHdl, hdl, + menuhook, tag); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recordings_amount_v1( + KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_get_recordings_amount_v1(PtrValue(hdl), deleted, *amount)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recordings_amount_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recordings_amount_v1 t = ident.get().as(); + *amount = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recordings_amount_v1(m_ifcToAddon->thisClassHdl, hdl, + deleted, amount); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recordings_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool deleted) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool deleted); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_recordings_v1(PtrValue(hdl), PtrValue(handle), + deleted)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recordings_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recordings_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recordings_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + deleted); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_delete_recording_v1(PtrValue(hdl), recording)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_delete_recording_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_delete_recording_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_delete_recording_v1(m_ifcToAddon->thisClassHdl, hdl, + recording); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_undelete_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_undelete_recording_v1(PtrValue(hdl), recording)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_undelete_recording_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_undelete_recording_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_undelete_recording_v1(m_ifcToAddon->thisClassHdl, hdl, + recording); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_all_recordings_from_trash_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_delete_all_recordings_from_trash_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_delete_all_recordings_from_trash_v1, in, + out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_delete_all_recordings_from_trash_v1 t = + ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_delete_all_recordings_from_trash_v1( + m_ifcToAddon->thisClassHdl, hdl); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_rename_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_rename_recording_v1(PtrValue(hdl), recording)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_rename_recording_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_rename_recording_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_rename_recording_v1(m_ifcToAddon->thisClassHdl, hdl, + recording); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_lifetime_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_set_recording_lifetime_v1(PtrValue(hdl), recording)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_set_recording_lifetime_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_set_recording_lifetime_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_set_recording_lifetime_v1(m_ifcToAddon->thisClassHdl, hdl, + recording); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_play_count_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int count) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_set_recording_play_count_v1(PtrValue(hdl), + recording, count)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_set_recording_play_count_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_set_recording_play_count_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_set_recording_play_count_v1(m_ifcToAddon->thisClassHdl, hdl, + recording, count); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_last_played_position_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int last_played_position) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int last_played_position); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_set_recording_last_played_position_v1( + PtrValue(hdl), recording, last_played_position)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_set_recording_last_played_position_v1, in, + out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_set_recording_last_played_position_v1 t = + ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_set_recording_last_played_position_v1( + m_ifcToAddon->thisClassHdl, hdl, recording, last_played_position); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_last_played_position_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int* last_played_position) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int* last_played_position); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_recording_last_played_position_v1( + PtrValue(hdl), recording, *last_played_position)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recording_last_played_position_v1, in, + out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recording_last_played_position_v1 t = + ident.get().as(); + *last_played_position = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recording_last_played_position_v1( + m_ifcToAddon->thisClassHdl, hdl, recording, last_played_position); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_edl_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_EDL_ENTRY edl[], + size_t* size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_EDL_ENTRY edl[], size_t* size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + std::vector ifc_edl(*size); + for (size_t i = 0; i < *size; ++i) + { + ifc_edl[i] = IFC_PVR_EDL_ENTRY(&edl[i]); + } + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_recording_edl_v1(PtrValue(hdl), recording, + ifc_edl, *size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recording_edl_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recording_edl_v1 t = ident.get().as(); + std::vector& ifc_out_edl = std::get<1>(t); + *size = std::get<2>(t); + for (size_t i = 0; i < *size; ++i) + { + ifc_out_edl[i].SetCStructure(&edl[i]); + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recording_edl_v1(m_ifcToAddon->thisClassHdl, hdl, + recording, edl, size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_size_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int64_t* size) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int64_t* size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_get_recording_size_v1(PtrValue(hdl), recording, *size)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recording_size_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recording_size_v1 t = ident.get().as(); + *size = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recording_size_v1(m_ifcToAddon->thisClassHdl, hdl, + recording, size); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_recording_stream_properties_v1( + PtrValue(hdl), recording, *properties_count)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_recording_stream_properties_v1, in, + out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_recording_stream_properties_v1 t = + ident.get().as(); + std::get<1>(t).SetCStructure(properties); + *properties_count = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_recording_stream_properties_v1( + m_ifcToAddon->thisClassHdl, hdl, recording, properties, properties_count); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_recording_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_RECORDING* recording) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_call_recording_menu_hook_v1(PtrValue(hdl), + menuhook, recording)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_call_recording_menu_hook_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_call_recording_menu_hook_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_call_recording_menu_hook_v1(m_ifcToAddon->thisClassHdl, hdl, + menuhook, recording); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timer_types_v1( + KODI_ADDON_PVR_HDL hdl, struct PVR_TIMER_TYPE types[], size_t* types_count) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_TIMER_TYPE types[], size_t* types_count); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + std::vector ifc_types(*types_count); + for (size_t i = 0; i < *types_count; ++i) + { + ifc_types[i] = IFC_PVR_TIMER_TYPE(&types[i]); + } + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_get_timer_types_v1(PtrValue(hdl), ifc_types, *types_count)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_timer_types_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_timer_types_v1 t = ident.get().as(); + std::vector& ifc_out_types = std::get<1>(t); + *types_count = std::get<2>(t); + for (size_t i = 0; i < *types_count; ++i) + { + ifc_out_types[i].SetCStructure(&types[i]); + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_timer_types_v1(m_ifcToAddon->thisClassHdl, hdl, types, + types_count); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timers_amount_v1( + KODI_ADDON_PVR_HDL hdl, int* amount) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_timers_amount_v1(PtrValue(hdl), *amount)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_timers_amount_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_timers_amount_v1 t = ident.get().as(); + *amount = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_timers_amount_v1(m_ifcToAddon->thisClassHdl, hdl, amount); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timers_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_get_timers_v1(PtrValue(hdl), PtrValue(handle))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_get_timers_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_get_timers_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_get_timers_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_add_timer_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ADD_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_add_timer_v1(PtrValue(hdl), timer)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_add_timer_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_add_timer_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_add_timer_v1(m_ifcToAddon->thisClassHdl, hdl, timer); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_timer_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer, bool force_delete) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer, bool force_delete); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_pvr_delete_timer_v1(PtrValue(hdl), timer, force_delete)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_delete_timer_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_delete_timer_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_delete_timer_v1(m_ifcToAddon->thisClassHdl, hdl, timer, + force_delete); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_update_timer_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_update_timer_v1(PtrValue(hdl), timer)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_update_timer_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_update_timer_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_update_timer_v1(m_ifcToAddon->thisClassHdl, hdl, timer); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_timer_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_TIMER* timer) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_pvr_call_timer_menu_hook_v1(PtrValue(hdl), menuhook, timer)); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_call_timer_menu_hook_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_call_timer_menu_hook_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_call_timer_menu_hook_v1(m_ifcToAddon->thisClassHdl, hdl, + menuhook, timer); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_system_sleep_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_on_system_sleep_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_on_system_sleep_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_on_system_sleep_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_on_system_sleep_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_system_wake_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_on_system_wake_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_on_system_wake_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_on_system_wake_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_on_system_wake_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_power_saving_activated_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_on_power_saving_activated_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_on_power_saving_activated_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_on_power_saving_activated_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_on_power_saving_activated_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_power_saving_deactivated_v1( + KODI_ADDON_PVR_HDL hdl) +{ + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_pvr_on_power_saving_deactivated_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_pvr_h, + funcChild_kodi_addon_pvr_on_power_saving_deactivated_v1, in, out)) + return PVR_ERROR_NO_ERROR; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_pvr_on_power_saving_deactivated_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_pvr_on_power_saving_deactivated_v1(m_ifcToAddon->thisClassHdl, + hdl); +} + +// Callbacks from addon to Kodi + +int CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_max_future_days_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "int cb_get_epg_max_future_days()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + return cb->cb_get_epg_max_future_days(); + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_max_past_days_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "int cb_get_epg_max_past_days()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + return cb->cb_get_epg_max_past_days(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_add_menu_hook_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const struct PVR_MENUHOOK* hook) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_add_menu_hook(const PVR_MENUHOOK* hook)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_add_menu_hook(hook); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_recording_notification_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const char* name, const char* fileName, bool on) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_recording_notification(const char* strName,const char* strFileName,bool bOnOff)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_recording_notification(name, fileName, on); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_connection_state_change_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* strConnectionString, + enum PVR_CONNECTION_STATE newState, + const char* strMessage) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_connection_state_change(const char* strConnectionString,PVR_CONNECTION_STATE newState,const char* strMessage)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_connection_state_change(strConnectionString, newState, strMessage); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_epg_event_state_change_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct EPG_TAG* tag, enum EPG_EVENT_STATE newState) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_epg_event_state_change(EPG_TAG* tag, EPG_EVENT_STATE newState)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_epg_event_state_change(tag, newState); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_channel_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL* chan) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_channel_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle,const PVR_CHANNEL* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_channel_entry(handle, chan); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_provider_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_PROVIDER* chanProvider) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_provider_entry(void* kodiInstance,const ADDON_HANDLE handle,const PVR_PROVIDER* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_provider_entry(handle, chanProvider); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_channel_group_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_channel_group(const KODI_ADDON_PVR_TRANSFER_HDL handle,const PVR_CHANNEL_GROUP* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_channel_group(handle, group); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_channel_group_member_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP_MEMBER* member) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_channel_group_member(const KODI_ADDON_PVR_TRANSFER_HDL handle,const PVR_CHANNEL_GROUP_MEMBER* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_channel_group_member(handle, member); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_epg_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct EPG_TAG* epgentry) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_epg_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle,const EPG_TAG* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_epg_entry(handle, epgentry); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_recording_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_RECORDING* recording) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_recording_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle,const PVR_RECORDING* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_recording_entry(handle, recording); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_transfer_timer_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_TIMER* timer) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_transfer_timer_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle,const PVR_TIMER* entry)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_transfer_timer_entry(handle, timer); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_channel_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_channel_update()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_channel_update(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_providers_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + +#warning Function "CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_providers_update" must be set by hand. Alternatively add /*---AUTO_GEN_PARSE---*/ on back of target function in header to find on scan. + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_channel_groups_update_v1( + void* thisClassHdl, KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_channel_groups_update()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_channel_groups_update(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_epg_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + unsigned int iChannelUid) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_epg_update(unsigned int iChannelUid)" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_epg_update(iChannelUid); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_recording_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_recording_update()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_recording_update(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_timer_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_timer_update()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_timer_update(); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/pvr.h b/xbmc/addons/interface/api/addon-instance/pvr.h new file mode 100644 index 0000000000000..95d43f88b8516 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/pvr.h @@ -0,0 +1,372 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_pvr_h; +struct directFuncToKodi_addoninstance_pvr_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_pvr_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_pvr_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_pvr_h* ifcToKodi, + directFuncToAddon_addoninstance_pvr_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + enum PVR_ERROR kodi_addon_pvr_get_capabilities_v1( + KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_backend_name_v1(KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_backend_version_v1(KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_backend_hostname_v1(KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_connection_string_v1(KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_drive_space_v1(KODI_ADDON_PVR_HDL hdl, + uint64_t* total, + uint64_t* used); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_call_settings_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channels_amount_v1(KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channels_v1(KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channel_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_signal_status_v1( + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_SIGNAL_STATUS* signal_status); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_descramble_info_v1( + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_DESCRAMBLE_INFO* descramble_info); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_providers_amount_v1(KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_providers_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channel_groups_amount_v1(KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channel_groups_v1(KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_channel_group_members_v1( + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_delete_channel_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_rename_channel_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_settings_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_add_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_scan_v1( + KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_call_channel_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_CHANNEL* channel); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_epg_for_channel_v1(KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + int channel_uid, + time_t start, + time_t end); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_is_epg_tag_recordable_v1(KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_recordable); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_is_epg_tag_playable_v1(KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_playable); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_epg_tag_edl_v1(KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_EDL_ENTRY edl[], + size_t* size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_epg_tag_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_set_epg_max_past_days_v1(KODI_ADDON_PVR_HDL hdl, + int past_days); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_set_epg_max_future_days_v1(KODI_ADDON_PVR_HDL hdl, + int future_days); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_call_epg_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct EPG_TAG* tag); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recordings_amount_v1(KODI_ADDON_PVR_HDL hdl, + bool deleted, + int* amount); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recordings_v1(KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool deleted); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_delete_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_undelete_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_delete_all_recordings_from_trash_v1( + KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_rename_recording_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_set_recording_lifetime_v1( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_set_recording_play_count_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int count); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_set_recording_last_played_position_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int last_played_position); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recording_last_played_position_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int* last_played_position); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recording_edl_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_EDL_ENTRY edl[], + size_t* size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recording_size_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int64_t* size); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_recording_stream_properties_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_call_recording_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_RECORDING* recording); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_timer_types_v1(KODI_ADDON_PVR_HDL hdl, + struct PVR_TIMER_TYPE types[], + size_t* types_count); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_timers_amount_v1(KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_get_timers_v1( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_add_timer_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_delete_timer_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer, + bool force_delete); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_update_timer_v1(KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_call_timer_menu_hook_v1( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_TIMER* timer); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_on_system_sleep_v1(KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_on_system_wake_v1(KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_on_power_saving_activated_v1( + KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + enum PVR_ERROR kodi_addon_pvr_on_power_saving_deactivated_v1( + KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static int kodi_addon_pvr_get_epg_max_future_days_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static int kodi_addon_pvr_get_epg_max_past_days_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_add_menu_hook_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const struct PVR_MENUHOOK* hook); // Added with API 1 + + static void kodi_addon_pvr_recording_notification_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* name, + const char* fileName, + bool on); // Added with API 1 + + static void kodi_addon_pvr_connection_state_change_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* strConnectionString, + enum PVR_CONNECTION_STATE newState, + const char* strMessage); // Added with API 1 + + static void kodi_addon_pvr_epg_event_state_change_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + struct EPG_TAG* tag, + enum EPG_EVENT_STATE newState); // Added with API 1 + + static void kodi_addon_pvr_transfer_channel_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL* chan); // Added with API 1 + + static void kodi_addon_pvr_transfer_provider_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_PROVIDER* chanProvider); // Added with API 1 + + static void kodi_addon_pvr_transfer_channel_group_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group); // Added with API 1 + + static void kodi_addon_pvr_transfer_channel_group_member_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP_MEMBER* member); // Added with API 1 + + static void kodi_addon_pvr_transfer_epg_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct EPG_TAG* epgentry); // Added with API 1 + + static void kodi_addon_pvr_transfer_recording_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_RECORDING* recording); // Added with API 1 + + static void kodi_addon_pvr_transfer_timer_entry_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_TIMER* timer); // Added with API 1 + + static void kodi_addon_pvr_trigger_channel_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_providers_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_channel_groups_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_epg_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + unsigned int iChannelUid); // Added with API 1 + + static void kodi_addon_pvr_trigger_recording_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_timer_update_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + + directFuncToAddon_addoninstance_pvr_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/screensaver.cpp b/xbmc/addons/interface/api/addon-instance/screensaver.cpp new file mode 100644 index 0000000000000..8ffa8dab3c787 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/screensaver.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "screensaver.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h" + +// Kodi +#include "addons/ScreenSaver.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_screensaver_h::InitDirect( + directFuncToKodi_addoninstance_screensaver_h* ifcToKodi, + directFuncToAddon_addoninstance_screensaver_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_screensaver_get_properties_v1 = kodi_addon_screensaver_get_properties_v1; +} + +bool CHdl_kodi_addoninstance_screensaver_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_screensaver_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_screensaver_get_properties_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties(KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_screensaver_get_properties_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + struct SCREENSAVER_PROPS props; + kodi_addon_screensaver_get_properties_v1(this, hdl, &props); + msgpack::pack(out, msgParent_OUT_kodi_addon_screensaver_get_properties_v1(&props)); + IFC_SCREENSAVER_PROPS::CleanCStructure(&props); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_screensaver_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_screensaver_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_SCREENSAVER_HDL CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_create_v1( + KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_SCREENSAVER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_screensaver_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_screensaver_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_destroy_v1( + KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_screensaver_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_start_v1( + KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_start_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_start_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_start_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_screensaver_start_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_screensaver_start_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_stop_v1( + KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_stop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_stop_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_stop_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_stop_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_screensaver_stop_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_render_v1( + KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_render_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_render_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_render_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_screensaver_render_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_get_properties_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CScreenSaver" with "void GetProperties(struct SCREENSAVER_PROPS* props)" on "addons/ScreenSaver.h". + + ADDON::CScreenSaver* cb = static_cast(hdl); + cb->GetProperties(props); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/screensaver.h b/xbmc/addons/interface/api/addon-instance/screensaver.h new file mode 100644 index 0000000000000..27fa92d2a23ca --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/screensaver.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_screensaver_h; +struct directFuncToKodi_addoninstance_screensaver_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_screensaver_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_screensaver_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_screensaver_h* ifcToKodi, + directFuncToAddon_addoninstance_screensaver_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_SCREENSAVER_HDL kodi_addon_screensaver_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_screensaver_destroy_v1(KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + bool kodi_addon_screensaver_start_v1(KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + void kodi_addon_screensaver_stop_v1(KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + void kodi_addon_screensaver_render_v1(KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_addon_screensaver_get_properties_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props); // Added with API 1 + + + directFuncToAddon_addoninstance_screensaver_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/vfs.cpp b/xbmc/addons/interface/api/addon-instance/vfs.cpp new file mode 100644 index 0000000000000..caf5e7bd83dfe --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/vfs.cpp @@ -0,0 +1,924 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "vfs.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h" + +// Kodi +#include "addons/VFSEntry.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_vfs_h::InitDirect(directFuncToKodi_addoninstance_vfs_h* ifcToKodi, + directFuncToAddon_addoninstance_vfs_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1 = + kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; + ifcToKodi->kodi_addon_vfs_get_dir_cb__set_error_dialog_v1 = + kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; + ifcToKodi->kodi_addon_vfs_get_dir_cb__require_authentication_v1 = + kodi_addon_vfs_get_dir_cb__require_authentication_v1; +} + +bool CHdl_kodi_addoninstance_vfs_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_vfs_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, char** input, bool hidden_input) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + KODI_CTX_CB_HDL ctx_cb_hdl = reinterpret_cast(std::get<1>(t)); + const std::string& heading = std::get<2>(t); + char* input = nullptr; + bool hidden_input = std::get<3>(t); + bool auto_gen_ret = kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + this, hdl, ctx_cb_hdl, heading.c_str(), &input, hidden_input); + msgpack::pack(out, msgParent_OUT_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + auto_gen_ret, input ? input : "")); + if (input) + free(input); + return true; + } + case funcParent_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__set_error_dialog(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, const char* line1, const char* line2, const char* line3) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + KODI_CTX_CB_HDL ctx_cb_hdl = reinterpret_cast(std::get<1>(t)); + const std::string& heading = std::get<2>(t); + const std::string& line1 = std::get<3>(t); + const std::string& line2 = std::get<4>(t); + const std::string& line3 = std::get<5>(t); + kodi_addon_vfs_get_dir_cb__set_error_dialog_v1(this, hdl, ctx_cb_hdl, heading.c_str(), + line1.c_str(), line2.c_str(), line3.c_str()); + return true; + } + case funcParent_kodi_addon_vfs_get_dir_cb__require_authentication_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__require_authentication(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_vfs_get_dir_cb__require_authentication_v1 t = + in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + KODI_CTX_CB_HDL ctx_cb_hdl = reinterpret_cast(std::get<1>(t)); + const std::string& url = std::get<2>(t); + kodi_addon_vfs_get_dir_cb__require_authentication_v1(this, hdl, ctx_cb_hdl, url.c_str()); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_vfs_h::{}: addon called with unknown function id '{}' on " + "group 'addoninstance_vfs_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_VFS_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_VFS_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, funcChild_kodi_addon_vfs_create_v1, + in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_destroy_v1(KODI_ADDON_VFS_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DESTROY_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_vfs_h, funcChild_kodi_addon_vfs_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_vfs_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +KODI_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_v1( + KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) +{ + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_open_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_open_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_open_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_open_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +KODI_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_for_write_v1( + KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, bool overwrite) +{ + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, bool overwrite); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_vfs_file_open_for_write_v1(PtrValue(hdl), url, overwrite)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_open_for_write_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_open_for_write_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_open_for_write_v1(m_ifcToAddon->thisClassHdl, hdl, url, + overwrite); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_close_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_close_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_close_v1(PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_close_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_close_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_close_v1(m_ifcToAddon->thisClassHdl, hdl, context); +} + +ssize_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_read_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t buf_size) +{ + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_READ_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint8_t* buffer, size_t buf_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_read_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_vfs_file_read_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_vfs_file_read_v1(PtrValue(hdl), PtrValue(context), buf_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_read_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_read_v1 t = ident.get().as(); + std::memcpy(buffer, std::get<1>(t).data(), sizeof(uint8_t) * buf_size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_read_v1(m_ifcToAddon->thisClassHdl, hdl, context, buffer, + buf_size); +} + +ssize_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_write_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t buf_size) +{ + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_WRITE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, const uint8_t* buffer, size_t buf_size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_vfs_file_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_write_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_write_v1( + PtrValue(hdl), PtrValue(context), + std::vector(buffer, buffer + buf_size), buf_size)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_write_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_write_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_write_v1(m_ifcToAddon->thisClassHdl, hdl, context, + buffer, buf_size); +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_seek_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_SEEK_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t position, int whence); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_seek_v1(PtrValue(hdl), PtrValue(context), + position, whence)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_seek_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_seek_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_seek_v1(m_ifcToAddon->thisClassHdl, hdl, context, + position, whence); +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_truncate_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_vfs_file_truncate_v1(PtrValue(hdl), PtrValue(context), size)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_truncate_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_truncate_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_truncate_v1(m_ifcToAddon->thisClassHdl, hdl, context, + size); +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_length_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_vfs_file_get_length_v1(PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_get_length_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_get_length_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_get_length_v1(m_ifcToAddon->thisClassHdl, hdl, context); +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_position_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_vfs_file_get_position_v1(PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_get_position_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_get_position_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_get_position_v1(m_ifcToAddon->thisClassHdl, hdl, + context); +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_chunk_size_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_vfs_file_get_chunk_size_v1(PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_get_chunk_size_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_get_chunk_size_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_get_chunk_size_v1(m_ifcToAddon->thisClassHdl, hdl, + context); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_get_seek_possible_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_io_control_get_seek_possible_v1( + PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_io_control_get_seek_possible_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_io_control_get_seek_possible_v1 t = + ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_io_control_get_seek_possible_v1( + m_ifcToAddon->thisClassHdl, hdl, context); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_get_cache_status_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, struct VFS_CACHE_STATUS* status) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, struct VFS_CACHE_STATUS* status); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_io_control_get_cache_status_v1( + PtrValue(hdl), PtrValue(context))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_io_control_get_cache_status_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_io_control_get_cache_status_v1 t = + ident.get().as(); + std::get<1>(t).SetCStructure(status); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_io_control_get_cache_status_v1( + m_ifcToAddon->thisClassHdl, hdl, context, status); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_set_cache_rate_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, unsigned int rate) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, unsigned int rate); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_io_control_set_cache_rate_v1( + PtrValue(hdl), PtrValue(context), rate)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_io_control_set_cache_rate_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_io_control_set_cache_rate_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_io_control_set_cache_rate_v1(m_ifcToAddon->thisClassHdl, + hdl, context, rate); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_set_retry_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, bool retry) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, bool retry); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_file_io_control_set_retry_v1( + PtrValue(hdl), PtrValue(context), retry)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_file_io_control_set_retry_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_file_io_control_set_retry_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_file_io_control_set_retry_v1(m_ifcToAddon->thisClassHdl, hdl, + context, retry); +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_stat_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_STAT_STRUCTURE* buffer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_stat_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_stat_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_stat_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, funcChild_kodi_addon_vfs_stat_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_stat_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(buffer); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_stat_v1(m_ifcToAddon->thisClassHdl, hdl, url, buffer); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_exists_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_exists_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_exists_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, funcChild_kodi_addon_vfs_exists_v1, + in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_exists_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_exists_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_clear_out_idle_v1(KODI_ADDON_VFS_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_clear_out_idle_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_clear_out_idle_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_vfs_clear_out_idle_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_disconnect_all_v1(KODI_ADDON_VFS_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_disconnect_all_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_disconnect_all_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_vfs_disconnect_all_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_delete_it_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_delete_it_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_delete_it_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_delete_it_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_delete_it_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_rename_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + const struct VFS_URL* url2) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, const struct VFS_URL* url2); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_rename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_rename_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_rename_v1(PtrValue(hdl), url, url2)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, funcChild_kodi_addon_vfs_rename_v1, + in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_rename_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_rename_v1(m_ifcToAddon->thisClassHdl, hdl, url, url2); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_exists_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_directory_exists_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_directory_exists_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_directory_exists_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_directory_exists_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_remove_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_directory_remove_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_directory_remove_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_directory_remove_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_directory_remove_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_create_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_directory_create_v1(PtrValue(hdl), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_directory_create_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_directory_create_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_directory_create_v1(m_ifcToAddon->thisClassHdl, hdl, url); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_get_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, KODI_CTX_CB_HDL ctx_cb_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_directory_get_v1(PtrValue(hdl), url, *num_entries, + PtrValue(ctx_cb_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_directory_get_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_directory_get_v1 t = ident.get().as(); + std::vector& ifc_entries = std::get<1>(t); + *num_entries = std::get<2>(t); + *entries = static_cast(malloc(sizeof(VFS_DIR_ENTRY) * ifc_entries.size())); + for (size_t i = 0; i < ifc_entries.size(); ++i) + ifc_entries[i].SetCStructure(&(*entries)[i]); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_directory_get_v1(m_ifcToAddon->thisClassHdl, hdl, url, + entries, num_entries, ctx_cb_hdl); +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_contains_files_v1( + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, char** rootpath); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t, std::string> msgChild_OUT_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_vfs_directory_contains_files_v1(PtrValue(hdl), url, + *num_entries)); + if (!m_process->SendMessage(funcGroup_addoninstance_vfs_h, + funcChild_kodi_addon_vfs_directory_contains_files_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_vfs_directory_contains_files_v1 t = ident.get().as(); + std::vector& ifc_entries = std::get<1>(t); + *num_entries = std::get<2>(t); + *rootpath = strdup(std::get<3>(t).c_str()); + *entries = static_cast(malloc(sizeof(VFS_DIR_ENTRY) * ifc_entries.size())); + for (size_t i = 0; i < ifc_entries.size(); ++i) + ifc_entries[i].SetCStructure(&(*entries)[i]); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_vfs_directory_contains_files_v1( + m_ifcToAddon->thisClassHdl, hdl, url, entries, num_entries, rootpath); +} + +// Callbacks from addon to Kodi + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + char** input, + bool hidden_input) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVFSEntry" with "bool DoGetKeyboardInput(KODI_CTX_CB_HDL context, const char* heading,char** input, bool hidden_input)" on "addons/VFSEntry.h". + + ADDON::CVFSEntry* cb = static_cast(hdl); + return cb->DoGetKeyboardInput(ctx_cb_hdl, heading, input, hidden_input); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_get_dir_cb__set_error_dialog_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + const char* line1, + const char* line2, + const char* line3) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVFSEntry" with "void DoSetErrorDialog(KODI_CTX_CB_HDL ctx, const char* heading,const char* line1, const char* line2,const char* line3)" on "addons/VFSEntry.h". + + ADDON::CVFSEntry* cb = static_cast(hdl); + cb->DoSetErrorDialog(ctx_cb_hdl, heading, line1, line2, line3); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_get_dir_cb__require_authentication_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVFSEntry" with "void DoRequireAuthentication(KODI_CTX_CB_HDL ctx, const char* url)" on "addons/VFSEntry.h". + + ADDON::CVFSEntry* cb = static_cast(hdl); + cb->DoRequireAuthentication(ctx_cb_hdl, url); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_free_v1(struct VFS_DIR_ENTRY* entries, + size_t num_entries) +{ + for (size_t i = 0; i < num_entries; ++i) + { + if (entries[i].properties) + { + for (size_t j = 0; j < entries[i].num_props; ++j) + { + free(entries[i].properties[j].name); + free(entries[i].properties[j].val); + } + free(entries[i].properties); + } + free(entries[i].label); + free(entries[i].title); + free(entries[i].path); + } + free(entries); +} +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/vfs.h b/xbmc/addons/interface/api/addon-instance/vfs.h new file mode 100644 index 0000000000000..2348ece27c201 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/vfs.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_vfs_h; +struct directFuncToKodi_addoninstance_vfs_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_vfs_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_vfs_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_vfs_h* ifcToKodi, + directFuncToAddon_addoninstance_vfs_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + void kodi_addon_vfs_directory_free_v1(struct VFS_DIR_ENTRY* entries, size_t num_entries); + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_VFS_HDL kodi_addon_vfs_create_v1(KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_vfs_destroy_v1(KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_for_write_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + bool overwrite); // Added with API 1 + + bool kodi_addon_vfs_file_close_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + ssize_t kodi_addon_vfs_file_read_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t buf_size); // Added with API 1 + + ssize_t kodi_addon_vfs_file_write_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t buf_size); // Added with API 1 + + int64_t kodi_addon_vfs_file_seek_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence); // Added with API 1 + + int kodi_addon_vfs_file_truncate_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size); // Added with API 1 + + int64_t kodi_addon_vfs_file_get_length_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + int64_t kodi_addon_vfs_file_get_position_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + int kodi_addon_vfs_file_get_chunk_size_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + bool kodi_addon_vfs_file_io_control_get_seek_possible_v1( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); // Added with API 1 + + bool kodi_addon_vfs_file_io_control_get_cache_status_v1( + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + struct VFS_CACHE_STATUS* status); // Added with API 1 + + bool kodi_addon_vfs_file_io_control_set_cache_rate_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + unsigned int rate); // Added with API 1 + + bool kodi_addon_vfs_file_io_control_set_retry_v1(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry); // Added with API 1 + + int kodi_addon_vfs_stat_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); // Added with API 1 + + bool kodi_addon_vfs_exists_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + void kodi_addon_vfs_clear_out_idle_v1(KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + void kodi_addon_vfs_disconnect_all_v1(KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + bool kodi_addon_vfs_delete_it_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_rename_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + const struct VFS_URL* url2); // Added with API 1 + + bool kodi_addon_vfs_directory_exists_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_remove_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_create_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_get_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl); // Added with API 1 + + bool kodi_addon_vfs_directory_contains_files_v1(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + char** input, + bool hidden_input); // Added with API 1 + + static void kodi_addon_vfs_get_dir_cb__set_error_dialog_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + const char* line1, + const char* line2, + const char* line3); // Added with API 1 + + static void kodi_addon_vfs_get_dir_cb__require_authentication_v1( + void* thisClassHdl, + KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* url); // Added with API 1 + + + directFuncToAddon_addoninstance_vfs_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/videocodec.cpp b/xbmc/addons/interface/api/addon-instance/videocodec.cpp new file mode 100644 index 0000000000000..c9c3097d5e48a --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/videocodec.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "videocodec.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_videocodec_h::InitDirect( + directFuncToKodi_addoninstance_videocodec_h* ifcToKodi, + directFuncToAddon_addoninstance_videocodec_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_videocodec_get_frame_buffer_v1 = kodi_addon_videocodec_get_frame_buffer_v1; + ifcToKodi->kodi_addon_videocodec_release_frame_buffer_v1 = + kodi_addon_videocodec_release_frame_buffer_v1; +} + +bool CHdl_kodi_addoninstance_videocodec_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_videocodec_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_videocodec_h::{}: addon called with unknown function id " + "'{}' on group 'addoninstance_videocodec_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_VIDEOCODEC_HDL CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_create_v1( + KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_VIDEOCODEC_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + + return m_ifcToAddon->kodi_addon_videocodec_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_destroy_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_DESTROY_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + + m_ifcToAddon->kodi_addon_videocodec_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_open_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_OPEN_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData); + + return m_ifcToAddon->kodi_addon_videocodec_open_v1(m_ifcToAddon->thisClassHdl, hdl, initData); +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_reconfigure_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1)( KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData); + + return m_ifcToAddon->kodi_addon_videocodec_reconfigure_v1(m_ifcToAddon->thisClassHdl, hdl, + initData); +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_add_data_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, const struct DEMUX_PACKET* packet) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl, const struct DEMUX_PACKET* packet); + + return m_ifcToAddon->kodi_addon_videocodec_add_data_v1(m_ifcToAddon->thisClassHdl, hdl, packet); +} + +enum VIDEOCODEC_RETVAL CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_get_picture_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_PICTURE* picture) +{ + // Original API call: typedef enum VIDEOCODEC_RETVAL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1)( KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_PICTURE* picture); + + return m_ifcToAddon->kodi_addon_videocodec_get_picture_v1(m_ifcToAddon->thisClassHdl, hdl, + picture); +} + +const char* CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_get_name_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl) +{ + // Original API call: typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_GET_NAME_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + + return m_ifcToAddon->kodi_addon_videocodec_get_name_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_reset_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RESET_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + + m_ifcToAddon->kodi_addon_videocodec_reset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// Callbacks from addon to Kodi + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_get_frame_buffer_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "CAddonVideoCodec" with "bool GetFrameBuffer(VIDEOCODEC_PICTURE* picture)" on "cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h". + + CAddonVideoCodec* cb = static_cast(hdl); + return cb->GetFrameBuffer(picture); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_release_frame_buffer_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "CAddonVideoCodec" with "void ReleaseFrameBuffer(KODI_HANDLE videoBufferHandle)" on "cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h". + + CAddonVideoCodec* cb = static_cast(hdl); + cb->ReleaseFrameBuffer(picture); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/videocodec.h b/xbmc/addons/interface/api/addon-instance/videocodec.h new file mode 100644 index 0000000000000..6fdaa78d1706f --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/videocodec.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_videocodec_h; +struct directFuncToKodi_addoninstance_videocodec_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_videocodec_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_videocodec_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_videocodec_h* ifcToKodi, + directFuncToAddon_addoninstance_videocodec_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_VIDEOCODEC_HDL kodi_addon_videocodec_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_videocodec_destroy_v1(KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 + + bool kodi_addon_videocodec_open_v1(KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData); // Added with API 1 + + bool kodi_addon_videocodec_reconfigure_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData); // Added with API 1 + + bool kodi_addon_videocodec_add_data_v1(KODI_ADDON_VIDEOCODEC_HDL hdl, + const struct DEMUX_PACKET* packet); // Added with API 1 + + enum VIDEOCODEC_RETVAL kodi_addon_videocodec_get_picture_v1( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_PICTURE* picture); // Added with API 1 + + const char* kodi_addon_videocodec_get_name_v1(KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 + + void kodi_addon_videocodec_reset_v1(KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_addon_videocodec_get_frame_buffer_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture); // Added with API 1 + + static void kodi_addon_videocodec_release_frame_buffer_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture); // Added with API 1 + + + directFuncToAddon_addoninstance_videocodec_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/visualization.cpp b/xbmc/addons/interface/api/addon-instance/visualization.cpp new file mode 100644 index 0000000000000..4187c08dca2a6 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/visualization.cpp @@ -0,0 +1,640 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "visualization.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h" + +// Kodi +#include "addons/Visualization.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_visualization_h::InitDirect( + directFuncToKodi_addoninstance_visualization_h* ifcToKodi, + directFuncToAddon_addoninstance_visualization_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_visualization_get_properties_v1 = + kodi_addon_visualization_get_properties_v1; + ifcToKodi->kodi_addon_visualization_transfer_preset_v1 = + kodi_addon_visualization_transfer_preset_v1; + ifcToKodi->kodi_addon_visualization_clear_presets_v1 = kodi_addon_visualization_clear_presets_v1; +} + +bool CHdl_kodi_addoninstance_visualization_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_visualization_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_visualization_get_properties_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(KODI_OWN_HDL hdl, struct VIS_PROPS* props) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_visualization_get_properties_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + struct VIS_PROPS props; + kodi_addon_visualization_get_properties_v1(this, hdl, &props); + msgpack::pack(out, msgParent_OUT_kodi_addon_visualization_get_properties_v1(&props)); + IFC_VIS_PROPS::CleanCStructure(&props); + return true; + } + case funcParent_kodi_addon_visualization_transfer_preset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(KODI_OWN_HDL hdl, const char* preset) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_visualization_transfer_preset_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::string& preset = std::get<1>(t); + kodi_addon_visualization_transfer_preset_v1(this, hdl, preset.c_str()); + return true; + } + case funcParent_kodi_addon_visualization_clear_presets_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_visualization_clear_presets_v1 t = in.get().as(); + KODI_OWN_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_visualization_clear_presets_v1(this, hdl); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_visualization_h::{}: addon called with unknown function " + "id '{}' on group 'addoninstance_visualization_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +KODI_ADDON_VISUALIZATION_HDL CHdl_kodi_addoninstance_visualization_h:: + kodi_addon_visualization_create_v1(KODI_OWN_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_VISUALIZATION_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_create_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_destroy_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_start_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, + int channels, + int samples_per_sec, + int bits_per_sample, + const char* song_name) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int channels, int samples_per_sec, int bits_per_sample, const char* song_name); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_start_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_start_v1( + PtrValue(hdl), channels, samples_per_sec, bits_per_sample, song_name)); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_start_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_start_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_start_v1( + m_ifcToAddon->thisClassHdl, hdl, channels, samples_per_sec, bits_per_sample, song_name); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_stop_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_stop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_stop_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_stop_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_stop_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_stop_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_info_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_info_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_get_info_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_get_info_v1, in, out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_get_info_v1 t = ident.get().as(); + std::get<0>(t).SetCStructure(info); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_get_info_v1(m_ifcToAddon->thisClassHdl, hdl, info); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_audio_data_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length, + const float* freq_data, + size_t freq_data_length) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length, const float* freq_data, size_t freq_data_length); + // Tuple in: typedef std::tuple, size_t, std::vector, size_t> msgChild__IN_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgChild__IN_kodi_addon_visualization_audio_data_v1( + PtrValue(hdl), std::vector(audio_data, audio_data + audio_data_length), + audio_data_length, std::vector(freq_data, freq_data + freq_data_length), + freq_data_length)); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_audio_data_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_audio_data_v1( + m_ifcToAddon->thisClassHdl, hdl, audio_data, audio_data_length, freq_data, freq_data_length); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_dirty_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_is_dirty_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_is_dirty_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_is_dirty_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_is_dirty_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_render_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_render_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_render_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_render_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_render_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +unsigned int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_presets_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_get_presets_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_get_presets_v1, in, out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_get_presets_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_get_presets_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_active_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_get_active_preset_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_get_active_preset_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_get_active_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_get_active_preset_v1(m_ifcToAddon->thisClassHdl, + hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_prev_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_prev_preset_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_prev_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_prev_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_prev_preset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_next_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_next_preset_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_next_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_next_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_next_preset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_load_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, int select) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int select); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_load_preset_v1(PtrValue(hdl), select)); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_load_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_load_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_load_preset_v1(m_ifcToAddon->thisClassHdl, hdl, + select); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_random_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_random_preset_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_random_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_random_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_random_preset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_lock_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_lock_preset_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_lock_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_lock_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_lock_preset_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_rate_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_visualization_rate_preset_v1(PtrValue(hdl), plus_minus)); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_rate_preset_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_rate_preset_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_rate_preset_v1(m_ifcToAddon->thisClassHdl, hdl, + plus_minus); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_locked_v1( + KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_is_locked_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_is_locked_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_is_locked_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_is_locked_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_update_albumart_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgChild__IN_kodi_addon_visualization_update_albumart_v1(PtrValue(hdl), albumart)); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_update_albumart_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_update_albumart_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_update_albumart_v1(m_ifcToAddon->thisClassHdl, hdl, + albumart); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_update_track_v1( + KODI_ADDON_VISUALIZATION_HDL hdl, const struct VIS_TRACK* track) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const struct VIS_TRACK* track); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_update_track_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_track_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_update_track_v1(PtrValue(hdl), track)); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_update_track_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_update_track_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_update_track_v1(m_ifcToAddon->thisClassHdl, hdl, + track); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_properties_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIS_PROPS* props) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVisualization" with "void get_properties(struct VIS_PROPS* props)" on "addons/Visualization.h". + + ADDON::CVisualization* cb = static_cast(hdl); + cb->get_properties(props); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_transfer_preset_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, const char* preset) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVisualization" with "void transfer_preset(const char* preset)" on "addons/Visualization.h". + + ADDON::CVisualization* cb = static_cast(hdl); + cb->transfer_preset(preset); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_clear_presets_v1( + void* thisClassHdl, KODI_OWN_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "ADDON::CVisualization" with "void clear_presets()" on "addons/Visualization.h". + + ADDON::CVisualization* cb = static_cast(hdl); + cb->clear_presets(); + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon-instance/visualization.h b/xbmc/addons/interface/api/addon-instance/visualization.h new file mode 100644 index 0000000000000..a48d7e12710ae --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/visualization.h @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_visualization_h; +struct directFuncToKodi_addoninstance_visualization_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_visualization_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_visualization_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_visualization_h* ifcToKodi, + directFuncToAddon_addoninstance_visualization_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + KODI_ADDON_VISUALIZATION_HDL kodi_addon_visualization_create_v1( + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_visualization_destroy_v1(KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_start_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + int channels, + int samples_per_sec, + int bits_per_sample, + const char* song_name); // Added with API 1 + + void kodi_addon_visualization_stop_v1(KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + void kodi_addon_visualization_get_info_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + struct VIS_INFO* info); // Added with API 1 + + void kodi_addon_visualization_audio_data_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length, + const float* freq_data, + size_t freq_data_length); // Added with API 1 + + bool kodi_addon_visualization_is_dirty_v1(KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + void kodi_addon_visualization_render_v1(KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + unsigned int kodi_addon_visualization_get_presets_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + int kodi_addon_visualization_get_active_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_prev_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_next_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_load_preset_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + int select); // Added with API 1 + + bool kodi_addon_visualization_random_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_lock_preset_v1( + KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_rate_preset_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + bool plus_minus); // Added with API 1 + + bool kodi_addon_visualization_is_locked_v1(KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_update_albumart_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + const char* albumart); // Added with API 1 + + bool kodi_addon_visualization_update_track_v1(KODI_ADDON_VISUALIZATION_HDL hdl, + const struct VIS_TRACK* track); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_addon_visualization_get_properties_v1( + void* thisClassHdl, KODI_OWN_HDL hdl, struct VIS_PROPS* props); // Added with API 1 + + static void kodi_addon_visualization_transfer_preset_v1(void* thisClassHdl, + KODI_OWN_HDL hdl, + const char* preset); // Added with API 1 + + static void kodi_addon_visualization_clear_presets_v1(void* thisClassHdl, + KODI_OWN_HDL hdl); // Added with API 1 + + + directFuncToAddon_addoninstance_visualization_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon_base.cpp b/xbmc/addons/interface/api/addon_base.cpp new file mode 100644 index 0000000000000..f34137619cff6 --- /dev/null +++ b/xbmc/addons/interface/api/addon_base.cpp @@ -0,0 +1,1001 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "addon_base.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon_base.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "GUIUserMessages.h" +#include "addons/AddonManager.h" +#include "addons/gui/GUIDialogAddonSettings.h" +#include "addons/settings/AddonSettings.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +#include "filesystem/SpecialProtocol.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "utils/URIUtils.h" +#include "utils/log.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +namespace +{ + +bool UpdateSettingInActiveDialog(const std::shared_ptr& addon, + const std::string& id, + const std::string& value) +{ + if (!CServiceBroker::GetGUI()->GetWindowManager().IsWindowActive(WINDOW_DIALOG_ADDON_SETTINGS)) + return false; + + CGUIDialogAddonSettings* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_ADDON_SETTINGS); + if (dialog->GetCurrentAddonID() != addon->ID()) + return false; + + CGUIMessage message(GUI_MSG_SETTING_UPDATED, 0, 0); + std::vector params; + params.emplace_back(id); + params.push_back(value); + message.SetStringParams(params); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(message, + WINDOW_DIALOG_ADDON_SETTINGS); + + return true; +} + +} /* namespace */ + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addon_base_h::InitDirect(directFuncToKodi_addon_base_h* ifcToKodi, + directFuncToAddon_addon_base_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + // Unused "kodi_check_main_shared", done only in addon lib + // Unused "kodi_init", done only in addon lib + // Unused "kodi_deinit", done only in addon lib + // Unused "kodi_process", done only in addon lib + ifcToKodi->kodi_log_v1 = kodi_log_v1; + ifcToKodi->kodi_addon_get_lib_path_v1 = kodi_addon_get_lib_path_v1; + ifcToKodi->kodi_addon_get_share_path_v1 = kodi_addon_get_share_path_v1; + ifcToKodi->kodi_addon_get_user_path_v1 = kodi_addon_get_user_path_v1; + ifcToKodi->kodi_addon_get_temp_path_v1 = kodi_addon_get_temp_path_v1; + ifcToKodi->kodi_addon_get_info_v1 = kodi_addon_get_info_v1; + ifcToKodi->kodi_addon_open_settings_dialog_v1 = kodi_addon_open_settings_dialog_v1; + ifcToKodi->kodi_addon_is_setting_using_default_v1 = kodi_addon_is_setting_using_default_v1; + ifcToKodi->kodi_addon_get_setting_bool_v1 = kodi_addon_get_setting_bool_v1; + ifcToKodi->kodi_addon_get_setting_int_v1 = kodi_addon_get_setting_int_v1; + ifcToKodi->kodi_addon_get_setting_float_v1 = kodi_addon_get_setting_float_v1; + ifcToKodi->kodi_addon_get_setting_string_v1 = kodi_addon_get_setting_string_v1; + ifcToKodi->kodi_addon_set_setting_bool_v1 = kodi_addon_set_setting_bool_v1; + ifcToKodi->kodi_addon_set_setting_int_v1 = kodi_addon_set_setting_int_v1; + ifcToKodi->kodi_addon_set_setting_float_v1 = kodi_addon_set_setting_float_v1; + ifcToKodi->kodi_addon_set_setting_string_v1 = kodi_addon_set_setting_string_v1; +} + +bool CHdl_kodi_addon_base_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addon_base_h) + return false; + + switch (func) + { + case funcParent_kodi_log_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_log_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_log_v1; /* Autogenerated */ + msgParent__IN_kodi_log_v1 t = in.get().as(); + enum ADDON_LOG loglevel = std::get<0>(t); + const std::string& format = std::get<1>(t); + + kodi_log_v1(this, loglevel, format.c_str()); + return true; + } + case funcParent_kodi_addon_get_lib_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_lib_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_lib_path_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_addon_get_lib_path_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_addon_get_lib_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_get_share_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_share_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_share_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_share_path_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_addon_get_share_path_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_addon_get_share_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_get_user_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_user_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_user_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_user_path_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_addon_get_user_path_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_addon_get_user_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_get_temp_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_temp_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_temp_path_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_addon_get_temp_path_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_addon_get_temp_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_get_info_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_info_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_get_info_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + char* auto_gen_ret = kodi_addon_get_info_v1(this, id.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_addon_get_info_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_open_settings_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ + bool auto_gen_ret = kodi_addon_open_settings_dialog_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_addon_open_settings_dialog_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_is_setting_using_default_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_is_setting_using_default_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + bool auto_gen_ret = kodi_addon_is_setting_using_default_v1(this, id.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_addon_is_setting_using_default_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_get_setting_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_get_setting_bool_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + bool value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_get_setting_bool_v1(this, id.c_str(), &value); + msgpack::pack(out, msgParent_OUT_kodi_addon_get_setting_bool_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_get_setting_int_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_int_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_get_setting_int_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + int value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_get_setting_int_v1(this, id.c_str(), &value); + msgpack::pack(out, msgParent_OUT_kodi_addon_get_setting_int_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_get_setting_float_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_float_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_get_setting_float_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + float value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_get_setting_float_v1(this, id.c_str(), &value); + msgpack::pack(out, msgParent_OUT_kodi_addon_get_setting_float_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_get_setting_string_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_string_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_get_setting_string_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + char* value = nullptr; + bool auto_gen_ret = kodi_addon_get_setting_string_v1(this, id.c_str(), &value); + msgpack::pack( + out, msgParent_OUT_kodi_addon_get_setting_string_v1(auto_gen_ret, value ? value : "")); + if (value) + free(value); + return true; + } + case funcParent_kodi_addon_set_setting_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_set_setting_bool_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + bool value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_set_setting_bool_v1(this, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_set_setting_bool_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_set_setting_int_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_int_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_set_setting_int_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + int value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_set_setting_int_v1(this, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_set_setting_int_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_set_setting_float_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_float_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_set_setting_float_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + float value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_set_setting_float_v1(this, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_set_setting_float_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_set_setting_string_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_string_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_set_setting_string_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + const std::string& value = std::get<1>(t); + bool auto_gen_ret = kodi_addon_set_setting_string_v1(this, id.c_str(), value.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_addon_set_setting_string_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addon_base_h::{}: addon called with unknown function id '{}' on group " + "'addon_base_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +/*---AUTO_GEN_PARSE---*/ +ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_v1(KODI_ADDON_HDL* hdl) +{ + // This function is set by "OVERRIDE;USE_HAND_MAKE" and must be complete set here and other places by hand!!! +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_create_v1(0)); + if (!m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_create_v1, in, out)) + return ADDON_STATUS_UNKNOWN; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_create_v1 t = ident.get().as(); + *hdl = reinterpret_cast(std::get<1>(t)); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_create_v1(m_ifcToAddon->thisClassHdl, hdl); +} +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addon_base_h::kodi_addon_destroy_v1(KODI_ADDON_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +/*---AUTO_GEN_PARSE---*/ +ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_instance_v1(KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_OWN_HDL instance, + KODI_HANDLE* addonInstance, + KODI_HANDLE parent) +{ + // This function is set by "OVERRIDE;USE_HAND_MAKE" and must be complete set here and other places by hand!!! +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_create_instance_v1(uint64_t(hdl), instanceType, + instanceID, uint64_t(instance), + uint64_t(parent))); + if (!m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_create_instance_v1, in, + out)) + return ADDON_STATUS_UNKNOWN; + + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_create_instance_v1 t = ident.get().as(); + *addonInstance = KODI_HANDLE(std::get<1>(t)); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_create_instance_v1(m_ifcToAddon->thisClassHdl, hdl, instanceType, + instanceID.c_str(), instance, addonInstance, + parent); +} +/*---AUTO_GEN_PARSE---*/ + +/*---AUTO_GEN_PARSE---*/ +void CHdl_kodi_addon_base_h::kodi_addon_destroy_instance_v1(const KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + KODI_HANDLE instance) +{ + // This function is set by "OVERRIDE;USE_HAND_MAKE" and must be complete set here and other places by hand!!! + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_destroy_instance_v1(PtrValue(hdl), instanceType, + PtrValue(instance))); + m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_destroy_instance_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_destroy_instance_v1(m_ifcToAddon->thisClassHdl, hdl, instanceType, + instance); +} +/*---AUTO_GEN_PARSE---*/ + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_string_v1( + const KODI_ADDON_HDL hdl, const char* name, const char* value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const char* name, const char* value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_string_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_setting_change_string_v1(PtrValue(hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_setting_change_string_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_setting_change_string_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_setting_change_string_v1(m_ifcToAddon->thisClassHdl, hdl, name, + value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_boolean_v1( + const KODI_ADDON_HDL hdl, const char* name, bool value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const char* name, bool value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_setting_change_boolean_v1(PtrValue(hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_setting_change_boolean_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_setting_change_boolean_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_setting_change_boolean_v1(m_ifcToAddon->thisClassHdl, hdl, name, + value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_integer_v1( + const KODI_ADDON_HDL hdl, const char* name, int value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const char* name, int value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_integer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_integer_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_setting_change_integer_v1(PtrValue(hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_setting_change_integer_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_setting_change_integer_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_setting_change_integer_v1(m_ifcToAddon->thisClassHdl, hdl, name, + value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_float_v1( + const KODI_ADDON_HDL hdl, const char* name, float value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const char* name, float value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_float_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_setting_change_float_v1(PtrValue(hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_setting_change_float_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_setting_change_float_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_setting_change_float_v1(m_ifcToAddon->thisClassHdl, hdl, name, + value); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addon_base_h::kodi_log_v1(void* thisClassHdl, + enum ADDON_LOG loglevel, + const char* format, + ...) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + int kodiLogLevel = LOGNONE; + switch (loglevel) + { + case ADDON_LOG_DEBUG: + kodiLogLevel = LOGDEBUG; + break; + case ADDON_LOG_INFO: + kodiLogLevel = LOGINFO; + break; + case ADDON_LOG_WARNING: + kodiLogLevel = LOGWARNING; + break; + case ADDON_LOG_ERROR: + kodiLogLevel = LOGERROR; + break; + case ADDON_LOG_FATAL: + kodiLogLevel = LOGFATAL; + break; + default: + kodiLogLevel = LOGDEBUG; + break; + } + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + CLog::Log(kodiLogLevel, "AddOnLog: {}: {}", addon->ID(), format); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_get_lib_path_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + return strdup(CSpecialProtocol::TranslatePath(addon->Path()).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_get_share_path_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + return strdup(CSpecialProtocol::TranslatePath(addon->Path()).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_get_user_path_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + return strdup(CSpecialProtocol::TranslatePath(addon->Profile()).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_get_temp_path_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + std::string tempPath = + URIUtils::AddFileToFolder(CServiceBroker::GetAddonMgr().GetTempAddonBasePath(), addon->ID()); + tempPath += "-temp"; + XFILE::CDirectory::Create(tempPath); + + return strdup(CSpecialProtocol::TranslatePath(tempPath).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_get_info_v1(void* thisClassHdl, const char* id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + std::string str; + if (StringUtils::CompareNoCase(id, "author") == 0) + str = addon->Author(); + else if (StringUtils::CompareNoCase(id, "changelog") == 0) + str = addon->ChangeLog(); + else if (StringUtils::CompareNoCase(id, "description") == 0) + str = addon->Description(); + else if (StringUtils::CompareNoCase(id, "disclaimer") == 0) + str = addon->Disclaimer(); + else if (StringUtils::CompareNoCase(id, "fanart") == 0) + str = addon->FanArt(); + else if (StringUtils::CompareNoCase(id, "icon") == 0) + str = addon->Icon(); + else if (StringUtils::CompareNoCase(id, "id") == 0) + str = addon->ID(); + else if (StringUtils::CompareNoCase(id, "name") == 0) + str = addon->Name(); + else if (StringUtils::CompareNoCase(id, "path") == 0) + str = addon->Path(); + else if (StringUtils::CompareNoCase(id, "profile") == 0) + str = addon->Profile(); + else if (StringUtils::CompareNoCase(id, "summary") == 0) + str = addon->Summary(); + else if (StringUtils::CompareNoCase(id, "type") == 0) + str = ADDON::CAddonInfo::TranslateType(addon->Type()); + else if (StringUtils::CompareNoCase(id, "version") == 0) + str = addon->Version().asString(); + else + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - add-on '{}' requests invalid id '{}'", __func__, + addon->ID(), id); + return nullptr; + } + + return strdup(str.c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_open_settings_dialog_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + return CGUIDialogAddonSettings::ShowForAddon(addon); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_is_setting_using_default_v1(void* thisClassHdl, + const char* id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + if (!addon->HasSettings()) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - couldn't get settings for add-on '{}'", __func__, + addon->ID()); + return false; + } + + auto setting = addon->GetSettings()->GetSetting(id); + if (setting == nullptr) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - can't find setting '{}' in '{}'", __func__, id, + addon->ID()); + return false; + } + + return setting->IsDefault(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_get_setting_bool_v1(void* thisClassHdl, + const char* id, + bool* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (!addon->HasSettings()) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - couldn't get settings for add-on '{}'", __func__, + addon->ID()); + return false; + } + + auto setting = addon->GetSettings()->GetSetting(id); + if (setting == nullptr) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - can't find setting '{}' in '{}'", __func__, id, + addon->ID()); + return false; + } + + if (setting->GetType() != SettingType::Boolean) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - setting '{}' is not a boolean in '{}'", __func__, + id, addon->ID()); + return false; + } + + *value = std::static_pointer_cast(setting)->GetValue(); + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_get_setting_int_v1(void* thisClassHdl, + const char* id, + int* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (!addon->HasSettings()) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - couldn't get settings for add-on '{}'", __func__, + addon->ID()); + return false; + } + + auto setting = addon->GetSettings()->GetSetting(id); + if (setting == nullptr) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - can't find setting '{}' in '{}'", __func__, id, + addon->ID()); + return false; + } + + if (setting->GetType() != SettingType::Integer && setting->GetType() != SettingType::Number) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - setting '{}' is not a integer in '{}'", __func__, + id, addon->ID()); + return false; + } + + if (setting->GetType() == SettingType::Integer) + *value = std::static_pointer_cast(setting)->GetValue(); + else + *value = static_cast(std::static_pointer_cast(setting)->GetValue()); + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_get_setting_float_v1(void* thisClassHdl, + const char* id, + float* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (!addon->HasSettings()) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - couldn't get settings for add-on '{}'", __func__, + addon->ID()); + return false; + } + + auto setting = addon->GetSettings()->GetSetting(id); + if (setting == nullptr) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - can't find setting '{}' in '{}'", __func__, id, + addon->ID()); + return false; + } + + if (setting->GetType() != SettingType::Number) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - setting '{}' is not a number in '{}'", __func__, + id, addon->ID()); + return false; + } + + *value = static_cast(std::static_pointer_cast(setting)->GetValue()); + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_get_setting_string_v1(void* thisClassHdl, + const char* id, + char** value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (!addon->HasSettings()) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - couldn't get settings for add-on '{}'", __func__, + addon->ID()); + return false; + } + + auto setting = addon->GetSettings()->GetSetting(id); + if (setting == nullptr) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - can't find setting '{}' in '{}'", __func__, id, + addon->ID()); + return false; + } + + if (setting->GetType() != SettingType::String) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - setting '{}' is not a string in '{}'", __func__, + id, addon->ID()); + return false; + } + + *value = strdup(std::static_pointer_cast(setting)->GetValue().c_str()); + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_set_setting_bool_v1(void* thisClassHdl, + const char* id, + bool value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (UpdateSettingInActiveDialog(addon, id, StringUtils::Format("%d", value))) + return true; + + if (!addon->UpdateSettingBool(id, value)) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - invalid setting type", __func__); + return false; + } + + addon->SaveSettings(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_set_setting_int_v1(void* thisClassHdl, + const char* id, + int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (UpdateSettingInActiveDialog(addon, id, StringUtils::Format("%i", value))) + return true; + + if (!addon->UpdateSettingInt(id, value)) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - invalid setting type", __func__); + return false; + } + + addon->SaveSettings(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_set_setting_float_v1(void* thisClassHdl, + const char* id, + float value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (UpdateSettingInActiveDialog(addon, id, StringUtils::Format("%f", value))) + return true; + + if (!addon->UpdateSettingNumber(id, value)) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - invalid setting type", __func__); + return false; + } + + addon->SaveSettings(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_set_setting_string_v1(void* thisClassHdl, + const char* id, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::shared_ptr addon = thisClass->m_interface.m_process->GetAddon(); + + if (UpdateSettingInActiveDialog(addon, id, value)) + return true; + + if (!addon->UpdateSettingString(id, value)) + { + CLog::Log(LOGERROR, "CHdlIn_addon_base_h::{} - invalid setting type", __func__); + return false; + } + + addon->SaveSettings(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/addon_base.h b/xbmc/addons/interface/api/addon_base.h new file mode 100644 index 0000000000000..346245bd5a4e3 --- /dev/null +++ b/xbmc/addons/interface/api/addon_base.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/addon_base.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addon_base_h; +struct directFuncToKodi_addon_base_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addon_base_h : public IMsgHdl +{ +public: + CHdl_kodi_addon_base_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addon_base_h* ifcToKodi, + directFuncToAddon_addon_base_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + /*---AUTO_GEN_PARSE---*/ + enum ADDON_STATUS kodi_addon_create_v1(KODI_ADDON_HDL* hdl); + /*---AUTO_GEN_PARSE---*/ + + void kodi_addon_destroy_v1(KODI_ADDON_HDL hdl); // Added with API 1 + + /*---AUTO_GEN_PARSE---*/ + enum ADDON_STATUS kodi_addon_create_instance_v1(KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_OWN_HDL instance, + KODI_HANDLE* addonInstance, + KODI_HANDLE parent); + /*---AUTO_GEN_PARSE---*/ + + /*---AUTO_GEN_PARSE---*/ + void kodi_addon_destroy_instance_v1(const KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + KODI_HANDLE instance); + /*---AUTO_GEN_PARSE---*/ + + enum ADDON_STATUS kodi_addon_setting_change_string_v1(const KODI_ADDON_HDL hdl, + const char* name, + const char* value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_setting_change_boolean_v1(const KODI_ADDON_HDL hdl, + const char* name, + bool value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_setting_change_integer_v1(const KODI_ADDON_HDL hdl, + const char* name, + int value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_setting_change_float_v1(const KODI_ADDON_HDL hdl, + const char* name, + float value); // Added with API 1 + + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_log_v1(void* thisClassHdl, + enum ADDON_LOG loglevel, + const char* format, + ...); // Added with API 1 + + static char* kodi_addon_get_lib_path_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_addon_get_share_path_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_addon_get_user_path_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_addon_get_temp_path_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_addon_get_info_v1(void* thisClassHdl, const char* id); // Added with API 1 + + static bool kodi_addon_open_settings_dialog_v1(void* thisClassHdl); // Added with API 1 + + static bool kodi_addon_is_setting_using_default_v1(void* thisClassHdl, + const char* id); // Added with API 1 + + static bool kodi_addon_get_setting_bool_v1(void* thisClassHdl, + const char* id, + bool* value); // Added with API 1 + + static bool kodi_addon_get_setting_int_v1(void* thisClassHdl, + const char* id, + int* value); // Added with API 1 + + static bool kodi_addon_get_setting_float_v1(void* thisClassHdl, + const char* id, + float* value); // Added with API 1 + + static bool kodi_addon_get_setting_string_v1(void* thisClassHdl, + const char* id, + char** value); // Added with API 1 + + static bool kodi_addon_set_setting_bool_v1(void* thisClassHdl, + const char* id, + bool value); // Added with API 1 + + static bool kodi_addon_set_setting_int_v1(void* thisClassHdl, + const char* id, + int value); // Added with API 1 + + static bool kodi_addon_set_setting_float_v1(void* thisClassHdl, + const char* id, + float value); // Added with API 1 + + static bool kodi_addon_set_setting_string_v1(void* thisClassHdl, + const char* id, + const char* value); // Added with API 1 + + + directFuncToAddon_addon_base_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/audio_engine.cpp b/xbmc/addons/interface/api/audio_engine.cpp new file mode 100644 index 0000000000000..2c2f621bf3e29 --- /dev/null +++ b/xbmc/addons/interface/api/audio_engine.cpp @@ -0,0 +1,1187 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audio_engine.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/audio_engine.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "ServiceBroker.h" +#include "cores/AudioEngine/Interfaces/AE.h" +#include "cores/AudioEngine/Interfaces/AEStream.h" +#include "cores/AudioEngine/Utils/AEStreamData.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +AEChannel TranslateAEChannelToKodi(AudioEngineChannel channel) +{ + switch (channel) + { + case AUDIOENGINE_CH_RAW: + return AE_CH_RAW; + case AUDIOENGINE_CH_FL: + return AE_CH_FL; + case AUDIOENGINE_CH_FR: + return AE_CH_FR; + case AUDIOENGINE_CH_FC: + return AE_CH_FC; + case AUDIOENGINE_CH_LFE: + return AE_CH_LFE; + case AUDIOENGINE_CH_BL: + return AE_CH_BL; + case AUDIOENGINE_CH_BR: + return AE_CH_BR; + case AUDIOENGINE_CH_FLOC: + return AE_CH_FLOC; + case AUDIOENGINE_CH_FROC: + return AE_CH_FROC; + case AUDIOENGINE_CH_BC: + return AE_CH_BC; + case AUDIOENGINE_CH_SL: + return AE_CH_SL; + case AUDIOENGINE_CH_SR: + return AE_CH_SR; + case AUDIOENGINE_CH_TFL: + return AE_CH_TFL; + case AUDIOENGINE_CH_TFR: + return AE_CH_TFR; + case AUDIOENGINE_CH_TFC: + return AE_CH_TFC; + case AUDIOENGINE_CH_TC: + return AE_CH_TC; + case AUDIOENGINE_CH_TBL: + return AE_CH_TBL; + case AUDIOENGINE_CH_TBR: + return AE_CH_TBR; + case AUDIOENGINE_CH_TBC: + return AE_CH_TBC; + case AUDIOENGINE_CH_BLOC: + return AE_CH_BLOC; + case AUDIOENGINE_CH_BROC: + return AE_CH_BROC; + case AUDIOENGINE_CH_MAX: + return AE_CH_MAX; + case AUDIOENGINE_CH_NULL: + default: + return AE_CH_NULL; + } +} + +AudioEngineChannel TranslateAEChannelToAddon(AEChannel channel) +{ + switch (channel) + { + case AE_CH_RAW: + return AUDIOENGINE_CH_RAW; + case AE_CH_FL: + return AUDIOENGINE_CH_FL; + case AE_CH_FR: + return AUDIOENGINE_CH_FR; + case AE_CH_FC: + return AUDIOENGINE_CH_FC; + case AE_CH_LFE: + return AUDIOENGINE_CH_LFE; + case AE_CH_BL: + return AUDIOENGINE_CH_BL; + case AE_CH_BR: + return AUDIOENGINE_CH_BR; + case AE_CH_FLOC: + return AUDIOENGINE_CH_FLOC; + case AE_CH_FROC: + return AUDIOENGINE_CH_FROC; + case AE_CH_BC: + return AUDIOENGINE_CH_BC; + case AE_CH_SL: + return AUDIOENGINE_CH_SL; + case AE_CH_SR: + return AUDIOENGINE_CH_SR; + case AE_CH_TFL: + return AUDIOENGINE_CH_TFL; + case AE_CH_TFR: + return AUDIOENGINE_CH_TFR; + case AE_CH_TFC: + return AUDIOENGINE_CH_TFC; + case AE_CH_TC: + return AUDIOENGINE_CH_TC; + case AE_CH_TBL: + return AUDIOENGINE_CH_TBL; + case AE_CH_TBR: + return AUDIOENGINE_CH_TBR; + case AE_CH_TBC: + return AUDIOENGINE_CH_TBC; + case AE_CH_BLOC: + return AUDIOENGINE_CH_BLOC; + case AE_CH_BROC: + return AUDIOENGINE_CH_BROC; + case AE_CH_MAX: + return AUDIOENGINE_CH_MAX; + case AE_CH_NULL: + default: + return AUDIOENGINE_CH_NULL; + } +} + +AEDataFormat TranslateAEFormatToKodi(AudioEngineDataFormat format) +{ + switch (format) + { + case AUDIOENGINE_FMT_U8: + return AE_FMT_U8; + case AUDIOENGINE_FMT_S16BE: + return AE_FMT_S16BE; + case AUDIOENGINE_FMT_S16LE: + return AE_FMT_S16LE; + case AUDIOENGINE_FMT_S16NE: + return AE_FMT_S16NE; + case AUDIOENGINE_FMT_S32BE: + return AE_FMT_S32BE; + case AUDIOENGINE_FMT_S32LE: + return AE_FMT_S32LE; + case AUDIOENGINE_FMT_S32NE: + return AE_FMT_S32NE; + case AUDIOENGINE_FMT_S24BE4: + return AE_FMT_S24BE4; + case AUDIOENGINE_FMT_S24LE4: + return AE_FMT_S24LE4; + case AUDIOENGINE_FMT_S24NE4: + return AE_FMT_S24NE4; + case AUDIOENGINE_FMT_S24NE4MSB: + return AE_FMT_S24NE4MSB; + case AUDIOENGINE_FMT_S24BE3: + return AE_FMT_S24BE3; + case AUDIOENGINE_FMT_S24LE3: + return AE_FMT_S24LE3; + case AUDIOENGINE_FMT_S24NE3: + return AE_FMT_S24NE3; + case AUDIOENGINE_FMT_DOUBLE: + return AE_FMT_DOUBLE; + case AUDIOENGINE_FMT_FLOAT: + return AE_FMT_FLOAT; + case AUDIOENGINE_FMT_RAW: + return AE_FMT_RAW; + case AUDIOENGINE_FMT_U8P: + return AE_FMT_U8P; + case AUDIOENGINE_FMT_S16NEP: + return AE_FMT_S16NEP; + case AUDIOENGINE_FMT_S32NEP: + return AE_FMT_S32NEP; + case AUDIOENGINE_FMT_S24NE4P: + return AE_FMT_S24NE4P; + case AUDIOENGINE_FMT_S24NE4MSBP: + return AE_FMT_S24NE4MSBP; + case AUDIOENGINE_FMT_S24NE3P: + return AE_FMT_S24NE3P; + case AUDIOENGINE_FMT_DOUBLEP: + return AE_FMT_DOUBLEP; + case AUDIOENGINE_FMT_FLOATP: + return AE_FMT_FLOATP; + case AUDIOENGINE_FMT_MAX: + return AE_FMT_MAX; + case AUDIOENGINE_FMT_INVALID: + default: + return AE_FMT_INVALID; + } +} + +AudioEngineDataFormat TranslateAEFormatToAddon(AEDataFormat format) +{ + switch (format) + { + case AE_FMT_U8: + return AUDIOENGINE_FMT_U8; + case AE_FMT_S16BE: + return AUDIOENGINE_FMT_S16BE; + case AE_FMT_S16LE: + return AUDIOENGINE_FMT_S16LE; + case AE_FMT_S16NE: + return AUDIOENGINE_FMT_S16NE; + case AE_FMT_S32BE: + return AUDIOENGINE_FMT_S32BE; + case AE_FMT_S32LE: + return AUDIOENGINE_FMT_S32LE; + case AE_FMT_S32NE: + return AUDIOENGINE_FMT_S32NE; + case AE_FMT_S24BE4: + return AUDIOENGINE_FMT_S24BE4; + case AE_FMT_S24LE4: + return AUDIOENGINE_FMT_S24LE4; + case AE_FMT_S24NE4: + return AUDIOENGINE_FMT_S24NE4; + case AE_FMT_S24NE4MSB: + return AUDIOENGINE_FMT_S24NE4MSB; + case AE_FMT_S24BE3: + return AUDIOENGINE_FMT_S24BE3; + case AE_FMT_S24LE3: + return AUDIOENGINE_FMT_S24LE3; + case AE_FMT_S24NE3: + return AUDIOENGINE_FMT_S24NE3; + case AE_FMT_DOUBLE: + return AUDIOENGINE_FMT_DOUBLE; + case AE_FMT_FLOAT: + return AUDIOENGINE_FMT_FLOAT; + case AE_FMT_RAW: + return AUDIOENGINE_FMT_RAW; + case AE_FMT_U8P: + return AUDIOENGINE_FMT_U8P; + case AE_FMT_S16NEP: + return AUDIOENGINE_FMT_S16NEP; + case AE_FMT_S32NEP: + return AUDIOENGINE_FMT_S32NEP; + case AE_FMT_S24NE4P: + return AUDIOENGINE_FMT_S24NE4P; + case AE_FMT_S24NE4MSBP: + return AUDIOENGINE_FMT_S24NE4MSBP; + case AE_FMT_S24NE3P: + return AUDIOENGINE_FMT_S24NE3P; + case AE_FMT_DOUBLEP: + return AUDIOENGINE_FMT_DOUBLEP; + case AE_FMT_FLOATP: + return AUDIOENGINE_FMT_FLOATP; + case AE_FMT_MAX: + return AUDIOENGINE_FMT_MAX; + case AE_FMT_INVALID: + default: + return AUDIOENGINE_FMT_INVALID; + } +} + +class CAddonAudioStream : public IInterfaceClassHdl +{ +public: + CAddonAudioStream() : IInterfaceClassHdl(InterfaceKodiClass::IAEStream) {} + + IAEStream* m_stream; +}; + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_audio_engine_h::InitDirect(directFuncToKodi_audio_engine_h* ifcToKodi, + directFuncToAddon_audio_engine_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_audioengine_get_current_sink_format_v1 = + kodi_audioengine_get_current_sink_format_v1; + ifcToKodi->kodi_audioengine_is_planar_format_v1 = kodi_audioengine_is_planar_format_v1; + ifcToKodi->kodi_audioengine_stream_make_v1 = kodi_audioengine_stream_make_v1; + ifcToKodi->kodi_audioengine_stream_free_v1 = kodi_audioengine_stream_free_v1; + ifcToKodi->kodi_audioengine_stream_get_space_v1 = kodi_audioengine_stream_get_space_v1; + ifcToKodi->kodi_audioengine_stream_add_data_v1 = kodi_audioengine_stream_add_data_v1; + ifcToKodi->kodi_audioengine_stream_get_delay_v1 = kodi_audioengine_stream_get_delay_v1; + ifcToKodi->kodi_audioengine_stream_is_buffering_v1 = kodi_audioengine_stream_is_buffering_v1; + ifcToKodi->kodi_audioengine_stream_get_cache_time_v1 = kodi_audioengine_stream_get_cache_time_v1; + ifcToKodi->kodi_audioengine_stream_get_cache_total_v1 = + kodi_audioengine_stream_get_cache_total_v1; + ifcToKodi->kodi_audioengine_stream_pause_v1 = kodi_audioengine_stream_pause_v1; + ifcToKodi->kodi_audioengine_stream_resume_v1 = kodi_audioengine_stream_resume_v1; + ifcToKodi->kodi_audioengine_stream_drain_v1 = kodi_audioengine_stream_drain_v1; + ifcToKodi->kodi_audioengine_stream_is_draining_v1 = kodi_audioengine_stream_is_draining_v1; + ifcToKodi->kodi_audioengine_stream_is_drained_v1 = kodi_audioengine_stream_is_drained_v1; + ifcToKodi->kodi_audioengine_stream_flush_v1 = kodi_audioengine_stream_flush_v1; + ifcToKodi->kodi_audioengine_stream_get_volume_v1 = kodi_audioengine_stream_get_volume_v1; + ifcToKodi->kodi_audioengine_stream_set_volume_v1 = kodi_audioengine_stream_set_volume_v1; + ifcToKodi->kodi_audioengine_stream_get_amplification_v1 = + kodi_audioengine_stream_get_amplification_v1; + ifcToKodi->kodi_audioengine_stream_set_amplification_v1 = + kodi_audioengine_stream_set_amplification_v1; + ifcToKodi->kodi_audioengine_stream_get_frame_size_v1 = kodi_audioengine_stream_get_frame_size_v1; + ifcToKodi->kodi_audioengine_stream_get_channel_count_v1 = + kodi_audioengine_stream_get_channel_count_v1; + ifcToKodi->kodi_audioengine_stream_get_sample_rate_v1 = + kodi_audioengine_stream_get_sample_rate_v1; + ifcToKodi->kodi_audioengine_stream_get_data_format_v1 = + kodi_audioengine_stream_get_data_format_v1; + ifcToKodi->kodi_audioengine_stream_get_resample_ratio_v1 = + kodi_audioengine_stream_get_resample_ratio_v1; + ifcToKodi->kodi_audioengine_stream_set_resample_ratio_v1 = + kodi_audioengine_stream_set_resample_ratio_v1; +} + +bool CHdl_kodi_audio_engine_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_audio_engine_h) + return false; + + switch (func) + { + case funcParent_kodi_audioengine_get_current_sink_format_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_get_current_sink_format(struct AUDIO_ENGINE_FMT* fmt) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_get_current_sink_format_v1 t = in.get().as(); + struct AUDIO_ENGINE_FMT fmt; + bool auto_gen_ret = kodi_audioengine_get_current_sink_format_v1(this, &fmt); + msgpack::pack(out, + msgParent_OUT_kodi_audioengine_get_current_sink_format_v1(auto_gen_ret, &fmt)); + return true; + } + case funcParent_kodi_audioengine_is_planar_format_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_is_planar_format(enum AudioEngineDataFormat format) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_is_planar_format_v1 t = in.get().as(); + enum AudioEngineDataFormat format = std::get<0>(t); + bool auto_gen_ret = kodi_audioengine_is_planar_format_v1(this, format); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_is_planar_format_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_make_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_AE_HDL kodi_audioengine_stream_make(const struct AUDIO_ENGINE_FMT* fmt, unsigned int options) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_make_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_make_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_make_v1 t = in.get().as(); + AUDIO_ENGINE_FMT fmt; + std::get<0>(t).SetCStructure(&fmt); + unsigned int options = std::get<1>(t); + KODI_AE_HDL auto_gen_ret = kodi_audioengine_stream_make_v1(this, &fmt, options); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_make_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_audioengine_stream_free_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_free(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_free_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_free_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_free_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_audioengine_stream_free_v1(this, hdl); + return true; + } + case funcParent_kodi_audioengine_stream_get_space_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_space(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_space_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_audioengine_stream_get_space_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_space_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_add_data_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_add_data(KODI_AE_HDL hdl, uint8_t* const* data, size_t planes, size_t data_size, unsigned int offset, unsigned int frames, unsigned int frame_size, double pts, bool hasDownmix, double centerMixLevel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple>, size_t, size_t, unsigned int, unsigned int, unsigned int, double, bool, double> msgParent__IN_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_add_data_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + std::vector>& ifc_data = std::get<1>(t); + size_t planes = std::get<2>(t); + size_t data_size = std::get<3>(t); + unsigned int offset = std::get<4>(t); + unsigned int frames = std::get<5>(t); + unsigned int frame_size = std::get<6>(t); + double pts = std::get<7>(t); + bool hasDownmix = std::get<8>(t); + double centerMixLevel = std::get<9>(t); + uint8_t** data = new uint8_t*[ifc_data.size()]; + for (size_t i = 0; i < ifc_data.size(); ++i) + data[i] = ifc_data[i].data(); + unsigned int auto_gen_ret = + kodi_audioengine_stream_add_data_v1(this, hdl, data, planes, data_size, offset, frames, + frame_size, pts, hasDownmix, centerMixLevel); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_add_data_v1(auto_gen_ret)); + delete[] data; + return true; + } + case funcParent_kodi_audioengine_stream_get_delay_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_delay(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_delay_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double auto_gen_ret = kodi_audioengine_stream_get_delay_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_delay_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_is_buffering_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_buffering(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_is_buffering_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_audioengine_stream_is_buffering_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_is_buffering_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_cache_time_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_time(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_cache_time_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double auto_gen_ret = kodi_audioengine_stream_get_cache_time_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_cache_time_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_cache_total_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_total(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_cache_total_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double auto_gen_ret = kodi_audioengine_stream_get_cache_total_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_cache_total_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_pause_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_pause(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_pause_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_pause_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_pause_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_audioengine_stream_pause_v1(this, hdl); + return true; + } + case funcParent_kodi_audioengine_stream_resume_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_resume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_resume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_resume_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_resume_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_audioengine_stream_resume_v1(this, hdl); + return true; + } + case funcParent_kodi_audioengine_stream_drain_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_drain(KODI_AE_HDL hdl, bool wait) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_drain_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_drain_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_drain_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool wait = std::get<1>(t); + kodi_audioengine_stream_drain_v1(this, hdl, wait); + return true; + } + case funcParent_kodi_audioengine_stream_is_draining_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_draining(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_is_draining_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_audioengine_stream_is_draining_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_is_draining_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_is_drained_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_drained(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_is_drained_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_audioengine_stream_is_drained_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_is_drained_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_flush_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_flush(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_flush_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_flush_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_flush_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_audioengine_stream_flush_v1(this, hdl); + return true; + } + case funcParent_kodi_audioengine_stream_get_volume_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_volume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_volume_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_audioengine_stream_get_volume_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_volume_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_set_volume_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_volume(KODI_AE_HDL hdl, float volume) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_set_volume_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + float volume = std::get<1>(t); + kodi_audioengine_stream_set_volume_v1(this, hdl, volume); + return true; + } + case funcParent_kodi_audioengine_stream_get_amplification_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_amplification(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_amplification_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_audioengine_stream_get_amplification_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_amplification_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_set_amplification_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_amplification(KODI_AE_HDL hdl, float amplify) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_set_amplification_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + float amplify = std::get<1>(t); + kodi_audioengine_stream_set_amplification_v1(this, hdl, amplify); + return true; + } + case funcParent_kodi_audioengine_stream_get_frame_size_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_frame_size(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_frame_size_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_audioengine_stream_get_frame_size_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_frame_size_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_channel_count_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_channel_count(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_channel_count_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_audioengine_stream_get_channel_count_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_channel_count_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_sample_rate_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_sample_rate(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_sample_rate_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_audioengine_stream_get_sample_rate_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_sample_rate_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_data_format_v1: + { + // Original API call: ATTR_DLL_EXPORT enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format( KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_data_format_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum AudioEngineDataFormat auto_gen_ret = + kodi_audioengine_stream_get_data_format_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_data_format_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_get_resample_ratio_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_resample_ratio(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_get_resample_ratio_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double auto_gen_ret = kodi_audioengine_stream_get_resample_ratio_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_audioengine_stream_get_resample_ratio_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_audioengine_stream_set_resample_ratio_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_resample_ratio(KODI_AE_HDL hdl, double ratio) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ + msgParent__IN_kodi_audioengine_stream_set_resample_ratio_v1 t = in.get().as(); + KODI_AE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double ratio = std::get<1>(t); + kodi_audioengine_stream_set_resample_ratio_v1(this, hdl, ratio); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_audio_engine_h::{}: addon called with unknown function id '{}' on group " + "'audio_engine_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_audio_engine_h::kodi_audioengine_get_current_sink_format_v1( + void* thisClassHdl, struct AUDIO_ENGINE_FMT* fmt) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + IAE* engine = CServiceBroker::GetActiveAE(); + if (!engine) + return false; + + AEAudioFormat sinkFormat; + if (!engine->GetCurrentSinkFormat(sinkFormat)) + { + CLog::Log(LOGERROR, "CHdl_kodi_audio_engine_h::{} - failed to get current sink format from AE!", + __func__); + return false; + } + + fmt->data_format = TranslateAEFormatToAddon(sinkFormat.m_dataFormat); + fmt->sample_rate = sinkFormat.m_sampleRate; + fmt->frames = sinkFormat.m_frames; + fmt->frame_size = sinkFormat.m_frameSize; + fmt->channel_count = sinkFormat.m_channelLayout.Count(); + for (unsigned int ch = 0; ch < fmt->channel_count && ch < AUDIOENGINE_CH_MAX; ++ch) + { + fmt->channels[ch] = TranslateAEChannelToAddon(sinkFormat.m_channelLayout[ch]); + } + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_audio_engine_h::kodi_audioengine_is_planar_format_v1( + void* thisClassHdl, enum AudioEngineDataFormat format) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + if (format >= AUDIOENGINE_FMT_U8P || format <= AUDIOENGINE_FMT_FLOATP) + return true; + return false; + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_AE_HDL CHdl_kodi_audio_engine_h::kodi_audioengine_stream_make_v1( + void* thisClassHdl, const struct AUDIO_ENGINE_FMT* fmt, unsigned int options) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + IAE* engine = CServiceBroker::GetActiveAE(); + if (!engine) + return nullptr; + + CAEChannelInfo layout; + for (unsigned int ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) + { + if (fmt->channels[ch] == AUDIOENGINE_CH_NULL) + break; + layout += TranslateAEChannelToKodi(fmt->channels[ch]); + } + + AEAudioFormat format; + format.m_channelLayout = layout; + format.m_dataFormat = TranslateAEFormatToKodi(fmt->data_format); + format.m_sampleRate = fmt->sample_rate; + + /* Translate addon options to kodi's options */ + int kodiOption = 0; + if (options & AUDIO_STREAM_FORCE_RESAMPLE) + kodiOption |= AESTREAM_FORCE_RESAMPLE; + if (options & AUDIO_STREAM_PAUSED) + kodiOption |= AESTREAM_PAUSED; + if (options & AUDIO_STREAM_AUTOSTART) + kodiOption |= AESTREAM_AUTOSTART; + + CAddonAudioStream* stream = new CAddonAudioStream(); + stream->m_stream = engine->MakeStream(format, kodiOption); + if (!stream->m_stream) + { + delete stream; + return nullptr; + } + + thisClass->m_process->RegisterClass(stream); + return KODI_AE_HDL(stream); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_free_v1(void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream) + return; + + thisClass->m_process->UnregisterClass(stream); + IAE* engine = CServiceBroker::GetActiveAE(); + if (engine) + engine->FreeStream(stream->m_stream, true); + delete stream; + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_space_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0; + + return stream->m_stream->GetSpace(); + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_audio_engine_h::kodi_audioengine_stream_add_data_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + uint8_t* const* data, + size_t planes, + size_t data_size, + unsigned int offset, + unsigned int frames, + unsigned int frame_size, + double pts, + bool hasDownmix, + double centerMixLevel) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream || !CServiceBroker::GetActiveAE()) + return 0; + + IAEStream::ExtData extData; + extData.pts = pts; + extData.hasDownmix = hasDownmix; + extData.centerMixLevel = centerMixLevel; + + return stream->m_stream->AddData(data, offset, frames, &extData); + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_delay_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0; + + return stream->m_stream->GetDelay(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_audio_engine_h::kodi_audioengine_stream_is_buffering_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return false; + + return stream->m_stream->IsBuffering(); + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_cache_time_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0; + + return stream->m_stream->GetCacheTime(); + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_cache_total_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0; + + return stream->m_stream->GetCacheTotal(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_pause_v1(void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->Pause(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_resume_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->Resume(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_drain_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + bool wait) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->Drain(wait); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_audio_engine_h::kodi_audioengine_stream_is_draining_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return false; + + return stream->m_stream->IsDraining(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_audio_engine_h::kodi_audioengine_stream_is_drained_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return false; + + return stream->m_stream->IsDrained(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_flush_v1(void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->Flush(); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_volume_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0f; + + return stream->m_stream->GetVolume(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_set_volume_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + float volume) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->SetVolume(volume); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_amplification_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0f; + + return stream->m_stream->GetAmplification(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_set_amplification_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + float amplify) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->SetAmplification(amplify); + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_frame_size_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0; + + return stream->m_stream->GetFrameSize(); + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_channel_count_v1( + void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0; + + return stream->m_stream->GetChannelCount(); + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_sample_rate_v1( + void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0; + + return stream->m_stream->GetSampleRate(); + + /*---AUTO_GEN_PARSE---*/ +} + +enum AudioEngineDataFormat CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_data_format_v1( + void* thisClassHdl, KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return AUDIOENGINE_FMT_INVALID; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return AudioEngineDataFormat::AUDIOENGINE_FMT_INVALID; + + return TranslateAEFormatToAddon(stream->m_stream->GetDataFormat()); + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_audio_engine_h::kodi_audioengine_stream_get_resample_ratio_v1(void* thisClassHdl, + KODI_AE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return 0.0; + + return stream->m_stream->GetResampleRatio(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_audio_engine_h::kodi_audioengine_stream_set_resample_ratio_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + double ratio) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CAddonAudioStream* stream = static_cast(hdl); + if (!stream || !stream->m_stream) + return; + + stream->m_stream->SetResampleRatio(ratio); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/audio_engine.h b/xbmc/addons/interface/api/audio_engine.h new file mode 100644 index 0000000000000..39b9912aff23a --- /dev/null +++ b/xbmc/addons/interface/api/audio_engine.h @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/audio_engine.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "cores/AudioEngine/Utils/AEChannelData.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_audio_engine_h; +struct directFuncToKodi_audio_engine_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +AEChannel TranslateAEChannelToKodi(AudioEngineChannel channel); +AudioEngineChannel TranslateAEChannelToAddon(AEChannel channel); +AEDataFormat TranslateAEFormatToKodi(AudioEngineDataFormat format); +AudioEngineDataFormat TranslateAEFormatToAddon(AEDataFormat format); +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_audio_engine_h : public IMsgHdl +{ +public: + CHdl_kodi_audio_engine_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_audio_engine_h* ifcToKodi, + directFuncToAddon_audio_engine_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_audioengine_get_current_sink_format_v1( + void* thisClassHdl, struct AUDIO_ENGINE_FMT* fmt); // Added with API 1 + + static bool kodi_audioengine_is_planar_format_v1( + void* thisClassHdl, enum AudioEngineDataFormat format); // Added with API 1 + + static KODI_AE_HDL kodi_audioengine_stream_make_v1(void* thisClassHdl, + const struct AUDIO_ENGINE_FMT* fmt, + unsigned int options); // Added with API 1 + + static void kodi_audioengine_stream_free_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static unsigned int kodi_audioengine_stream_get_space_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static unsigned int kodi_audioengine_stream_add_data_v1( + void* thisClassHdl, + KODI_AE_HDL hdl, + uint8_t* const* data, + size_t planes, + size_t data_size, + unsigned int offset, + unsigned int frames, + unsigned int frame_size, + double pts, + bool hasDownmix, + double centerMixLevel); // Added with API 1 + + static double kodi_audioengine_stream_get_delay_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static bool kodi_audioengine_stream_is_buffering_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static double kodi_audioengine_stream_get_cache_time_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static double kodi_audioengine_stream_get_cache_total_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_pause_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_resume_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_drain_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + bool wait); // Added with API 1 + + static bool kodi_audioengine_stream_is_draining_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static bool kodi_audioengine_stream_is_drained_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_flush_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static float kodi_audioengine_stream_get_volume_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_set_volume_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + float volume); // Added with API 1 + + static float kodi_audioengine_stream_get_amplification_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_set_amplification_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + float amplify); // Added with API 1 + + static unsigned int kodi_audioengine_stream_get_frame_size_v1( + void* thisClassHdl, KODI_AE_HDL hdl); // Added with API 1 + + static unsigned int kodi_audioengine_stream_get_channel_count_v1( + void* thisClassHdl, KODI_AE_HDL hdl); // Added with API 1 + + static unsigned int kodi_audioengine_stream_get_sample_rate_v1( + void* thisClassHdl, KODI_AE_HDL hdl); // Added with API 1 + + static enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format_v1( + void* thisClassHdl, KODI_AE_HDL hdl); // Added with API 1 + + static double kodi_audioengine_stream_get_resample_ratio_v1(void* thisClassHdl, + KODI_AE_HDL hdl); // Added with API 1 + + static void kodi_audioengine_stream_set_resample_ratio_v1(void* thisClassHdl, + KODI_AE_HDL hdl, + double ratio); // Added with API 1 + + + directFuncToAddon_audio_engine_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/filesystem.cpp b/xbmc/addons/interface/api/filesystem.cpp new file mode 100644 index 0000000000000..0faff96b4074a --- /dev/null +++ b/xbmc/addons/interface/api/filesystem.cpp @@ -0,0 +1,2001 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "filesystem.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/filesystem.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "FileItem.h" +#include "Util.h" +#include "addons/interface/RunningProcess.h" +#include "filesystem/CurlFile.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +#include "filesystem/SpecialProtocol.h" +#include "platform/Filesystem.h" +#include "utils/Crc32.h" +#include "utils/HttpHeader.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" + +#if defined(TARGET_WINDOWS) +#ifndef S_IFLNK +#define S_IFLNK 0120000 +#endif +#ifndef S_ISBLK +#define S_ISBLK(m) (0) +#endif +#ifndef S_ISSOCK +#define S_ISSOCK(m) (0) +#endif +#ifndef S_ISLNK +#define S_ISLNK(m) ((m & S_IFLNK) != 0) +#endif +#ifndef S_ISCHR +#define S_ISCHR(m) ((m & _S_IFCHR) != 0) +#endif +#ifndef S_ISDIR +#define S_ISDIR(m) ((m & _S_IFDIR) != 0) +#endif +#ifndef S_ISFIFO +#define S_ISFIFO(m) ((m & _S_IFIFO) != 0) +#endif +#ifndef S_ISREG +#define S_ISREG(m) ((m & _S_IFREG) != 0) +#endif +#endif + +using namespace XFILE; + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +namespace +{ + +unsigned int TranslateFileReadBitsToKodi(unsigned int addonFlags) +{ + unsigned int kodiFlags = 0; + + if (addonFlags & ADDON_READ_TRUNCATED) + kodiFlags |= READ_TRUNCATED; + if (addonFlags & ADDON_READ_CHUNKED) + kodiFlags |= READ_CHUNKED; + if (addonFlags & ADDON_READ_CACHED) + kodiFlags |= READ_CACHED; + if (addonFlags & ADDON_READ_NO_CACHE) + kodiFlags |= READ_NO_CACHE; + if (addonFlags & ADDON_READ_BITRATE) + kodiFlags |= READ_BITRATE; + if (addonFlags & ADDON_READ_MULTI_STREAM) + kodiFlags |= READ_MULTI_STREAM; + if (addonFlags & ADDON_READ_AUDIO_VIDEO) + kodiFlags |= READ_AUDIO_VIDEO; + if (addonFlags & ADDON_READ_AFTER_WRITE) + kodiFlags |= READ_AFTER_WRITE; + if (addonFlags & READ_REOPEN) + kodiFlags |= READ_REOPEN; + + return kodiFlags; +} + +XFILE::FileProperty TranslateFilePropertyToKodi(FilePropertyTypes type) +{ + XFILE::FileProperty internalType; + switch (type) + { + case ADDON_FILE_PROPERTY_RESPONSE_PROTOCOL: + internalType = XFILE::FILE_PROPERTY_RESPONSE_PROTOCOL; + break; + case ADDON_FILE_PROPERTY_RESPONSE_HEADER: + internalType = XFILE::FILE_PROPERTY_RESPONSE_HEADER; + break; + case ADDON_FILE_PROPERTY_CONTENT_TYPE: + internalType = XFILE::FILE_PROPERTY_CONTENT_TYPE; + break; + case ADDON_FILE_PROPERTY_CONTENT_CHARSET: + internalType = XFILE::FILE_PROPERTY_CONTENT_CHARSET; + break; + case ADDON_FILE_PROPERTY_MIME_TYPE: + internalType = XFILE::FILE_PROPERTY_MIME_TYPE; + break; + case ADDON_FILE_PROPERTY_EFFECTIVE_URL: + internalType = XFILE::FILE_PROPERTY_EFFECTIVE_URL; + break; + default: + CLog::Log(LOGERROR, "{} - invalid type", __func__); + internalType = XFILE::FILE_PROPERTY_RESPONSE_PROTOCOL; + break; + }; + + return internalType; +} + +static void CFileItemListToVFSDirEntries(VFS_DIR_ENTRY* entries, const CFileItemList& items) +{ + for (unsigned int i = 0; i < static_cast(items.Size()); ++i) + { + entries[i].label = strdup(items[i]->GetLabel().c_str()); + entries[i].path = strdup(items[i]->GetPath().c_str()); + entries[i].size = items[i]->m_dwSize; + entries[i].folder = items[i]->m_bIsFolder; + items[i]->m_dateTime.GetAsTime(entries[i].date_time); + } +} + +/* + * CHttpHeader to use on addons, used with IInterfaceClassHdl to know opened parts + * in case of addon crash or wrong exits. + */ +class CAddonHttpHeader : public IInterfaceClassHdl, public CHttpHeader +{ +public: + CAddonHttpHeader() : IInterfaceClassHdl(InterfaceKodiClass::CHttpHeader) {} +}; + +/* + * CFile to use on addons, used with IInterfaceClassHdl to know opened parts + * in case of addon crash or wrong exits. + */ +class CAddonFile : public IInterfaceClassHdl, public CFile +{ +public: + CAddonFile() : IInterfaceClassHdl(InterfaceKodiClass::CFile) {} +}; + +} /* namespace */ + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_filesystem_h::InitDirect(directFuncToKodi_filesystem_h* ifcToKodi, + directFuncToAddon_filesystem_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_vfs_can_open_directory_v1 = kodi_vfs_can_open_directory_v1; + ifcToKodi->kodi_vfs_create_directory_v1 = kodi_vfs_create_directory_v1; + ifcToKodi->kodi_vfs_remove_directory_v1 = kodi_vfs_remove_directory_v1; + ifcToKodi->kodi_vfs_remove_directory_recursive_v1 = kodi_vfs_remove_directory_recursive_v1; + ifcToKodi->kodi_vfs_directory_exists_v1 = kodi_vfs_directory_exists_v1; + ifcToKodi->kodi_vfs_get_directory_v1 = kodi_vfs_get_directory_v1; + // Unused "kodi_vfs_free_directory", done only in addon lib + ifcToKodi->kodi_vfs_file_exists_v1 = kodi_vfs_file_exists_v1; + ifcToKodi->kodi_vfs_stat_file_v1 = kodi_vfs_stat_file_v1; + ifcToKodi->kodi_vfs_delete_file_v1 = kodi_vfs_delete_file_v1; + ifcToKodi->kodi_vfs_rename_file_v1 = kodi_vfs_rename_file_v1; + ifcToKodi->kodi_vfs_copy_file_v1 = kodi_vfs_copy_file_v1; + ifcToKodi->kodi_vfs_get_file_md5_v1 = kodi_vfs_get_file_md5_v1; + ifcToKodi->kodi_vfs_get_cache_thumb_name_v1 = kodi_vfs_get_cache_thumb_name_v1; + ifcToKodi->kodi_vfs_make_legal_filename_v1 = kodi_vfs_make_legal_filename_v1; + ifcToKodi->kodi_vfs_make_legal_path_v1 = kodi_vfs_make_legal_path_v1; + ifcToKodi->kodi_vfs_translate_special_protocol_v1 = kodi_vfs_translate_special_protocol_v1; + ifcToKodi->kodi_vfs_is_internet_stream_v1 = kodi_vfs_is_internet_stream_v1; + ifcToKodi->kodi_vfs_is_on_lan_v1 = kodi_vfs_is_on_lan_v1; + ifcToKodi->kodi_vfs_is_remote_v1 = kodi_vfs_is_remote_v1; + ifcToKodi->kodi_vfs_is_local_v1 = kodi_vfs_is_local_v1; + ifcToKodi->kodi_vfs_is_url_v1 = kodi_vfs_is_url_v1; + ifcToKodi->kodi_vfs_get_mime_type_v1 = kodi_vfs_get_mime_type_v1; + ifcToKodi->kodi_vfs_get_content_type_v1 = kodi_vfs_get_content_type_v1; + ifcToKodi->kodi_vfs_get_cookies_v1 = kodi_vfs_get_cookies_v1; + ifcToKodi->kodi_vfs_get_disk_space_v1 = kodi_vfs_get_disk_space_v1; + ifcToKodi->kodi_vfs_http_header_open_v1 = kodi_vfs_http_header_open_v1; + ifcToKodi->kodi_vfs_http_header_close_v1 = kodi_vfs_http_header_close_v1; + ifcToKodi->kodi_vfs_http_header_get_value_v1 = kodi_vfs_http_header_get_value_v1; + ifcToKodi->kodi_vfs_http_header_get_values_v1 = kodi_vfs_http_header_get_values_v1; + ifcToKodi->kodi_vfs_http_header_get_header_v1 = kodi_vfs_http_header_get_header_v1; + ifcToKodi->kodi_vfs_http_header_get_mime_type_v1 = kodi_vfs_http_header_get_mime_type_v1; + ifcToKodi->kodi_vfs_http_header_get_charset_v1 = kodi_vfs_http_header_get_charset_v1; + ifcToKodi->kodi_vfs_http_header_get_proto_line_v1 = kodi_vfs_http_header_get_proto_line_v1; + ifcToKodi->kodi_vfs_file_open_v1 = kodi_vfs_file_open_v1; + ifcToKodi->kodi_vfs_file_open_for_write_v1 = kodi_vfs_file_open_for_write_v1; + ifcToKodi->kodi_vfs_file_curl_create_v1 = kodi_vfs_file_curl_create_v1; + ifcToKodi->kodi_vfs_file_curl_add_option_v1 = kodi_vfs_file_curl_add_option_v1; + ifcToKodi->kodi_vfs_file_curl_open_v1 = kodi_vfs_file_curl_open_v1; + ifcToKodi->kodi_vfs_file_close_v1 = kodi_vfs_file_close_v1; + ifcToKodi->kodi_vfs_file_read_v1 = kodi_vfs_file_read_v1; + ifcToKodi->kodi_vfs_file_read_line_v1 = kodi_vfs_file_read_line_v1; + ifcToKodi->kodi_vfs_file_write_v1 = kodi_vfs_file_write_v1; + ifcToKodi->kodi_vfs_file_flush_v1 = kodi_vfs_file_flush_v1; + ifcToKodi->kodi_vfs_file_seek_v1 = kodi_vfs_file_seek_v1; + ifcToKodi->kodi_vfs_file_truncate_v1 = kodi_vfs_file_truncate_v1; + ifcToKodi->kodi_vfs_file_get_position_v1 = kodi_vfs_file_get_position_v1; + ifcToKodi->kodi_vfs_file_get_length_v1 = kodi_vfs_file_get_length_v1; + ifcToKodi->kodi_vfs_file_at_end_v1 = kodi_vfs_file_at_end_v1; + ifcToKodi->kodi_vfs_file_get_download_speed_v1 = kodi_vfs_file_get_download_speed_v1; + ifcToKodi->kodi_vfs_file_get_chunk_size_v1 = kodi_vfs_file_get_chunk_size_v1; + ifcToKodi->kodi_vfs_file_io_ctl_get_seek_possible_v1 = kodi_vfs_file_io_ctl_get_seek_possible_v1; + ifcToKodi->kodi_vfs_file_io_ctl_get_cache_status_v1 = kodi_vfs_file_io_ctl_get_cache_status_v1; + ifcToKodi->kodi_vfs_file_io_ctl_set_cache_rate_v1 = kodi_vfs_file_io_ctl_set_cache_rate_v1; + ifcToKodi->kodi_vfs_file_io_ctl_set_retry_v1 = kodi_vfs_file_io_ctl_set_retry_v1; + ifcToKodi->kodi_vfs_file_get_property_value_v1 = kodi_vfs_file_get_property_value_v1; + ifcToKodi->kodi_vfs_file_get_property_values_v1 = kodi_vfs_file_get_property_values_v1; +} + +bool CHdl_kodi_filesystem_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_filesystem_h) + return false; + + switch (func) + { + case funcParent_kodi_vfs_can_open_directory_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_can_open_directory(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_can_open_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_can_open_directory_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_can_open_directory_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_can_open_directory_v1(this, url.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_can_open_directory_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_create_directory_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_create_directory(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_create_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_create_directory_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_create_directory_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_create_directory_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_create_directory_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_remove_directory_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_remove_directory_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_remove_directory_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_remove_directory_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_remove_directory_recursive_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory_recursive(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_remove_directory_recursive_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_remove_directory_recursive_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_remove_directory_recursive_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_directory_exists_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_directory_exists(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_directory_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_directory_exists_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_directory_exists_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_directory_exists_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_directory_exists_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_get_directory_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_directory(const char* path, const char* mask, struct VFS_DIR_ENTRY** items, size_t* num_items) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_get_directory_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_directory_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + const std::string& mask = std::get<1>(t); + struct VFS_DIR_ENTRY* items = nullptr; + size_t num_items = std::get<2>(t); + bool auto_gen_ret = + kodi_vfs_get_directory_v1(this, path.c_str(), mask.c_str(), &items, &num_items); + std::vector ifc_items; + if (items) + { + ifc_items.reserve(num_items); + for (size_t i = 0; i < num_items; ++i) + { + ifc_items.emplace_back(&items[i]); + ifc_items[i].CleanCStructure(&items[i]); + } + free(items); + } + msgpack::pack(out, + msgParent_OUT_kodi_vfs_get_directory_v1(auto_gen_ret, ifc_items, num_items)); + return true; + } + case funcParent_kodi_vfs_file_exists_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_exists(const char* filename, bool useCache) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_exists_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_exists_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + bool useCache = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_file_exists_v1(this, filename.c_str(), useCache); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_exists_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_stat_file_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_stat_file(const char* filename, struct VFS_STAT_STRUCTURE* buffer) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_stat_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_stat_file_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_stat_file_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + struct VFS_STAT_STRUCTURE buffer; + bool auto_gen_ret = kodi_vfs_stat_file_v1(this, filename.c_str(), &buffer); + msgpack::pack(out, msgParent_OUT_kodi_vfs_stat_file_v1(auto_gen_ret, &buffer)); + return true; + } + case funcParent_kodi_vfs_delete_file_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_delete_file(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_delete_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_delete_file_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_delete_file_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_delete_file_v1(this, filename.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_delete_file_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_rename_file_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_rename_file(const char* filename, const char* newFileName) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_rename_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_rename_file_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_rename_file_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + const std::string& newFileName = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_rename_file_v1(this, filename.c_str(), newFileName.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_rename_file_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_copy_file_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_copy_file(const char* filename, const char* dest) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_copy_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_copy_file_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_copy_file_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + const std::string& dest = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_copy_file_v1(this, filename.c_str(), dest.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_copy_file_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_get_file_md5_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_file_md5(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_file_md5_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_file_md5_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_file_md5_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + char* auto_gen_ret = kodi_vfs_get_file_md5_v1(this, filename.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_get_file_md5_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_get_cache_thumb_name_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_cache_thumb_name(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_cache_thumb_name_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + char* auto_gen_ret = kodi_vfs_get_cache_thumb_name_v1(this, filename.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_get_cache_thumb_name_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_make_legal_filename_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_filename(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_make_legal_filename_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + char* auto_gen_ret = kodi_vfs_make_legal_filename_v1(this, filename.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_make_legal_filename_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_make_legal_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_path(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_make_legal_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_path_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_make_legal_path_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + char* auto_gen_ret = kodi_vfs_make_legal_path_v1(this, path.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_vfs_make_legal_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_translate_special_protocol_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_translate_special_protocol(const char* strSource) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_translate_special_protocol_v1 t = in.get().as(); + const std::string& strSource = std::get<0>(t); + char* auto_gen_ret = kodi_vfs_translate_special_protocol_v1(this, strSource.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_translate_special_protocol_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_is_internet_stream_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_internet_stream(const char* path, bool strictCheck) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_is_internet_stream_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool strictCheck = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_is_internet_stream_v1(this, path.c_str(), strictCheck); + msgpack::pack(out, msgParent_OUT_kodi_vfs_is_internet_stream_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_is_on_lan_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_on_lan(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_on_lan_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_is_on_lan_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_is_on_lan_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_is_on_lan_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_is_remote_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_remote(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_remote_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_remote_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_is_remote_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_is_remote_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_is_remote_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_is_local_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_local(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_local_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_local_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_is_local_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_is_local_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_is_local_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_is_url_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_url(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_url_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_url_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_is_url_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + bool auto_gen_ret = kodi_vfs_is_url_v1(this, path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_is_url_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_get_mime_type_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_mime_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_mime_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_mime_type_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_mime_type_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + char* content = nullptr; + const std::string& useragent = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_get_mime_type_v1(this, url.c_str(), &content, useragent.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_vfs_get_mime_type_v1(auto_gen_ret, content ? content : "")); + if (content) + free(content); + return true; + } + case funcParent_kodi_vfs_get_content_type_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_content_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_content_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_content_type_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_content_type_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + char* content = nullptr; + const std::string& useragent = std::get<1>(t); + bool auto_gen_ret = + kodi_vfs_get_content_type_v1(this, url.c_str(), &content, useragent.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_get_content_type_v1(auto_gen_ret, content ? content : "")); + if (content) + free(content); + return true; + } + case funcParent_kodi_vfs_get_cookies_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_cookies(const char* url, char** cookies) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_cookies_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_cookies_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_cookies_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + char* cookies = nullptr; + bool auto_gen_ret = kodi_vfs_get_cookies_v1(this, url.c_str(), &cookies); + msgpack::pack(out, + msgParent_OUT_kodi_vfs_get_cookies_v1(auto_gen_ret, cookies ? cookies : "")); + if (cookies) + free(cookies); + return true; + } + case funcParent_kodi_vfs_get_disk_space_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_disk_space(const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_disk_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_disk_space_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_get_disk_space_v1 t = in.get().as(); + const std::string& path = std::get<0>(t); + uint64_t capacity = std::get<1>(t); + uint64_t free = std::get<2>(t); + uint64_t available = std::get<3>(t); + bool auto_gen_ret = + kodi_vfs_get_disk_space_v1(this, path.c_str(), &capacity, &free, &available); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_get_disk_space_v1(auto_gen_ret, capacity, free, available)); + return true; + } + case funcParent_kodi_vfs_http_header_open_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_open_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_open_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + KODI_HTTP_HEADER_HDL auto_gen_ret = kodi_vfs_http_header_open_v1(this, url.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_http_header_open_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_vfs_http_header_close_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_http_header_close(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_close_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_close_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_vfs_http_header_close_v1(this, hdl); + return true; + } + case funcParent_kodi_vfs_http_header_get_value_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_value(KODI_HTTP_HEADER_HDL hdl, const char* param) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_value_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::string& param = std::get<1>(t); + char* auto_gen_ret = kodi_vfs_http_header_get_value_v1(this, hdl, param.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_http_header_get_value_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_http_header_get_values_v1: + { + // Original API call: ATTR_DLL_EXPORT char** kodi_vfs_http_header_get_values(KODI_HTTP_HEADER_HDL hdl, const char* param, size_t* length) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_values_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::string& param = std::get<1>(t); + size_t length = std::get<2>(t); + char** auto_gen_ret = kodi_vfs_http_header_get_values_v1(this, hdl, param.c_str(), &length); + std::vector auto_gen_ret_cpp; + if (auto_gen_ret) + { + auto_gen_ret_cpp.reserve(length); + for (size_t i = 0; i < length; ++i) + { + if (auto_gen_ret[i]) + { + auto_gen_ret_cpp.emplace_back(auto_gen_ret[i]); + free(auto_gen_ret[i]); + } + } + free(auto_gen_ret); + } + msgpack::pack(out, + msgParent_OUT_kodi_vfs_http_header_get_values_v1(auto_gen_ret_cpp, length)); + return true; + } + case funcParent_kodi_vfs_http_header_get_header_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_header(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_header_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_vfs_http_header_get_header_v1(this, hdl); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_http_header_get_header_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_http_header_get_mime_type_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_mime_type(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_mime_type_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_vfs_http_header_get_mime_type_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_http_header_get_mime_type_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_http_header_get_charset_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_charset(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_charset_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_vfs_http_header_get_charset_v1(this, hdl); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_http_header_get_charset_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_http_header_get_proto_line_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_proto_line(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_http_header_get_proto_line_v1 t = in.get().as(); + KODI_HTTP_HEADER_HDL hdl = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_vfs_http_header_get_proto_line_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_http_header_get_proto_line_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_file_open_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open(const char* filename, unsigned int flags) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_open_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_open_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + unsigned int flags = std::get<1>(t); + KODI_FILE_HDL auto_gen_ret = kodi_vfs_file_open_v1(this, filename.c_str(), flags); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_open_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_vfs_file_open_for_write_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open_for_write(const char* filename, bool overwrite) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_open_for_write_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + bool overwrite = std::get<1>(t); + KODI_FILE_HDL auto_gen_ret = + kodi_vfs_file_open_for_write_v1(this, filename.c_str(), overwrite); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_open_for_write_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_vfs_file_curl_create_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_curl_create(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_create_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_curl_create_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + KODI_FILE_HDL auto_gen_ret = kodi_vfs_file_curl_create_v1(this, url.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_curl_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_vfs_file_curl_add_option_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_add_option(KODI_FILE_HDL hdl, enum CURLOptiontype type, const char* name, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_curl_add_option_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum CURLOptiontype type = std::get<1>(t); + const std::string& name = std::get<2>(t); + const std::string& value = std::get<3>(t); + bool auto_gen_ret = + kodi_vfs_file_curl_add_option_v1(this, hdl, type, name.c_str(), value.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_curl_add_option_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_curl_open_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_open(KODI_FILE_HDL hdl, unsigned int flags) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_open_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_curl_open_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int flags = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_file_curl_open_v1(this, hdl, flags); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_curl_open_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_close_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_close(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_close_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_close_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_vfs_file_close_v1(this, hdl); + return true; + } + case funcParent_kodi_vfs_file_read_v1: + { + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_read(KODI_FILE_HDL hdl, uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_read_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgParent_OUT_kodi_vfs_file_read_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_read_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + + size_t size = std::get<1>(t); + std::vector ptr(size); + ssize_t auto_gen_ret = kodi_vfs_file_read_v1(this, hdl, ptr.data(), size); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_read_v1(auto_gen_ret, ptr)); + return true; + } + case funcParent_kodi_vfs_file_read_line_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_read_line(KODI_FILE_HDL hdl, char* szLine, size_t lineLength) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_read_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_read_line_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_read_line_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + std::string szLine; + size_t lineLength = std::get<1>(t); + szLine.reserve(lineLength); + bool auto_gen_ret = kodi_vfs_file_read_line_v1(this, hdl, &szLine[0], lineLength); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_read_line_v1(auto_gen_ret, szLine)); + return true; + } + case funcParent_kodi_vfs_file_write_v1: + { + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_write(KODI_FILE_HDL hdl, const uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_vfs_file_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_write_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_write_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + const std::vector& ptr = std::get<1>(t); + size_t size = std::get<2>(t); + ssize_t auto_gen_ret = kodi_vfs_file_write_v1(this, hdl, ptr.data(), size); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_write_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_flush_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_flush(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_flush_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_flush_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_flush_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + kodi_vfs_file_flush_v1(this, hdl); + return true; + } + case funcParent_kodi_vfs_file_seek_v1: + { + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_seek(KODI_FILE_HDL hdl, int64_t position, int whence) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_seek_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_seek_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + int64_t position = std::get<1>(t); + int whence = std::get<2>(t); + int64_t auto_gen_ret = kodi_vfs_file_seek_v1(this, hdl, position, whence); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_seek_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_truncate_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_truncate(KODI_FILE_HDL hdl, int64_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_truncate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_truncate_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_truncate_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + int64_t size = std::get<1>(t); + int auto_gen_ret = kodi_vfs_file_truncate_v1(this, hdl, size); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_truncate_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_get_position_v1: + { + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_position(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_position_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_position_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + int64_t auto_gen_ret = kodi_vfs_file_get_position_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_get_position_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_get_length_v1: + { + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_length(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_length_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_length_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_length_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + int64_t auto_gen_ret = kodi_vfs_file_get_length_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_get_length_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_at_end_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_at_end(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_at_end_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_at_end_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_at_end_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_vfs_file_at_end_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_at_end_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_get_download_speed_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_vfs_file_get_download_speed(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_download_speed_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + double auto_gen_ret = kodi_vfs_file_get_download_speed_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_get_download_speed_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_get_chunk_size_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_get_chunk_size(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_chunk_size_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_vfs_file_get_chunk_size_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_get_chunk_size_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_io_ctl_get_seek_possible_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_seek_possible(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_io_ctl_get_seek_possible_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_vfs_file_io_ctl_get_seek_possible_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_io_ctl_get_seek_possible_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_io_ctl_get_cache_status_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_cache_status(KODI_FILE_HDL hdl, struct VFS_CACHE_STATUS* status) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_io_ctl_get_cache_status_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + struct VFS_CACHE_STATUS status; + bool auto_gen_ret = kodi_vfs_file_io_ctl_get_cache_status_v1(this, hdl, &status); + msgpack::pack(out, + msgParent_OUT_kodi_vfs_file_io_ctl_get_cache_status_v1(auto_gen_ret, &status)); + return true; + } + case funcParent_kodi_vfs_file_io_ctl_set_cache_rate_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, unsigned int rate) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_io_ctl_set_cache_rate_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + unsigned int rate = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_file_io_ctl_set_cache_rate_v1(this, hdl, rate); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_io_ctl_set_cache_rate_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_io_ctl_set_retry_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_retry(KODI_FILE_HDL hdl, bool retry) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_io_ctl_set_retry_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + bool retry = std::get<1>(t); + bool auto_gen_ret = kodi_vfs_file_io_ctl_set_retry_v1(this, hdl, retry); + msgpack::pack(out, msgParent_OUT_kodi_vfs_file_io_ctl_set_retry_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_vfs_file_get_property_value_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_file_get_property_value(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_property_value_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum FilePropertyTypes type = std::get<1>(t); + const std::string& name = std::get<2>(t); + char* auto_gen_ret = kodi_vfs_file_get_property_value_v1(this, hdl, type, name.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_vfs_file_get_property_value_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_vfs_file_get_property_values_v1: + { + // Original API call: ATTR_DLL_EXPORT char** kodi_vfs_file_get_property_values(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name, size_t* length) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ + msgParent__IN_kodi_vfs_file_get_property_values_v1 t = in.get().as(); + KODI_FILE_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum FilePropertyTypes type = std::get<1>(t); + const std::string& name = std::get<2>(t); + size_t length = std::get<3>(t); + char** auto_gen_ret = + kodi_vfs_file_get_property_values_v1(this, hdl, type, name.c_str(), &length); + std::vector auto_gen_ret_cpp; + if (auto_gen_ret) + { + auto_gen_ret_cpp.reserve(length); + for (size_t i = 0; i < length; ++i) + { + if (auto_gen_ret[i]) + { + auto_gen_ret_cpp.emplace_back(auto_gen_ret[i]); + free(auto_gen_ret[i]); + } + } + free(auto_gen_ret); + } + msgpack::pack(out, + msgParent_OUT_kodi_vfs_file_get_property_values_v1(auto_gen_ret_cpp, length)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_filesystem_h::{}: addon called with unknown function id '{}' on group " + "'filesystem_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_filesystem_h::kodi_vfs_can_open_directory_v1(void* thisClassHdl, const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemList items; + return CDirectory::GetDirectory(url, items, "", DIR_FLAG_DEFAULTS); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_create_directory_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CDirectory::Create(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_remove_directory_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CDirectory::Remove(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_remove_directory_recursive_v1(void* thisClassHdl, + const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CDirectory::RemoveRecursive(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_directory_exists_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CDirectory::Exists(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_get_directory_v1(void* thisClassHdl, + const char* path, + const char* mask, + struct VFS_DIR_ENTRY** items, + size_t* num_items) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemList fileItems; + if (!CDirectory::GetDirectory(path, fileItems, mask, DIR_FLAG_NO_FILE_DIRS)) + return false; + + if (fileItems.Size() > 0) + { + *num_items = static_cast(fileItems.Size()); + *items = static_cast(malloc(sizeof(VFS_DIR_ENTRY) * fileItems.Size())); + CFileItemListToVFSDirEntries(*items, fileItems); + } + else + { + *num_items = 0; + *items = nullptr; + } + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_exists_v1(void* thisClassHdl, + const char* filename, + bool useCache) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CFile::Exists(filename, useCache); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_stat_file_v1(void* thisClassHdl, + const char* filename, + struct VFS_STAT_STRUCTURE* buffer) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + struct __stat64 statBuffer; + if (CFile::Stat(filename, &statBuffer) != 0) + return false; + + buffer->deviceId = statBuffer.st_dev; + buffer->fileSerialNumber = statBuffer.st_ino; + buffer->size = statBuffer.st_size; + buffer->accessTime = statBuffer.st_atime; + buffer->modificationTime = statBuffer.st_mtime; + buffer->statusTime = statBuffer.st_ctime; + buffer->isDirectory = S_ISDIR(statBuffer.st_mode); + buffer->isSymLink = S_ISLNK(statBuffer.st_mode); + buffer->isBlock = S_ISBLK(statBuffer.st_mode); + buffer->isCharacter = S_ISCHR(statBuffer.st_mode); + buffer->isFifo = S_ISFIFO(statBuffer.st_mode); + buffer->isRegular = S_ISREG(statBuffer.st_mode); + buffer->isSocket = S_ISSOCK(statBuffer.st_mode); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_delete_file_v1(void* thisClassHdl, const char* filename) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CFile::Delete(filename); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_rename_file_v1(void* thisClassHdl, + const char* filename, + const char* newFileName) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CFile::Rename(filename, newFileName); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_copy_file_v1(void* thisClassHdl, + const char* filename, + const char* dest) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CFile::Copy(filename, dest); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_get_file_md5_v1(void* thisClassHdl, const char* filename) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = CUtil::GetFileDigest(filename, KODI::UTILITY::CDigest::Type::MD5); + char* buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_get_cache_thumb_name_v1(void* thisClassHdl, + const char* filename) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + const auto crc = Crc32::ComputeFromLowerCase(filename); + const auto hex = StringUtils::Format("%08x.tbn", crc); + char* buffer = strdup(hex.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_make_legal_filename_v1(void* thisClassHdl, + const char* filename) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = CUtil::MakeLegalFileName(filename); + char* buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_make_legal_path_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = CUtil::MakeLegalPath(path); + char* buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_translate_special_protocol_v1(void* thisClassHdl, + const char* strSource) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(CSpecialProtocol::TranslatePath(strSource).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_is_internet_stream_v1(void* thisClassHdl, + const char* path, + bool strictCheck) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return URIUtils::IsInternetStream(path, strictCheck); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_is_on_lan_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return URIUtils::IsOnLAN(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_is_remote_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return URIUtils::IsRemote(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_is_local_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CURL(path).IsLocal(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_is_url_v1(void* thisClassHdl, const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return URIUtils::IsURL(path); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_get_mime_type_v1(void* thisClassHdl, + const char* url, + char** content, + const char* useragent) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string kodiContent; + bool ret = XFILE::CCurlFile::GetMimeType(CURL(url), kodiContent, useragent); + if (ret && !kodiContent.empty()) + { + *content = strdup(kodiContent.c_str()); + } + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_get_content_type_v1(void* thisClassHdl, + const char* url, + char** content, + const char* useragent) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string kodiContent; + bool ret = XFILE::CCurlFile::GetContentType(CURL(url), kodiContent, useragent); + if (ret && !kodiContent.empty()) + { + *content = strdup(kodiContent.c_str()); + } + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_get_cookies_v1(void* thisClassHdl, + const char* url, + char** cookies) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string kodiCookies; + bool ret = XFILE::CCurlFile::GetCookies(CURL(url), kodiCookies); + if (ret && !kodiCookies.empty()) + { + *cookies = strdup(kodiCookies.c_str()); + } + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_get_disk_space_v1( + void* thisClassHdl, const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + using namespace KODI::PLATFORM::FILESYSTEM; + + std::error_code ec; + auto freeSpace = space(CSpecialProtocol::TranslatePath(path), ec); + if (ec.value() != 0) + return false; + + *capacity = freeSpace.capacity; + *free = freeSpace.free; + *available = freeSpace.available; + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_HTTP_HEADER_HDL CHdl_kodi_filesystem_h::kodi_vfs_http_header_open_v1(void* thisClassHdl, + const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + + CAddonHttpHeader* httpHeader = new CAddonHttpHeader; + if (!XFILE::CCurlFile::GetHttpHeader(CURL(url), *httpHeader)) + { + delete httpHeader; + return nullptr; + } + + return static_cast(httpHeader); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_filesystem_h::kodi_vfs_http_header_close_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + delete static_cast(hdl); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_value_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl, + const char* param) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = static_cast(hdl)->GetValue(param); + + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char** CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_values_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl, + const char* param, + size_t* length) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::vector values = static_cast(hdl)->GetValues(param); + *length = values.size(); + char** ret = static_cast(malloc(sizeof(char*) * values.size())); + for (size_t i = 0; i < *length; ++i) + { + ret[i] = strdup(values[i].c_str()); + } + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_header_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + std::string string = static_cast(hdl)->GetHeader(); + + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_mime_type_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = static_cast(hdl)->GetMimeType(); + + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_charset_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = static_cast(hdl)->GetCharset(); + + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_http_header_get_proto_line_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = static_cast(hdl)->GetProtoLine(); + + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_FILE_HDL CHdl_kodi_filesystem_h::kodi_vfs_file_open_v1(void* thisClassHdl, + const char* filename, + unsigned int flags) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CAddonFile* file = new CAddonFile; + if (file->Open(filename, TranslateFileReadBitsToKodi(flags))) + return static_cast(file); + + delete file; + return nullptr; + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_FILE_HDL CHdl_kodi_filesystem_h::kodi_vfs_file_open_for_write_v1(void* thisClassHdl, + const char* filename, + bool overwrite) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CAddonFile* file = new CAddonFile; + if (file->OpenForWrite(filename, overwrite)) + return static_cast(file); + + delete file; + return nullptr; + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_FILE_HDL CHdl_kodi_filesystem_h::kodi_vfs_file_curl_create_v1(void* thisClassHdl, + const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CAddonFile* file = new CAddonFile; + if (file->CURLCreate(url)) + return static_cast(file); + + delete file; + return nullptr; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_curl_add_option_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum CURLOptiontype type, + const char* name, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + XFILE::CURLOPTIONTYPE internalType; + switch (type) + { + case ADDON_CURL_OPTION_OPTION: + internalType = XFILE::CURL_OPTION_OPTION; + break; + case ADDON_CURL_OPTION_PROTOCOL: + internalType = XFILE::CURL_OPTION_PROTOCOL; + break; + case ADDON_CURL_OPTION_CREDENTIALS: + internalType = XFILE::CURL_OPTION_CREDENTIALS; + break; + case ADDON_CURL_OPTION_HEADER: + internalType = XFILE::CURL_OPTION_HEADER; + break; + default: + throw std::logic_error("Interface_Filesystem::curl_add_option - invalid curl option type"); + return false; + }; + + return static_cast(hdl)->CURLAddOption(internalType, name, value); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_curl_open_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + unsigned int flags) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->CURLOpen(TranslateFileReadBitsToKodi(flags)); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_filesystem_h::kodi_vfs_file_close_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(hdl)->Close(); + delete static_cast(hdl); + + /*---AUTO_GEN_PARSE---*/ +} + +ssize_t CHdl_kodi_filesystem_h::kodi_vfs_file_read_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + uint8_t* ptr, + size_t size) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->Read(ptr, size); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_read_line_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + char* szLine, + size_t lineLength) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->ReadString(szLine, lineLength); + + /*---AUTO_GEN_PARSE---*/ +} + +ssize_t CHdl_kodi_filesystem_h::kodi_vfs_file_write_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + const uint8_t* ptr, + size_t size) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->Write(ptr, size); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_filesystem_h::kodi_vfs_file_flush_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(hdl)->Flush(); + + /*---AUTO_GEN_PARSE---*/ +} + +int64_t CHdl_kodi_filesystem_h::kodi_vfs_file_seek_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + int64_t position, + int whence) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->Seek(position, whence); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_filesystem_h::kodi_vfs_file_truncate_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + int64_t size) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->Truncate(size); + + /*---AUTO_GEN_PARSE---*/ +} + +int64_t CHdl_kodi_filesystem_h::kodi_vfs_file_get_position_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->GetPosition(); + + /*---AUTO_GEN_PARSE---*/ +} + +int64_t CHdl_kodi_filesystem_h::kodi_vfs_file_get_length_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->GetLength(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_at_end_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + int64_t length = kodi_vfs_file_get_length_v1(thisClassHdl, hdl); + int64_t position = kodi_vfs_file_get_position_v1(thisClassHdl, hdl); + return position >= length; + + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_filesystem_h::kodi_vfs_file_get_download_speed_v1(void* thisClassHdl, + KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->GetDownloadSpeed(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_filesystem_h::kodi_vfs_file_get_chunk_size_v1(void* thisClassHdl, KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->GetChunkSize(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_io_ctl_get_seek_possible_v1(void* thisClassHdl, + KODI_FILE_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->IoControl(EIoControl::IOCTRL_SEEK_POSSIBLE, nullptr) != 0 + ? true + : false; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_io_ctl_get_cache_status_v1( + void* thisClassHdl, KODI_FILE_HDL hdl, struct VFS_CACHE_STATUS* status) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + SCacheStatus data = {0}; + int ret = static_cast(hdl)->IoControl(EIoControl::IOCTRL_CACHE_STATUS, &data); + if (ret >= 0) + { + status->forward = data.forward; + status->maxrate = data.maxrate; + status->currate = data.currate; + status->lowspeed = data.lowspeed; + return true; + } + return false; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_io_ctl_set_cache_rate_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + unsigned int rate) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->IoControl(EIoControl::IOCTRL_CACHE_SETRATE, &rate) >= 0 + ? true + : false; + + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_filesystem_h::kodi_vfs_file_io_ctl_set_retry_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + bool retry) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(hdl)->IoControl(EIoControl::IOCTRL_SET_RETRY, &retry) >= 0 + ? true + : false; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_filesystem_h::kodi_vfs_file_get_property_value_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + XFILE::FileProperty internalType = TranslateFilePropertyToKodi(type); + return strdup(static_cast(hdl)->GetProperty(internalType, name).c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +char** CHdl_kodi_filesystem_h::kodi_vfs_file_get_property_values_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name, + size_t* length) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + XFILE::FileProperty internalType = TranslateFilePropertyToKodi(type); + std::vector values = + static_cast(hdl)->GetPropertyValues(internalType, name); + *length = values.size(); + char** ret = static_cast(malloc(sizeof(char*) * values.size())); + for (size_t i = 0; i < *length; ++i) + { + ret[i] = strdup(values[i].c_str()); + } + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/filesystem.h b/xbmc/addons/interface/api/filesystem.h new file mode 100644 index 0000000000000..d0b5977242326 --- /dev/null +++ b/xbmc/addons/interface/api/filesystem.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/filesystem.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_filesystem_h; +struct directFuncToKodi_filesystem_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_filesystem_h : public IMsgHdl +{ +public: + CHdl_kodi_filesystem_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_filesystem_h* ifcToKodi, + directFuncToAddon_filesystem_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_vfs_can_open_directory_v1(void* thisClassHdl, + const char* url); // Added with API 1 + + static bool kodi_vfs_create_directory_v1(void* thisClassHdl, + const char* path); // Added with API 1 + + static bool kodi_vfs_remove_directory_v1(void* thisClassHdl, + const char* path); // Added with API 1 + + static bool kodi_vfs_remove_directory_recursive_v1(void* thisClassHdl, + const char* path); // Added with API 1 + + static bool kodi_vfs_directory_exists_v1(void* thisClassHdl, + const char* path); // Added with API 1 + + static bool kodi_vfs_get_directory_v1(void* thisClassHdl, + const char* path, + const char* mask, + struct VFS_DIR_ENTRY** items, + size_t* num_items); // Added with API 1 + + static bool kodi_vfs_file_exists_v1(void* thisClassHdl, + const char* filename, + bool useCache); // Added with API 1 + + static bool kodi_vfs_stat_file_v1(void* thisClassHdl, + const char* filename, + struct VFS_STAT_STRUCTURE* buffer); // Added with API 1 + + static bool kodi_vfs_delete_file_v1(void* thisClassHdl, const char* filename); // Added with API 1 + + static bool kodi_vfs_rename_file_v1(void* thisClassHdl, + const char* filename, + const char* newFileName); // Added with API 1 + + static bool kodi_vfs_copy_file_v1(void* thisClassHdl, + const char* filename, + const char* dest); // Added with API 1 + + static char* kodi_vfs_get_file_md5_v1(void* thisClassHdl, + const char* filename); // Added with API 1 + + static char* kodi_vfs_get_cache_thumb_name_v1(void* thisClassHdl, + const char* filename); // Added with API 1 + + static char* kodi_vfs_make_legal_filename_v1(void* thisClassHdl, + const char* filename); // Added with API 1 + + static char* kodi_vfs_make_legal_path_v1(void* thisClassHdl, + const char* path); // Added with API 1 + + static char* kodi_vfs_translate_special_protocol_v1(void* thisClassHdl, + const char* strSource); // Added with API 1 + + static bool kodi_vfs_is_internet_stream_v1(void* thisClassHdl, + const char* path, + bool strictCheck); // Added with API 1 + + static bool kodi_vfs_is_on_lan_v1(void* thisClassHdl, const char* path); // Added with API 1 + + static bool kodi_vfs_is_remote_v1(void* thisClassHdl, const char* path); // Added with API 1 + + static bool kodi_vfs_is_local_v1(void* thisClassHdl, const char* path); // Added with API 1 + + static bool kodi_vfs_is_url_v1(void* thisClassHdl, const char* path); // Added with API 1 + + static bool kodi_vfs_get_mime_type_v1(void* thisClassHdl, + const char* url, + char** content, + const char* useragent); // Added with API 1 + + static bool kodi_vfs_get_content_type_v1(void* thisClassHdl, + const char* url, + char** content, + const char* useragent); // Added with API 1 + + static bool kodi_vfs_get_cookies_v1(void* thisClassHdl, + const char* url, + char** cookies); // Added with API 1 + + static bool kodi_vfs_get_disk_space_v1(void* thisClassHdl, + const char* path, + uint64_t* capacity, + uint64_t* free, + uint64_t* available); // Added with API 1 + + static KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open_v1(void* thisClassHdl, + const char* url); // Added with API 1 + + static void kodi_vfs_http_header_close_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl); // Added with API 1 + + static char* kodi_vfs_http_header_get_value_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl, + const char* param); // Added with API 1 + + static char** kodi_vfs_http_header_get_values_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl, + const char* param, + size_t* length); // Added with API 1 + + static char* kodi_vfs_http_header_get_header_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl); // Added with API 1 + + static char* kodi_vfs_http_header_get_mime_type_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl); // Added with API 1 + + static char* kodi_vfs_http_header_get_charset_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl); // Added with API 1 + + static char* kodi_vfs_http_header_get_proto_line_v1(void* thisClassHdl, + KODI_HTTP_HEADER_HDL hdl); // Added with API 1 + + static KODI_FILE_HDL kodi_vfs_file_open_v1(void* thisClassHdl, + const char* filename, + unsigned int flags); // Added with API 1 + + static KODI_FILE_HDL kodi_vfs_file_open_for_write_v1(void* thisClassHdl, + const char* filename, + bool overwrite); // Added with API 1 + + static KODI_FILE_HDL kodi_vfs_file_curl_create_v1(void* thisClassHdl, + const char* url); // Added with API 1 + + static bool kodi_vfs_file_curl_add_option_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum CURLOptiontype type, + const char* name, + const char* value); // Added with API 1 + + static bool kodi_vfs_file_curl_open_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + unsigned int flags); // Added with API 1 + + static void kodi_vfs_file_close_v1(void* thisClassHdl, KODI_FILE_HDL hdl); // Added with API 1 + + static ssize_t kodi_vfs_file_read_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + uint8_t* ptr, + size_t size); // Added with API 1 + + static bool kodi_vfs_file_read_line_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + char* szLine, + size_t lineLength); // Added with API 1 + + static ssize_t kodi_vfs_file_write_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + const uint8_t* ptr, + size_t size); // Added with API 1 + + static void kodi_vfs_file_flush_v1(void* thisClassHdl, KODI_FILE_HDL hdl); // Added with API 1 + + static int64_t kodi_vfs_file_seek_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + int64_t position, + int whence); // Added with API 1 + + static int kodi_vfs_file_truncate_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + int64_t size); // Added with API 1 + + static int64_t kodi_vfs_file_get_position_v1(void* thisClassHdl, + KODI_FILE_HDL hdl); // Added with API 1 + + static int64_t kodi_vfs_file_get_length_v1(void* thisClassHdl, + KODI_FILE_HDL hdl); // Added with API 1 + + static bool kodi_vfs_file_at_end_v1(void* thisClassHdl, KODI_FILE_HDL hdl); // Added with API 1 + + static double kodi_vfs_file_get_download_speed_v1(void* thisClassHdl, + KODI_FILE_HDL hdl); // Added with API 1 + + static int kodi_vfs_file_get_chunk_size_v1(void* thisClassHdl, + KODI_FILE_HDL hdl); // Added with API 1 + + static bool kodi_vfs_file_io_ctl_get_seek_possible_v1(void* thisClassHdl, + KODI_FILE_HDL hdl); // Added with API 1 + + static bool kodi_vfs_file_io_ctl_get_cache_status_v1( + void* thisClassHdl, KODI_FILE_HDL hdl, struct VFS_CACHE_STATUS* status); // Added with API 1 + + static bool kodi_vfs_file_io_ctl_set_cache_rate_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + unsigned int rate); // Added with API 1 + + static bool kodi_vfs_file_io_ctl_set_retry_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + bool retry); // Added with API 1 + + static char* kodi_vfs_file_get_property_value_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name); // Added with API 1 + + static char** kodi_vfs_file_get_property_values_v1(void* thisClassHdl, + KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name, + size_t* length); // Added with API 1 + + + directFuncToAddon_filesystem_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/general.cpp b/xbmc/addons/interface/api/general.cpp new file mode 100644 index 0000000000000..278232f7029a9 --- /dev/null +++ b/xbmc/addons/interface/api/general.cpp @@ -0,0 +1,820 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "general.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/general.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "Application.h" +#include "CompileInfo.h" +#include "LangInfo.h" +#include "ServiceBroker.h" +#include "addons/AddonManager.h" +#include "addons/gui/GUIDialogAddonSettings.h" +#include "cores/AudioEngine/Interfaces/AE.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +#include "filesystem/SpecialProtocol.h" +#include "guilib/GUIAudioManager.h" +#include "guilib/GUIComponent.h" +#include "guilib/LocalizeStrings.h" +#include "input/KeyboardLayout.h" +#include "input/KeyboardLayoutManager.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" +#include "utils/CharsetConverter.h" +#include "utils/Digest.h" +#include "utils/LangCodeExpander.h" +#include "utils/MemUtils.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" + +using namespace ADDON; +using namespace KODI::UTILITY; + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_general_h::InitDirect(directFuncToKodi_general_h* ifcToKodi, + directFuncToAddon_general_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_get_localized_string_v1 = kodi_get_localized_string_v1; + ifcToKodi->kodi_get_free_mem_v1 = kodi_get_free_mem_v1; + ifcToKodi->kodi_unknown_to_utf8_v1 = kodi_unknown_to_utf8_v1; + ifcToKodi->kodi_get_language_v1 = kodi_get_language_v1; + ifcToKodi->kodi_queue_notification_v1 = kodi_queue_notification_v1; + ifcToKodi->kodi_get_digest_v1 = kodi_get_digest_v1; + ifcToKodi->kodi_get_region_v1 = kodi_get_region_v1; + ifcToKodi->kodi_get_global_idle_time_v1 = kodi_get_global_idle_time_v1; + ifcToKodi->kodi_is_addon_avilable_v1 = kodi_is_addon_avilable_v1; + ifcToKodi->kodi_version_v1 = kodi_version_v1; + ifcToKodi->kodi_get_current_skin_id_v1 = kodi_get_current_skin_id_v1; + ifcToKodi->kodi_get_keyboard_layout_v1 = kodi_get_keyboard_layout_v1; + ifcToKodi->kodi_change_keyboard_layout_v1 = kodi_change_keyboard_layout_v1; + ifcToKodi->kodi_play_sfx_v1 = kodi_play_sfx_v1; + ifcToKodi->kodi_stop_sfx_v1 = kodi_stop_sfx_v1; +} + +bool CHdl_kodi_general_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_general_h) + return false; + + switch (func) + { + case funcParent_kodi_get_localized_string_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_get_localized_string(long label_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_localized_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_localized_string_v1; /* Autogenerated */ + msgParent__IN_kodi_get_localized_string_v1 t = in.get().as(); + long label_id = std::get<0>(t); + char* auto_gen_ret = kodi_get_localized_string_v1(this, label_id); + msgpack::pack(out, + msgParent_OUT_kodi_get_localized_string_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_get_free_mem_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_get_free_mem(long* free, long* total, bool as_bytes) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_free_mem_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_free_mem_v1; /* Autogenerated */ + msgParent__IN_kodi_get_free_mem_v1 t = in.get().as(); + long free = std::get<0>(t); + long total = std::get<1>(t); + bool as_bytes = std::get<2>(t); + kodi_get_free_mem_v1(this, &free, &total, as_bytes); + msgpack::pack(out, msgParent_OUT_kodi_get_free_mem_v1(free, total)); + return true; + } + case funcParent_kodi_unknown_to_utf8_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_unknown_to_utf8(const char* source, bool* ret, bool failOnBadChar) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_unknown_to_utf8_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_unknown_to_utf8_v1; /* Autogenerated */ + msgParent__IN_kodi_unknown_to_utf8_v1 t = in.get().as(); + const std::string& source = std::get<0>(t); + bool ret = std::get<1>(t); + bool failOnBadChar = std::get<2>(t); + char* auto_gen_ret = kodi_unknown_to_utf8_v1(this, source.c_str(), &ret, failOnBadChar); + msgpack::pack(out, + msgParent_OUT_kodi_unknown_to_utf8_v1(auto_gen_ret ? auto_gen_ret : "", ret)); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_get_language_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_get_language(enum LangFormats format, bool region) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_language_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_language_v1; /* Autogenerated */ + msgParent__IN_kodi_get_language_v1 t = in.get().as(); + enum LangFormats format = std::get<0>(t); + bool region = std::get<1>(t); + char* auto_gen_ret = kodi_get_language_v1(this, format, region); + msgpack::pack(out, msgParent_OUT_kodi_get_language_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_queue_notification_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_queue_notification(enum QueueMsg type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_queue_notification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_queue_notification_v1; /* Autogenerated */ + msgParent__IN_kodi_queue_notification_v1 t = in.get().as(); + enum QueueMsg type = std::get<0>(t); + const std::string& header = std::get<1>(t); + const std::string& message = std::get<2>(t); + const std::string& imageFile = std::get<3>(t); + unsigned int displayTime = std::get<4>(t); + bool withSound = std::get<5>(t); + unsigned int messageTime = std::get<6>(t); + kodi_queue_notification_v1(this, type, header.c_str(), message.c_str(), imageFile.c_str(), + displayTime, withSound, messageTime); + return true; + } + case funcParent_kodi_get_digest_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_get_digest(enum DigestType type, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_digest_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_digest_v1; /* Autogenerated */ + msgParent__IN_kodi_get_digest_v1 t = in.get().as(); + enum DigestType type = std::get<0>(t); + const std::string& text = std::get<1>(t); + char* auto_gen_ret = kodi_get_digest_v1(this, type, text.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_get_digest_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_get_region_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_get_region(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_region_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_region_v1; /* Autogenerated */ + msgParent__IN_kodi_get_region_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + char* auto_gen_ret = kodi_get_region_v1(this, id.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_get_region_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_get_global_idle_time_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_get_global_idle_time() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_global_idle_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_global_idle_time_v1; /* Autogenerated */ + int auto_gen_ret = kodi_get_global_idle_time_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_get_global_idle_time_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_is_addon_avilable_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_is_addon_avilable(const char* id, char** version, bool* enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_is_addon_avilable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_is_addon_avilable_v1; /* Autogenerated */ + msgParent__IN_kodi_is_addon_avilable_v1 t = in.get().as(); + const std::string& id = std::get<0>(t); + char* version = nullptr; + bool enabled = std::get<1>(t); + bool auto_gen_ret = kodi_is_addon_avilable_v1(this, id.c_str(), &version, &enabled); + msgpack::pack(out, msgParent_OUT_kodi_is_addon_avilable_v1(auto_gen_ret, + version ? version : "", enabled)); + if (version) + free(version); + return true; + } + case funcParent_kodi_version_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_version( char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_version_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_version_v1; /* Autogenerated */ + msgParent__IN_kodi_version_v1 t = in.get().as(); + char* compile_name = nullptr; + int major = std::get<0>(t); + int minor = std::get<1>(t); + char* revision = nullptr; + char* tag = nullptr; + char* tagversion = nullptr; + kodi_version_v1(this, &compile_name, &major, &minor, &revision, &tag, &tagversion); + msgpack::pack(out, + msgParent_OUT_kodi_version_v1(compile_name ? compile_name : "", major, minor, + revision ? revision : "", tag ? tag : "", + tagversion ? tagversion : "")); + if (compile_name) + free(compile_name); + if (revision) + free(revision); + if (tag) + free(tag); + if (tagversion) + free(tagversion); + return true; + } + case funcParent_kodi_get_current_skin_id_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_get_current_skin_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_current_skin_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_current_skin_id_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_get_current_skin_id_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_get_current_skin_id_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_get_keyboard_layout_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_get_keyboard_layout(int modifier_key, char** layout_name, struct AddonKeyboardKeyTable* layout) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_keyboard_layout_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_keyboard_layout_v1; /* Autogenerated */ + msgParent__IN_kodi_get_keyboard_layout_v1 t = in.get().as(); + int modifier_key = std::get<0>(t); + char* layout_name = nullptr; + struct AddonKeyboardKeyTable layout; + bool auto_gen_ret = kodi_get_keyboard_layout_v1(this, modifier_key, &layout_name, &layout); + msgpack::pack(out, msgParent_OUT_kodi_get_keyboard_layout_v1( + auto_gen_ret, layout_name ? layout_name : "", &layout)); + if (layout_name) + free(layout_name); + return true; + } + case funcParent_kodi_change_keyboard_layout_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_change_keyboard_layout(char** layout_name) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_change_keyboard_layout_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_change_keyboard_layout_v1; /* Autogenerated */ + msgParent__IN_kodi_change_keyboard_layout_v1 t = in.get().as(); + char* layout_name = nullptr; + bool auto_gen_ret = kodi_change_keyboard_layout_v1(this, &layout_name); + msgpack::pack(out, msgParent_OUT_kodi_change_keyboard_layout_v1( + auto_gen_ret, layout_name ? layout_name : "")); + if (layout_name) + free(layout_name); + return true; + } + case funcParent_kodi_play_sfx_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_play_sfx(const char* filename, bool use_cached) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_play_sfx_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_play_sfx_v1; /* Autogenerated */ + msgParent__IN_kodi_play_sfx_v1 t = in.get().as(); + const std::string& filename = std::get<0>(t); + bool use_cached = std::get<1>(t); + kodi_play_sfx_v1(this, filename.c_str(), use_cached); + return true; + } + case funcParent_kodi_stop_sfx_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_stop_sfx() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_stop_sfx_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_stop_sfx_v1; /* Autogenerated */ + kodi_stop_sfx_v1(this); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_general_h::{}: addon called with unknown function id '{}' on group " + "'general_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +char* CHdl_kodi_general_h::kodi_get_localized_string_v1(void* thisClassHdl, long label_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + if (g_application.m_bStop) + return nullptr; + + std::string label = + g_localizeStrings.GetAddonString(thisClass->m_process->GetAddonID(), label_id); + if (label.empty()) + label = g_localizeStrings.Get(label_id); + char* buffer = strdup(label.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_general_h::kodi_get_free_mem_v1(void* thisClassHdl, + long* free, + long* total, + bool as_bytes) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + KODI::MEMORY::MemoryStatus stat; + KODI::MEMORY::GetMemoryStatus(&stat); + *free = static_cast(stat.availPhys); + *total = static_cast(stat.totalPhys); + if (!as_bytes) + { + *free = *free / (1024 * 1024); + *total = *total / (1024 * 1024); + } + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_general_h::kodi_unknown_to_utf8_v1(void* thisClassHdl, + const char* source, + bool* ret, + bool failOnBadChar) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string; + *ret = g_charsetConverter.unknownToUTF8(source, string, failOnBadChar); + char* buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_general_h::kodi_get_language_v1(void* thisClassHdl, + enum LangFormats format, + bool region) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + 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.ConvertToISO6392B(string, langCode); + string = langCode; + if (region) + { + std::string region3Code; + g_LangCodeExpander.ConvertToISO6392B(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; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_general_h::kodi_queue_notification_v1(void* thisClassHdl, + enum QueueMsg type, + const char* header, + const char* message, + const char* imageFile, + unsigned int displayTime, + bool withSound, + unsigned int messageTime) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + std::shared_ptr addon = thisClass->m_process->GetAddon(); + + std::string usedHeader; + if (header && strlen(header) > 0) + usedHeader = header; + else + usedHeader = addon->Name(); + + QueueMsg qtype = static_cast(type); + + if (qtype != QUEUE_OWN_STYLE) + { + CGUIDialogKaiToast::eMessageType usedType; + switch (qtype) + { + case QueueMsg::QUEUE_WARNING: + usedType = CGUIDialogKaiToast::Warning; + withSound = true; + CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Warning Message: '{}'", __func__, + addon->Name(), message); + break; + case QueueMsg::QUEUE_ERROR: + usedType = CGUIDialogKaiToast::Error; + withSound = true; + CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Error Message : '{}'", __func__, + addon->Name(), message); + break; + case QueueMsg::QUEUE_INFO: + default: + usedType = CGUIDialogKaiToast::Info; + withSound = false; + CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Info Message : '{}'", __func__, + addon->Name(), message); + break; + } + + if (imageFile && strlen(imageFile) > 0) + { + CLog::Log(LOGERROR, + "Interface_General::{} - To use given image file '{}' must be type value set to " + "'QUEUE_OWN_STYLE'", + __func__, imageFile); + } + + CGUIDialogKaiToast::QueueNotification(usedType, usedHeader, message, 3000, withSound); + } + else + { + CGUIDialogKaiToast::QueueNotification(imageFile, usedHeader, message, displayTime, withSound, + messageTime); + } + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_general_h::kodi_get_digest_v1(void* thisClassHdl, + enum DigestType type, + const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + switch (type) + { + case DIGEST_MD5: + return strdup(CDigest::Calculate(CDigest::Type::MD5, text).c_str()); + case DIGEST_SHA1: + return strdup(CDigest::Calculate(CDigest::Type::SHA1, text).c_str()); + case DIGEST_SHA256: + return strdup(CDigest::Calculate(CDigest::Type::SHA256, text).c_str()); + case DIGEST_SHA512: + return strdup(CDigest::Calculate(CDigest::Type::SHA512, text).c_str()); + default: + return nullptr; + } + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_general_h::kodi_get_region_v1(void* thisClassHdl, const char* id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::shared_ptr addon = thisClass->m_process->GetAddon(); + + std::string result; + if (StringUtils::CompareNoCase(id, "datelong") == 0) + { + result = g_langInfo.GetDateFormat(true); + StringUtils::Replace(result, "DDDD", "%A"); + StringUtils::Replace(result, "MMMM", "%B"); + StringUtils::Replace(result, "D", "%d"); + StringUtils::Replace(result, "YYYY", "%Y"); + } + else if (StringUtils::CompareNoCase(id, "dateshort") == 0) + { + result = g_langInfo.GetDateFormat(false); + StringUtils::Replace(result, "MM", "%m"); + StringUtils::Replace(result, "DD", "%d"); +#ifdef TARGET_WINDOWS + StringUtils::Replace(result, "M", "%#m"); + StringUtils::Replace(result, "D", "%#d"); +#else + StringUtils::Replace(result, "M", "%-m"); + StringUtils::Replace(result, "D", "%-d"); +#endif + StringUtils::Replace(result, "YYYY", "%Y"); + } + else if (StringUtils::CompareNoCase(id, "tempunit") == 0) + result = g_langInfo.GetTemperatureUnitString(); + else if (StringUtils::CompareNoCase(id, "speedunit") == 0) + result = g_langInfo.GetSpeedUnitString(); + else if (StringUtils::CompareNoCase(id, "time") == 0) + { + result = g_langInfo.GetTimeFormat(); + StringUtils::Replace(result, "H", "%H"); + StringUtils::Replace(result, "h", "%I"); + StringUtils::Replace(result, "mm", "%M"); + StringUtils::Replace(result, "ss", "%S"); + StringUtils::Replace(result, "xx", "%p"); + } + else if (StringUtils::CompareNoCase(id, "meridiem") == 0) + result = StringUtils::Format("%s/%s", g_langInfo.GetMeridiemSymbol(MeridiemSymbolAM).c_str(), + g_langInfo.GetMeridiemSymbol(MeridiemSymbolPM).c_str()); + else + { + CLog::Log(LOGERROR, "Interface_General::{} - add-on '{}' requests invalid id '{}'", __func__, + addon->Name(), id); + return nullptr; + } + + char* buffer = strdup(result.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_general_h::kodi_get_global_idle_time_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return g_application.GlobalIdleTime(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_general_h::kodi_is_addon_avilable_v1(void* thisClassHdl, + const char* id, + char** version, + bool* enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + AddonPtr addonInfo; + if (!CServiceBroker::GetAddonMgr().GetAddon(id, addonInfo, ADDON_UNKNOWN, OnlyEnabled::NO)) + return false; + + *version = strdup(addonInfo->Version().asString().c_str()); + *enabled = !CServiceBroker::GetAddonMgr().IsAddonDisabled(id); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_general_h::kodi_version_v1(void* thisClassHdl, + char** compile_name, + int* major, + int* minor, + char** revision, + char** tag, + char** tagversion) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + *compile_name = strdup(CCompileInfo::GetAppName()); + *major = CCompileInfo::GetMajor(); + *minor = CCompileInfo::GetMinor(); + *revision = strdup(CCompileInfo::GetSCMID()); + std::string tagStr = CCompileInfo::GetSuffix(); + if (StringUtils::StartsWithNoCase(tagStr, "alpha")) + { + *tag = strdup("alpha"); + *tagversion = strdup(StringUtils::Mid(tagStr, 5).c_str()); + } + else if (StringUtils::StartsWithNoCase(tagStr, "beta")) + { + *tag = strdup("beta"); + *tagversion = strdup(StringUtils::Mid(tagStr, 4).c_str()); + } + else if (StringUtils::StartsWithNoCase(tagStr, "rc")) + { + *tag = strdup("releasecandidate"); + *tagversion = strdup(StringUtils::Mid(tagStr, 2).c_str()); + } + else if (tagStr.empty()) + *tag = strdup("stable"); + else + *tag = strdup("prealpha"); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_general_h::kodi_get_current_skin_id_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(CServiceBroker::GetSettingsComponent() + ->GetSettings() + ->GetString(CSettings::SETTING_LOOKANDFEEL_SKIN) + .c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_general_h::kodi_get_keyboard_layout_v1(void* thisClassHdl, + int modifier_key, + char** layout_name, + struct AddonKeyboardKeyTable* layout) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + const std::string activeLayout = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT); + + CKeyboardLayout cpp_layout; + if (!CKeyboardLayoutManager::GetInstance().GetLayout(activeLayout, cpp_layout)) + return false; + + *layout_name = strdup(cpp_layout.GetName().c_str()); + + unsigned int modifiers = CKeyboardLayout::ModifierKeyNone; + if (modifier_key & STD_KB_MODIFIER_KEY_SHIFT) + modifiers |= CKeyboardLayout::ModifierKeyShift; + if (modifier_key & STD_KB_MODIFIER_KEY_SYMBOL) + modifiers |= CKeyboardLayout::ModifierKeySymbol; + + for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) + { + for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) + { + std::string label = cpp_layout.GetCharAt(row, column, modifiers); + layout->keys[row][column] = strdup(label.c_str()); + } + } + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_general_h::kodi_change_keyboard_layout_v1(void* thisClassHdl, char** layout_name) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::vector layouts; + unsigned int currentLayout = 0; + + const KeyboardLayouts& keyboardLayouts = CKeyboardLayoutManager::GetInstance().GetLayouts(); + const std::shared_ptr settings = CServiceBroker::GetSettingsComponent()->GetSettings(); + const std::vector layoutNames = + settings->GetList(CSettings::SETTING_LOCALE_KEYBOARDLAYOUTS); + const std::string activeLayout = + settings->GetString(CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT); + + for (const auto& layoutName : layoutNames) + { + const auto keyboardLayout = keyboardLayouts.find(layoutName.asString()); + if (keyboardLayout != keyboardLayouts.end()) + { + layouts.emplace_back(keyboardLayout->second); + if (layoutName.asString() == activeLayout) + currentLayout = layouts.size() - 1; + } + } + + currentLayout++; + if (currentLayout >= layouts.size()) + currentLayout = 0; + CKeyboardLayout layout = layouts.empty() ? CKeyboardLayout() : layouts[currentLayout]; + CServiceBroker::GetSettingsComponent()->GetSettings()->SetString( + CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT, layout.GetName()); + + *layout_name = strdup(layout.GetName().c_str()); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_general_h::kodi_play_sfx_v1(void* thisClassHdl, + const char* filename, + bool use_cached) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIComponent* gui = CServiceBroker::GetGUI(); + if (XFILE::CFile::Exists(filename) && gui) + { + gui->GetAudioManager().PlayPythonSound(filename, use_cached); + } + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_general_h::kodi_stop_sfx_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIComponent* gui = CServiceBroker::GetGUI(); + if (gui) + gui->GetAudioManager().Stop(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/general.h b/xbmc/addons/interface/api/general.h new file mode 100644 index 0000000000000..fca91968660cb --- /dev/null +++ b/xbmc/addons/interface/api/general.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/general.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_general_h; +struct directFuncToKodi_general_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_general_h : public IMsgHdl +{ +public: + CHdl_kodi_general_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_general_h* ifcToKodi, directFuncToAddon_general_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static char* kodi_get_localized_string_v1(void* thisClassHdl, long label_id); // Added with API 1 + + static void kodi_get_free_mem_v1(void* thisClassHdl, + long* free, + long* total, + bool as_bytes); // Added with API 1 + + static char* kodi_unknown_to_utf8_v1(void* thisClassHdl, + const char* source, + bool* ret, + bool failOnBadChar); // Added with API 1 + + static char* kodi_get_language_v1(void* thisClassHdl, + enum LangFormats format, + bool region); // Added with API 1 + + static void kodi_queue_notification_v1(void* thisClassHdl, + enum QueueMsg type, + const char* header, + const char* message, + const char* imageFile, + unsigned int displayTime, + bool withSound, + unsigned int messageTime); // Added with API 1 + + static char* kodi_get_digest_v1(void* thisClassHdl, + enum DigestType type, + const char* text); // Added with API 1 + + static char* kodi_get_region_v1(void* thisClassHdl, const char* id); // Added with API 1 + + static int kodi_get_global_idle_time_v1(void* thisClassHdl); // Added with API 1 + + static bool kodi_is_addon_avilable_v1(void* thisClassHdl, + const char* id, + char** version, + bool* enabled); // Added with API 1 + + static void kodi_version_v1(void* thisClassHdl, + char** compile_name, + int* major, + int* minor, + char** revision, + char** tag, + char** tagversion); // Added with API 1 + + static char* kodi_get_current_skin_id_v1(void* thisClassHdl); // Added with API 1 + + static bool kodi_get_keyboard_layout_v1(void* thisClassHdl, + int modifier_key, + char** layout_name, + struct AddonKeyboardKeyTable* layout); // Added with API 1 + + static bool kodi_change_keyboard_layout_v1(void* thisClassHdl, + char** layout_name); // Added with API 1 + + static void kodi_play_sfx_v1(void* thisClassHdl, + const char* filename, + bool use_cached); // Added with API 1 + + static void kodi_stop_sfx_v1(void* thisClassHdl); // Added with API 1 + + + directFuncToAddon_general_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/CMakeLists.txt b/xbmc/addons/interface/api/gui/CMakeLists.txt new file mode 100644 index 0000000000000..538bef501aa22 --- /dev/null +++ b/xbmc/addons/interface/api/gui/CMakeLists.txt @@ -0,0 +1,18 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + general.cpp + list_item.cpp + window.cpp +) + +set(HEADERS + general.h + list_item.h + window.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_api_gui) +endif() diff --git a/xbmc/addons/interface/api/gui/controls/CMakeLists.txt b/xbmc/addons/interface/api/gui/controls/CMakeLists.txt new file mode 100644 index 0000000000000..8f37c9634ea06 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/CMakeLists.txt @@ -0,0 +1,36 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + button.cpp + edit.cpp + fade_label.cpp + image.cpp + label.cpp + progress.cpp + radio_button.cpp + rendering.cpp + settings_slider.cpp + slider.cpp + spin.cpp + text_box.cpp +) + +set(HEADERS + button.h + edit.h + fade_label.h + image.h + label.h + progress.h + radio_button.h + rendering.h + settings_slider.h + slider.h + spin.h + text_box.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_api_gui_controls) +endif() diff --git a/xbmc/addons/interface/api/gui/controls/button.cpp b/xbmc/addons/interface/api/gui/controls/button.cpp new file mode 100644 index 0000000000000..0720c8906a76b --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/button.cpp @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "button.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/button.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIButtonControl.h" +#include "utils/StringUtils.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_button_h::InitDirect( + directFuncToKodi_gui_controls_button_h* ifcToKodi, + directFuncToAddon_gui_controls_button_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_button_set_visible_v1 = kodi_gui_controls_button_set_visible_v1; + ifcToKodi->kodi_gui_controls_button_set_enabled_v1 = kodi_gui_controls_button_set_enabled_v1; + ifcToKodi->kodi_gui_controls_button_set_label_v1 = kodi_gui_controls_button_set_label_v1; + ifcToKodi->kodi_gui_controls_button_get_label_v1 = kodi_gui_controls_button_get_label_v1; + ifcToKodi->kodi_gui_controls_button_set_label2_v1 = kodi_gui_controls_button_set_label2_v1; + ifcToKodi->kodi_gui_controls_button_get_label2_v1 = kodi_gui_controls_button_get_label2_v1; +} + +bool CHdl_kodi_gui_controls_button_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_button_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_button_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_button_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_button_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_button_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_button_set_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_set_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_controls_button_set_label_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_controls_button_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_get_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_button_get_label_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_button_get_label_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_button_set_label2_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label2(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_set_label2_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_controls_button_set_label2_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_controls_button_get_label2_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label2(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_button_get_label2_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_button_get_label2_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_button_get_label2_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_button_h::{}: addon called with unknown function id '{}' " + "on group 'gui_controls_button_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_set_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLabel(label); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetLabel().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_set_label2_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLabel2(label); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_button_h::kodi_gui_controls_button_get_label2_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetLabel2().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/button.h b/xbmc/addons/interface/api/gui/controls/button.h new file mode 100644 index 0000000000000..f981137327eb5 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/button.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_button_h; +struct directFuncToKodi_gui_controls_button_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_button_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_button_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_button_h* ifcToKodi, + directFuncToAddon_gui_controls_button_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_button_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_button_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_button_set_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label); // Added with API 1 + + static char* kodi_gui_controls_button_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_button_set_label2_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label); // Added with API 1 + + static char* kodi_gui_controls_button_get_label2_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_button_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/edit.cpp b/xbmc/addons/interface/api/gui/controls/edit.cpp new file mode 100644 index 0000000000000..8b33a518b0ee2 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/edit.cpp @@ -0,0 +1,358 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "edit.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIEditControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_edit_h::InitDirect(directFuncToKodi_gui_controls_edit_h* ifcToKodi, + directFuncToAddon_gui_controls_edit_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_edit_set_visible_v1 = kodi_gui_controls_edit_set_visible_v1; + ifcToKodi->kodi_gui_controls_edit_set_enabled_v1 = kodi_gui_controls_edit_set_enabled_v1; + ifcToKodi->kodi_gui_controls_edit_set_label_v1 = kodi_gui_controls_edit_set_label_v1; + ifcToKodi->kodi_gui_controls_edit_get_label_v1 = kodi_gui_controls_edit_get_label_v1; + ifcToKodi->kodi_gui_controls_edit_set_text_v1 = kodi_gui_controls_edit_set_text_v1; + ifcToKodi->kodi_gui_controls_edit_get_text_v1 = kodi_gui_controls_edit_get_text_v1; + ifcToKodi->kodi_gui_controls_edit_set_cursor_position_v1 = + kodi_gui_controls_edit_set_cursor_position_v1; + ifcToKodi->kodi_gui_controls_edit_get_cursor_position_v1 = + kodi_gui_controls_edit_get_cursor_position_v1; + ifcToKodi->kodi_gui_controls_edit_set_input_type_v1 = kodi_gui_controls_edit_set_input_type_v1; +} + +bool CHdl_kodi_gui_controls_edit_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_edit_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_edit_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_edit_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_edit_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_edit_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_edit_set_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_controls_edit_set_label_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_controls_edit_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_get_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_edit_get_label_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_controls_edit_get_label_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_edit_set_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_edit_set_text_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_edit_get_text_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_get_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_edit_get_text_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_controls_edit_get_text_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_edit_set_cursor_position_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_cursor_position(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_cursor_position_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + unsigned int position = std::get<1>(t); + kodi_gui_controls_edit_set_cursor_position_v1(this, handle, position); + return true; + } + case funcParent_kodi_gui_controls_edit_get_cursor_position_v1: + { + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_gui_controls_edit_get_cursor_position( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_get_cursor_position_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_gui_controls_edit_get_cursor_position_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_edit_get_cursor_position_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_edit_set_input_type_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_input_type(KODI_GUI_CONTROL_HANDLE handle, int type, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_edit_set_input_type_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int type = std::get<1>(t); + const std::string& heading = std::get<2>(t); + kodi_gui_controls_edit_set_input_type_v1(this, handle, type, heading.c_str()); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_edit_h::{}: addon called with unknown function id '{}' on " + "group 'gui_controls_edit_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLabel(label); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetLabel().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLabel2(text); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_get_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetLabel2().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_cursor_position_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, unsigned int position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetCursorPosition(position); + + /*---AUTO_GEN_PARSE---*/ +} + +unsigned int CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_get_cursor_position_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetCursorPosition(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_edit_h::kodi_gui_controls_edit_set_input_type_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int type, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIEditControl::INPUT_TYPE kodiType; + switch (static_cast(type)) + { + case ADDON_INPUT_TYPE_TEXT: + kodiType = CGUIEditControl::INPUT_TYPE_TEXT; + break; + case ADDON_INPUT_TYPE_NUMBER: + kodiType = CGUIEditControl::INPUT_TYPE_NUMBER; + break; + case ADDON_INPUT_TYPE_SECONDS: + kodiType = CGUIEditControl::INPUT_TYPE_SECONDS; + break; + case ADDON_INPUT_TYPE_TIME: + kodiType = CGUIEditControl::INPUT_TYPE_TIME; + break; + case ADDON_INPUT_TYPE_DATE: + kodiType = CGUIEditControl::INPUT_TYPE_DATE; + break; + case ADDON_INPUT_TYPE_IPADDRESS: + kodiType = CGUIEditControl::INPUT_TYPE_IPADDRESS; + break; + case ADDON_INPUT_TYPE_PASSWORD: + kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD; + break; + case ADDON_INPUT_TYPE_PASSWORD_MD5: + kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD_MD5; + break; + case ADDON_INPUT_TYPE_SEARCH: + kodiType = CGUIEditControl::INPUT_TYPE_SEARCH; + break; + case ADDON_INPUT_TYPE_FILTER: + kodiType = CGUIEditControl::INPUT_TYPE_FILTER; + break; + case ADDON_INPUT_TYPE_READONLY: + default: + kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW; + } + + static_cast(handle)->SetInputType(kodiType, heading); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/edit.h b/xbmc/addons/interface/api/gui/controls/edit.h new file mode 100644 index 0000000000000..649346073d189 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/edit.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_edit_h; +struct directFuncToKodi_gui_controls_edit_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_edit_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_edit_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_edit_h* ifcToKodi, + directFuncToAddon_gui_controls_edit_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_edit_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_edit_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_edit_set_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label); // Added with API 1 + + static char* kodi_gui_controls_edit_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_edit_set_text_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static char* kodi_gui_controls_edit_get_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_edit_set_cursor_position_v1( + void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + unsigned int position); // Added with API 1 + + static unsigned int kodi_gui_controls_edit_get_cursor_position_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_edit_set_input_type_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int type, + const char* heading); // Added with API 1 + + + directFuncToAddon_gui_controls_edit_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/fade_label.cpp b/xbmc/addons/interface/api/gui/controls/fade_label.cpp new file mode 100644 index 0000000000000..e6776a9a12ed9 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/fade_label.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "fade_label.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIFadeLabelControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_fade_label_h::InitDirect( + directFuncToKodi_gui_controls_fade_label_h* ifcToKodi, + directFuncToAddon_gui_controls_fade_label_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_fade_label_set_visible_v1 = + kodi_gui_controls_fade_label_set_visible_v1; + ifcToKodi->kodi_gui_controls_fade_label_add_label_v1 = kodi_gui_controls_fade_label_add_label_v1; + ifcToKodi->kodi_gui_controls_fade_label_get_label_v1 = kodi_gui_controls_fade_label_get_label_v1; + ifcToKodi->kodi_gui_controls_fade_label_set_scrolling_v1 = + kodi_gui_controls_fade_label_set_scrolling_v1; + ifcToKodi->kodi_gui_controls_fade_label_reset_v1 = kodi_gui_controls_fade_label_reset_v1; +} + +bool CHdl_kodi_gui_controls_fade_label_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_fade_label_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_fade_label_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_fade_label_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_fade_label_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_fade_label_add_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_add_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_fade_label_add_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_fade_label_add_label_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_fade_label_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_fade_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_fade_label_get_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_fade_label_get_label_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_fade_label_get_label_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_fade_label_set_scrolling_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_scrolling(KODI_GUI_CONTROL_HANDLE handle, bool scroll) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_fade_label_set_scrolling_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool scroll = std::get<1>(t); + kodi_gui_controls_fade_label_set_scrolling_v1(this, handle, scroll); + return true; + } + case funcParent_kodi_gui_controls_fade_label_reset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_fade_label_reset_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_fade_label_reset_v1(this, handle); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_fade_label_h::{}: addon called with unknown function id " + "'{}' on group 'gui_controls_fade_label_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_fade_label_h::kodi_gui_controls_fade_label_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_fade_label_h::kodi_gui_controls_fade_label_add_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIFadeLabelControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_ADD, control->GetParentID(), control->GetID()); + msg.SetLabel(text); + control->OnMessage(msg); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_fade_label_h::kodi_gui_controls_fade_label_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CGUIFadeLabelControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, control->GetParentID(), control->GetID()); + control->OnMessage(msg); + std::string text = msg.GetLabel(); + return strdup(text.c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_fade_label_h::kodi_gui_controls_fade_label_set_scrolling_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool scroll) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetScrolling(scroll); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_fade_label_h::kodi_gui_controls_fade_label_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIFadeLabelControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); + control->OnMessage(msg); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/fade_label.h b/xbmc/addons/interface/api/gui/controls/fade_label.h new file mode 100644 index 0000000000000..09466fae12edb --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/fade_label.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_fade_label_h; +struct directFuncToKodi_gui_controls_fade_label_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_fade_label_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_fade_label_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_fade_label_h* ifcToKodi, + directFuncToAddon_gui_controls_fade_label_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_fade_label_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_fade_label_add_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static char* kodi_gui_controls_fade_label_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_fade_label_set_scrolling_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool scroll); // Added with API 1 + + static void kodi_gui_controls_fade_label_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_fade_label_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/image.cpp b/xbmc/addons/interface/api/gui/controls/image.cpp new file mode 100644 index 0000000000000..3d84d645e858b --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/image.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "image.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/image.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIImage.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_image_h::InitDirect(directFuncToKodi_gui_controls_image_h* ifcToKodi, + directFuncToAddon_gui_controls_image_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_image_set_visible_v1 = kodi_gui_controls_image_set_visible_v1; + ifcToKodi->kodi_gui_controls_image_set_filename_v1 = kodi_gui_controls_image_set_filename_v1; + ifcToKodi->kodi_gui_controls_image_set_color_diffuse_v1 = + kodi_gui_controls_image_set_color_diffuse_v1; +} + +bool CHdl_kodi_gui_controls_image_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_image_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_image_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_image_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_image_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_image_set_filename_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_filename(KODI_GUI_CONTROL_HANDLE handle, const char* filename, bool use_cache) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_image_set_filename_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& filename = std::get<1>(t); + bool use_cache = std::get<2>(t); + kodi_gui_controls_image_set_filename_v1(this, handle, filename.c_str(), use_cache); + return true; + } + case funcParent_kodi_gui_controls_image_set_color_diffuse_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_color_diffuse(KODI_GUI_CONTROL_HANDLE handle, uint32_t color_diffuse) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_image_set_color_diffuse_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + uint32_t color_diffuse = std::get<1>(t); + kodi_gui_controls_image_set_color_diffuse_v1(this, handle, color_diffuse); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_image_h::{}: addon called with unknown function id '{}' on " + "group 'gui_controls_image_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_image_h::kodi_gui_controls_image_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_image_h::kodi_gui_controls_image_set_filename_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* filename, bool use_cache) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFileName(filename, false, use_cache); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_image_h::kodi_gui_controls_image_set_color_diffuse_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, uint32_t color_diffuse) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetColorDiffuse(GUILIB::GUIINFO::CGUIInfoColor(color_diffuse)); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/image.h b/xbmc/addons/interface/api/gui/controls/image.h new file mode 100644 index 0000000000000..2f122e057a822 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/image.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_image_h; +struct directFuncToKodi_gui_controls_image_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_image_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_image_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_image_h* ifcToKodi, + directFuncToAddon_gui_controls_image_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_image_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_image_set_filename_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* filename, + bool use_cache); // Added with API 1 + + static void kodi_gui_controls_image_set_color_diffuse_v1( + void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + uint32_t color_diffuse); // Added with API 1 + + + directFuncToAddon_gui_controls_image_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/label.cpp b/xbmc/addons/interface/api/gui/controls/label.cpp new file mode 100644 index 0000000000000..7d11e9796c017 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/label.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "label.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/label.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIComponent.h" +#include "guilib/GUILabelControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_label_h::InitDirect(directFuncToKodi_gui_controls_label_h* ifcToKodi, + directFuncToAddon_gui_controls_label_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_label_set_visible_v1 = kodi_gui_controls_label_set_visible_v1; + ifcToKodi->kodi_gui_controls_label_set_label_v1 = kodi_gui_controls_label_set_label_v1; + ifcToKodi->kodi_gui_controls_label_get_label_v1 = kodi_gui_controls_label_get_label_v1; +} + +bool CHdl_kodi_gui_controls_label_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_label_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_label_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_label_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_label_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_label_set_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_label_set_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_label_set_label_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_label_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_label_get_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_label_get_label_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_label_get_label_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_label_h::{}: addon called with unknown function id '{}' on " + "group 'gui_controls_label_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_label_h::kodi_gui_controls_label_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_label_h::kodi_gui_controls_label_set_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUILabelControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); + msg.SetLabel(text); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_label_h::kodi_gui_controls_label_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetDescription().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/label.h b/xbmc/addons/interface/api/gui/controls/label.h new file mode 100644 index 0000000000000..7dc38a05c28de --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/label.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_label_h; +struct directFuncToKodi_gui_controls_label_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_label_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_label_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_label_h* ifcToKodi, + directFuncToAddon_gui_controls_label_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_label_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_label_set_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static char* kodi_gui_controls_label_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_label_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/progress.cpp b/xbmc/addons/interface/api/gui/controls/progress.cpp new file mode 100644 index 0000000000000..1016fb1ba56a4 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/progress.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "progress.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIProgressControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_progress_h::InitDirect( + directFuncToKodi_gui_controls_progress_h* ifcToKodi, + directFuncToAddon_gui_controls_progress_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_progress_set_visible_v1 = kodi_gui_controls_progress_set_visible_v1; + ifcToKodi->kodi_gui_controls_progress_set_percentage_v1 = + kodi_gui_controls_progress_set_percentage_v1; + ifcToKodi->kodi_gui_controls_progress_get_percentage_v1 = + kodi_gui_controls_progress_get_percentage_v1; +} + +bool CHdl_kodi_gui_controls_progress_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_progress_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_progress_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_progress_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_progress_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_progress_set_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_progress_set_percentage_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float percent = std::get<1>(t); + kodi_gui_controls_progress_set_percentage_v1(this, handle, percent); + return true; + } + case funcParent_kodi_gui_controls_progress_get_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_progress_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_progress_get_percentage_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_progress_get_percentage_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_progress_get_percentage_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_progress_h::{}: addon called with unknown function id '{}' " + "on group 'gui_controls_progress_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_progress_h::kodi_gui_controls_progress_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_progress_h::kodi_gui_controls_progress_set_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float percent) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetPercentage(percent); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_progress_h::kodi_gui_controls_progress_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetPercentage(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/progress.h b/xbmc/addons/interface/api/gui/controls/progress.h new file mode 100644 index 0000000000000..2a45ad5d2029e --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/progress.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_progress_h; +struct directFuncToKodi_gui_controls_progress_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_progress_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_progress_h* ifcToKodi, + directFuncToAddon_gui_controls_progress_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_progress_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_progress_set_percentage_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float percent); // Added with API 1 + + static float kodi_gui_controls_progress_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_progress_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/radio_button.cpp b/xbmc/addons/interface/api/gui/controls/radio_button.cpp new file mode 100644 index 0000000000000..f6e559757dd9f --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/radio_button.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "radio_button.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIRadioButtonControl.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_radio_button_h::InitDirect( + directFuncToKodi_gui_controls_radio_button_h* ifcToKodi, + directFuncToAddon_gui_controls_radio_button_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_radio_button_set_visible_v1 = + kodi_gui_controls_radio_button_set_visible_v1; + ifcToKodi->kodi_gui_controls_radio_button_set_enabled_v1 = + kodi_gui_controls_radio_button_set_enabled_v1; + ifcToKodi->kodi_gui_controls_radio_button_set_label_v1 = + kodi_gui_controls_radio_button_set_label_v1; + ifcToKodi->kodi_gui_controls_radio_button_get_label_v1 = + kodi_gui_controls_radio_button_get_label_v1; + ifcToKodi->kodi_gui_controls_radio_button_set_selected_v1 = + kodi_gui_controls_radio_button_set_selected_v1; + ifcToKodi->kodi_gui_controls_radio_button_is_selected_v1 = + kodi_gui_controls_radio_button_is_selected_v1; +} + +bool CHdl_kodi_gui_controls_radio_button_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_radio_button_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_radio_button_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_radio_button_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_radio_button_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_radio_button_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_radio_button_set_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_set_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_radio_button_set_label_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_radio_button_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_radio_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_get_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_radio_button_get_label_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_radio_button_get_label_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_radio_button_set_selected_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_selected(KODI_GUI_CONTROL_HANDLE handle, bool selected) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_set_selected_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool selected = std::get<1>(t); + kodi_gui_controls_radio_button_set_selected_v1(this, handle, selected); + return true; + } + case funcParent_kodi_gui_controls_radio_button_is_selected_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_controls_radio_button_is_selected(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_button_is_selected_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_controls_radio_button_is_selected_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_radio_button_is_selected_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_radio_button_h::{}: addon called with unknown function id " + "'{}' on group 'gui_controls_radio_button_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_set_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLabel(text); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetLabel().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_set_selected_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool selected) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetSelected(selected); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_controls_radio_button_h::kodi_gui_controls_radio_button_is_selected_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->IsSelected(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/radio_button.h b/xbmc/addons/interface/api/gui/controls/radio_button.h new file mode 100644 index 0000000000000..577edbd6d831f --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/radio_button.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_radio_button_h; +struct directFuncToKodi_gui_controls_radio_button_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_radio_button_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_radio_button_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_radio_button_h* ifcToKodi, + directFuncToAddon_gui_controls_radio_button_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_radio_button_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_radio_button_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_radio_button_set_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static char* kodi_gui_controls_radio_button_get_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_radio_button_set_selected_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool selected); // Added with API 1 + + static bool kodi_gui_controls_radio_button_is_selected_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_radio_button_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/rendering.cpp b/xbmc/addons/interface/api/gui/controls/rendering.cpp new file mode 100644 index 0000000000000..98c713e40f171 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/rendering.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "rendering.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "addons/interface/api/gui/general.h" +#include "guilib/GUIRenderingControl.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_rendering_h::InitDirect( + directFuncToKodi_gui_controls_rendering_h* ifcToKodi, + directFuncToAddon_gui_controls_rendering_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_radio_rendering_destroy_v1 = + kodi_gui_controls_radio_rendering_destroy_v1; +} + +bool CHdl_kodi_gui_controls_rendering_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_rendering_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_radio_rendering_destroy_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_destroy(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_radio_rendering_destroy_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_radio_rendering_destroy_v1(this, handle); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_rendering_h::{}: addon called with unknown function id " + "'{}' on group 'gui_controls_rendering_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_rendering_h::kodi_gui_controls_radio_rendering_destroy_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CHdl_kodi_gui_general_h::lock(); + // static_cast(handle)->Delete(); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/rendering.h b/xbmc/addons/interface/api/gui/controls/rendering.h new file mode 100644 index 0000000000000..d50e86160a759 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/rendering.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_rendering_h; +struct directFuncToKodi_gui_controls_rendering_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_rendering_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_rendering_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_rendering_h* ifcToKodi, + directFuncToAddon_gui_controls_rendering_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_radio_rendering_destroy_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_controls_rendering_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/settings_slider.cpp b/xbmc/addons/interface/api/gui/controls/settings_slider.cpp new file mode 100644 index 0000000000000..a6edb41a929fe --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/settings_slider.cpp @@ -0,0 +1,491 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "settings_slider.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIComponent.h" +#include "guilib/GUISettingsSliderControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_settings_slider_h::InitDirect( + directFuncToKodi_gui_controls_settings_slider_h* ifcToKodi, + directFuncToAddon_gui_controls_settings_slider_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_settings_slider_set_visible_v1 = + kodi_gui_controls_settings_slider_set_visible_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_enabled_v1 = + kodi_gui_controls_settings_slider_set_enabled_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_text_v1 = + kodi_gui_controls_settings_slider_set_text_v1; + ifcToKodi->kodi_gui_controls_settings_slider_reset_v1 = + kodi_gui_controls_settings_slider_reset_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_int_range_v1 = + kodi_gui_controls_settings_slider_set_int_range_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_int_value_v1 = + kodi_gui_controls_settings_slider_set_int_value_v1; + ifcToKodi->kodi_gui_controls_settings_slider_get_int_value_v1 = + kodi_gui_controls_settings_slider_get_int_value_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_int_interval_v1 = + kodi_gui_controls_settings_slider_set_int_interval_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_percentage_v1 = + kodi_gui_controls_settings_slider_set_percentage_v1; + ifcToKodi->kodi_gui_controls_settings_slider_get_percentage_v1 = + kodi_gui_controls_settings_slider_get_percentage_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_float_range_v1 = + kodi_gui_controls_settings_slider_set_float_range_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_float_value_v1 = + kodi_gui_controls_settings_slider_set_float_value_v1; + ifcToKodi->kodi_gui_controls_settings_slider_get_float_value_v1 = + kodi_gui_controls_settings_slider_get_float_value_v1; + ifcToKodi->kodi_gui_controls_settings_slider_set_float_interval_v1 = + kodi_gui_controls_settings_slider_set_float_interval_v1; +} + +bool CHdl_kodi_gui_controls_settings_slider_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_settings_slider_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_settings_slider_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_settings_slider_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_settings_slider_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_controls_settings_slider_set_text_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_reset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_reset_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_settings_slider_reset_v1(this, handle); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_int_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_range( KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_int_range_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int start = std::get<1>(t); + int end = std::get<2>(t); + kodi_gui_controls_settings_slider_set_int_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_value( KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_int_value_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int value = std::get<1>(t); + kodi_gui_controls_settings_slider_set_int_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_get_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_settings_slider_get_int_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_get_int_value_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_controls_settings_slider_get_int_value_v1(this, handle); + msgpack::pack(out, + msgParent_OUT_kodi_gui_controls_settings_slider_get_int_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_int_interval_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_interval( KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_int_interval_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int interval = std::get<1>(t); + kodi_gui_controls_settings_slider_set_int_interval_v1(this, handle, interval); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_percentage( KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_percentage_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float percent = std::get<1>(t); + kodi_gui_controls_settings_slider_set_percentage_v1(this, handle, percent); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_get_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_percentage( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_get_percentage_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_settings_slider_get_percentage_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_controls_settings_slider_get_percentage_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_float_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_range( KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_float_range_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float start = std::get<1>(t); + float end = std::get<2>(t); + kodi_gui_controls_settings_slider_set_float_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_value( KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_float_value_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float value = std::get<1>(t); + kodi_gui_controls_settings_slider_set_float_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_get_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_float_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_get_float_value_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_settings_slider_get_float_value_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_controls_settings_slider_get_float_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_settings_slider_set_float_interval_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_interval( KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_settings_slider_set_float_interval_v1 t = + in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float interval = std::get<1>(t); + kodi_gui_controls_settings_slider_set_float_interval_v1(this, handle, interval); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_settings_slider_h::{}: addon called with unknown function " + "id '{}' on group 'gui_controls_settings_slider_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); + msg.SetLabel(label); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_int_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int start, int end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_INT); + control->SetRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_INT); + control->SetIntValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetIntValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h:: + kodi_gui_controls_settings_slider_set_int_interval_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int interval) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetIntInterval(interval); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float percent) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); + control->SetPercentage(percent); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetPercentage(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_float_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float start, float end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_FLOAT); + control->SetFloatRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h::kodi_gui_controls_settings_slider_set_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISettingsSliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_FLOAT); + control->SetFloatValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_settings_slider_h:: + kodi_gui_controls_settings_slider_get_float_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetFloatValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_settings_slider_h:: + kodi_gui_controls_settings_slider_set_float_interval_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float interval) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFloatInterval(interval); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/settings_slider.h b/xbmc/addons/interface/api/gui/controls/settings_slider.h new file mode 100644 index 0000000000000..639f01cb0da08 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/settings_slider.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_settings_slider_h; +struct directFuncToKodi_gui_controls_settings_slider_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_settings_slider_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_settings_slider_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_settings_slider_h* ifcToKodi, + directFuncToAddon_gui_controls_settings_slider_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_settings_slider_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_text_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label); // Added with API 1 + + static void kodi_gui_controls_settings_slider_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_int_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int start, + int end); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_int_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int value); // Added with API 1 + + static int kodi_gui_controls_settings_slider_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_int_interval_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int interval); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float percent); // Added with API 1 + + static float kodi_gui_controls_settings_slider_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_float_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float start, + float end); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_float_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float value); // Added with API 1 + + static float kodi_gui_controls_settings_slider_get_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_settings_slider_set_float_interval_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float interval); // Added with API 1 + + + directFuncToAddon_gui_controls_settings_slider_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/slider.cpp b/xbmc/addons/interface/api/gui/controls/slider.cpp new file mode 100644 index 0000000000000..66c5cf29d9f6f --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/slider.cpp @@ -0,0 +1,467 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "slider.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIComponent.h" +#include "guilib/GUISliderControl.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_slider_h::InitDirect( + directFuncToKodi_gui_controls_slider_h* ifcToKodi, + directFuncToAddon_gui_controls_slider_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_slider_set_visible_v1 = kodi_gui_controls_slider_set_visible_v1; + ifcToKodi->kodi_gui_controls_slider_set_enabled_v1 = kodi_gui_controls_slider_set_enabled_v1; + ifcToKodi->kodi_gui_controls_slider_reset_v1 = kodi_gui_controls_slider_reset_v1; + ifcToKodi->kodi_gui_controls_slider_get_description_v1 = + kodi_gui_controls_slider_get_description_v1; + ifcToKodi->kodi_gui_controls_slider_set_int_range_v1 = kodi_gui_controls_slider_set_int_range_v1; + ifcToKodi->kodi_gui_controls_slider_set_int_value_v1 = kodi_gui_controls_slider_set_int_value_v1; + ifcToKodi->kodi_gui_controls_slider_get_int_value_v1 = kodi_gui_controls_slider_get_int_value_v1; + ifcToKodi->kodi_gui_controls_slider_set_int_interval_v1 = + kodi_gui_controls_slider_set_int_interval_v1; + ifcToKodi->kodi_gui_controls_slider_set_percentage_v1 = + kodi_gui_controls_slider_set_percentage_v1; + ifcToKodi->kodi_gui_controls_slider_get_percentage_v1 = + kodi_gui_controls_slider_get_percentage_v1; + ifcToKodi->kodi_gui_controls_slider_set_float_range_v1 = + kodi_gui_controls_slider_set_float_range_v1; + ifcToKodi->kodi_gui_controls_slider_set_float_value_v1 = + kodi_gui_controls_slider_set_float_value_v1; + ifcToKodi->kodi_gui_controls_slider_get_float_value_v1 = + kodi_gui_controls_slider_get_float_value_v1; + ifcToKodi->kodi_gui_controls_slider_set_float_interval_v1 = + kodi_gui_controls_slider_set_float_interval_v1; +} + +bool CHdl_kodi_gui_controls_slider_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_slider_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_slider_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_slider_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_slider_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_slider_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_slider_reset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_reset_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_slider_reset_v1(this, handle); + return true; + } + case funcParent_kodi_gui_controls_slider_get_description_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_slider_get_description(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_get_description_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_slider_get_description_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_slider_get_description_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_slider_set_int_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_int_range_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int start = std::get<1>(t); + int end = std::get<2>(t); + kodi_gui_controls_slider_set_int_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_slider_set_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_int_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int value = std::get<1>(t); + kodi_gui_controls_slider_set_int_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_slider_get_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_get_int_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_controls_slider_get_int_value_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_slider_get_int_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_slider_set_int_interval_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_interval(KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_int_interval_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int interval = std::get<1>(t); + kodi_gui_controls_slider_set_int_interval_v1(this, handle, interval); + return true; + } + case funcParent_kodi_gui_controls_slider_set_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_percentage_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float percent = std::get<1>(t); + kodi_gui_controls_slider_set_percentage_v1(this, handle, percent); + return true; + } + case funcParent_kodi_gui_controls_slider_get_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_get_percentage_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_slider_get_percentage_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_slider_get_percentage_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_slider_set_float_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_float_range_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float start = std::get<1>(t); + float end = std::get<2>(t); + kodi_gui_controls_slider_set_float_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_slider_set_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_float_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float value = std::get<1>(t); + kodi_gui_controls_slider_set_float_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_slider_get_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_get_float_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_slider_get_float_value_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_slider_get_float_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_slider_set_float_interval_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_slider_set_float_interval_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float interval = std::get<1>(t); + kodi_gui_controls_slider_set_float_interval_v1(this, handle, interval); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_slider_h::{}: addon called with unknown function id '{}' " + "on group 'gui_controls_slider_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_get_description_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetDescription().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_int_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int start, int end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_INT); + control->SetRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_INT); + control->SetIntValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetIntValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_int_interval_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int interval) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetIntInterval(interval); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float percent) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); + control->SetPercentage(percent); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetPercentage(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_float_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float start, float end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_FLOAT); + control->SetFloatRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISliderControl* control = static_cast(handle); + control->SetType(SLIDER_CONTROL_TYPE_FLOAT); + control->SetFloatValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_get_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetFloatValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_slider_h::kodi_gui_controls_slider_set_float_interval_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float interval) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFloatInterval(interval); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/slider.h b/xbmc/addons/interface/api/gui/controls/slider.h new file mode 100644 index 0000000000000..3d91cd9e60ae9 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/slider.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_slider_h; +struct directFuncToKodi_gui_controls_slider_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_slider_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_slider_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_slider_h* ifcToKodi, + directFuncToAddon_gui_controls_slider_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_slider_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_slider_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_slider_reset_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static char* kodi_gui_controls_slider_get_description_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_slider_set_int_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int start, + int end); // Added with API 1 + + static void kodi_gui_controls_slider_set_int_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int value); // Added with API 1 + + static int kodi_gui_controls_slider_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_slider_set_int_interval_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int interval); // Added with API 1 + + static void kodi_gui_controls_slider_set_percentage_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float percent); // Added with API 1 + + static float kodi_gui_controls_slider_get_percentage_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_slider_set_float_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float start, + float end); // Added with API 1 + + static void kodi_gui_controls_slider_set_float_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float value); // Added with API 1 + + static float kodi_gui_controls_slider_get_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_slider_set_float_interval_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float interval); // Added with API 1 + + + directFuncToAddon_gui_controls_slider_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/spin.cpp b/xbmc/addons/interface/api/gui/controls/spin.cpp new file mode 100644 index 0000000000000..fd188fdd85937 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/spin.cpp @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "spin.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIComponent.h" +#include "guilib/GUISpinControlEx.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_spin_h::InitDirect(directFuncToKodi_gui_controls_spin_h* ifcToKodi, + directFuncToAddon_gui_controls_spin_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_spin_set_visible_v1 = kodi_gui_controls_spin_set_visible_v1; + ifcToKodi->kodi_gui_controls_spin_set_enabled_v1 = kodi_gui_controls_spin_set_enabled_v1; + ifcToKodi->kodi_gui_controls_spin_set_text_v1 = kodi_gui_controls_spin_set_text_v1; + ifcToKodi->kodi_gui_controls_spin_reset_v1 = kodi_gui_controls_spin_reset_v1; + ifcToKodi->kodi_gui_controls_spin_set_type_v1 = kodi_gui_controls_spin_set_type_v1; + ifcToKodi->kodi_gui_controls_spin_add_string_label_v1 = + kodi_gui_controls_spin_add_string_label_v1; + ifcToKodi->kodi_gui_controls_spin_set_string_value_v1 = + kodi_gui_controls_spin_set_string_value_v1; + ifcToKodi->kodi_gui_controls_spin_get_string_value_v1 = + kodi_gui_controls_spin_get_string_value_v1; + ifcToKodi->kodi_gui_controls_spin_add_int_label_v1 = kodi_gui_controls_spin_add_int_label_v1; + ifcToKodi->kodi_gui_controls_spin_set_int_range_v1 = kodi_gui_controls_spin_set_int_range_v1; + ifcToKodi->kodi_gui_controls_spin_set_int_value_v1 = kodi_gui_controls_spin_set_int_value_v1; + ifcToKodi->kodi_gui_controls_spin_get_int_value_v1 = kodi_gui_controls_spin_get_int_value_v1; + ifcToKodi->kodi_gui_controls_spin_set_float_range_v1 = kodi_gui_controls_spin_set_float_range_v1; + ifcToKodi->kodi_gui_controls_spin_set_float_value_v1 = kodi_gui_controls_spin_set_float_value_v1; + ifcToKodi->kodi_gui_controls_spin_get_float_value_v1 = kodi_gui_controls_spin_get_float_value_v1; + ifcToKodi->kodi_gui_controls_spin_set_float_interval_v1 = + kodi_gui_controls_spin_set_float_interval_v1; +} + +bool CHdl_kodi_gui_controls_spin_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_spin_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_spin_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_spin_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_spin_set_enabled_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_enabled_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool enabled = std::get<1>(t); + kodi_gui_controls_spin_set_enabled_v1(this, handle, enabled); + return true; + } + case funcParent_kodi_gui_controls_spin_set_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_spin_set_text_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_spin_reset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_reset_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_spin_reset_v1(this, handle); + return true; + } + case funcParent_kodi_gui_controls_spin_set_type_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_type(KODI_GUI_CONTROL_HANDLE handle, int type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_type_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int type = std::get<1>(t); + kodi_gui_controls_spin_set_type_v1(this, handle, type); + return true; + } + case funcParent_kodi_gui_controls_spin_add_string_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_string_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_add_string_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + const std::string& value = std::get<2>(t); + kodi_gui_controls_spin_add_string_label_v1(this, handle, label.c_str(), value.c_str()); + return true; + } + case funcParent_kodi_gui_controls_spin_set_string_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_string_value(KODI_GUI_CONTROL_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_string_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& value = std::get<1>(t); + kodi_gui_controls_spin_set_string_value_v1(this, handle, value.c_str()); + return true; + } + case funcParent_kodi_gui_controls_spin_get_string_value_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_spin_get_string_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_get_string_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_spin_get_string_value_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_spin_get_string_value_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_spin_add_int_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_int_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_add_int_label_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + int value = std::get<2>(t); + kodi_gui_controls_spin_add_int_label_v1(this, handle, label.c_str(), value); + return true; + } + case funcParent_kodi_gui_controls_spin_set_int_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_int_range_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int start = std::get<1>(t); + int end = std::get<2>(t); + kodi_gui_controls_spin_set_int_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_spin_set_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_int_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int value = std::get<1>(t); + kodi_gui_controls_spin_set_int_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_spin_get_int_value_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_spin_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_get_int_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_controls_spin_get_int_value_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_spin_get_int_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_spin_set_float_range_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_float_range_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float start = std::get<1>(t); + float end = std::get<2>(t); + kodi_gui_controls_spin_set_float_range_v1(this, handle, start, end); + return true; + } + case funcParent_kodi_gui_controls_spin_set_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_float_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float value = std::get<1>(t); + kodi_gui_controls_spin_set_float_value_v1(this, handle, value); + return true; + } + case funcParent_kodi_gui_controls_spin_get_float_value_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_spin_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_get_float_value_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_controls_spin_get_float_value_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_spin_get_float_value_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_controls_spin_set_float_interval_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_spin_set_float_interval_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float interval = std::get<1>(t); + kodi_gui_controls_spin_set_float_interval_v1(this, handle, interval); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_spin_h::{}: addon called with unknown function id '{}' on " + "group 'gui_controls_spin_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_enabled_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool enabled) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetEnabled(enabled); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISpinControlEx* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); + msg.SetLabel(text); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_reset_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUISpinControlEx* control = static_cast(handle); + CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_type_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int type) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetType(type); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_add_string_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label, const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->AddLabel(std::string(label), std::string(value)); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_string_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetStringValue(std::string(value)); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_get_string_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->GetStringValue().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_add_int_label_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* label, int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->AddLabel(std::string(label), value); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_int_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int start, int end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_float_range_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float start, float end) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFloatRange(start, end); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFloatValue(value); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_get_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetFloatValue(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_spin_h::kodi_gui_controls_spin_set_float_interval_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, float interval) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetFloatInterval(interval); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/spin.h b/xbmc/addons/interface/api/gui/controls/spin.h new file mode 100644 index 0000000000000..8271652325c9c --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/spin.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_spin_h; +struct directFuncToKodi_gui_controls_spin_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_spin_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_spin_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_spin_h* ifcToKodi, + directFuncToAddon_gui_controls_spin_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_spin_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_spin_set_enabled_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool enabled); // Added with API 1 + + static void kodi_gui_controls_spin_set_text_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static void kodi_gui_controls_spin_reset_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_spin_set_type_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int type); // Added with API 1 + + static void kodi_gui_controls_spin_add_string_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label, + const char* value); // Added with API 1 + + static void kodi_gui_controls_spin_set_string_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* value); // Added with API 1 + + static char* kodi_gui_controls_spin_get_string_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_spin_add_int_label_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* label, + int value); // Added with API 1 + + static void kodi_gui_controls_spin_set_int_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int start, + int end); // Added with API 1 + + static void kodi_gui_controls_spin_set_int_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int value); // Added with API 1 + + static int kodi_gui_controls_spin_get_int_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_spin_set_float_range_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float start, + float end); // Added with API 1 + + static void kodi_gui_controls_spin_set_float_value_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float value); // Added with API 1 + + static float kodi_gui_controls_spin_get_float_value_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_spin_set_float_interval_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + float interval); // Added with API 1 + + + directFuncToAddon_gui_controls_spin_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/text_box.cpp b/xbmc/addons/interface/api/gui/controls/text_box.cpp new file mode 100644 index 0000000000000..5bf77e1e68a49 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/text_box.cpp @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "text_box.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIComponent.h" +#include "guilib/GUITextBox.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_text_box_h::InitDirect( + directFuncToKodi_gui_controls_text_box_h* ifcToKodi, + directFuncToAddon_gui_controls_text_box_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_controls_text_box_set_visible_v1 = kodi_gui_controls_text_box_set_visible_v1; + ifcToKodi->kodi_gui_controls_text_box_reset_v1 = kodi_gui_controls_text_box_reset_v1; + ifcToKodi->kodi_gui_controls_text_box_set_text_v1 = kodi_gui_controls_text_box_set_text_v1; + ifcToKodi->kodi_gui_controls_text_box_get_text_v1 = kodi_gui_controls_text_box_get_text_v1; + ifcToKodi->kodi_gui_controls_text_box_scroll_v1 = kodi_gui_controls_text_box_scroll_v1; + ifcToKodi->kodi_gui_controls_text_box_set_auto_scrolling_v1 = + kodi_gui_controls_text_box_set_auto_scrolling_v1; +} + +bool CHdl_kodi_gui_controls_text_box_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_controls_text_box_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_controls_text_box_set_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_set_visible_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool visible = std::get<1>(t); + kodi_gui_controls_text_box_set_visible_v1(this, handle, visible); + return true; + } + case funcParent_kodi_gui_controls_text_box_reset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_reset_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_controls_text_box_reset_v1(this, handle); + return true; + } + case funcParent_kodi_gui_controls_text_box_set_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_set_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_controls_text_box_set_text_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_controls_text_box_get_text_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_text_box_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_get_text_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_controls_text_box_get_text_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_controls_text_box_get_text_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_controls_text_box_scroll_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_scroll(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_scroll_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + unsigned int position = std::get<1>(t); + kodi_gui_controls_text_box_scroll_v1(this, handle, position); + return true; + } + case funcParent_kodi_gui_controls_text_box_set_auto_scrolling_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_auto_scrolling( KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_controls_text_box_set_auto_scrolling_v1 t = in.get().as(); + KODI_GUI_CONTROL_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int delay = std::get<1>(t); + int time = std::get<2>(t); + int repeat = std::get<3>(t); + kodi_gui_controls_text_box_set_auto_scrolling_v1(this, handle, delay, time, repeat); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{}: addon called with unknown function id '{}' " + "on group 'gui_controls_text_box_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_set_visible_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + control->SetVisible(visible); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_set_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); + msg.SetLabel(text); + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_get_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return nullptr; + } + + return strdup(control->GetDescription().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_scroll_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, unsigned int position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + control->Scroll(position); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_controls_text_box_h::kodi_gui_controls_text_box_set_auto_scrolling_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUITextBox* control = static_cast(handle); + if (!control) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_controls_text_box_h::{} - invalid handler data (handle='{}') on addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + control->SetAutoScrolling(delay, time, repeat); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/controls/text_box.h b/xbmc/addons/interface/api/gui/controls/text_box.h new file mode 100644 index 0000000000000..2a1a7feb20209 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/text_box.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_text_box_h; +struct directFuncToKodi_gui_controls_text_box_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_controls_text_box_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_text_box_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_controls_text_box_h* ifcToKodi, + directFuncToAddon_gui_controls_text_box_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_controls_text_box_set_visible_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + bool visible); // Added with API 1 + + static void kodi_gui_controls_text_box_reset_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_text_box_set_text_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + const char* text); // Added with API 1 + + static char* kodi_gui_controls_text_box_get_text_v1( + void* thisClassHdl, KODI_GUI_CONTROL_HANDLE handle); // Added with API 1 + + static void kodi_gui_controls_text_box_scroll_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + unsigned int position); // Added with API 1 + + static void kodi_gui_controls_text_box_set_auto_scrolling_v1(void* thisClassHdl, + KODI_GUI_CONTROL_HANDLE handle, + int delay, + int time, + int repeat); // Added with API 1 + + + directFuncToAddon_gui_controls_text_box_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/CMakeLists.txt b/xbmc/addons/interface/api/gui/dialogs/CMakeLists.txt new file mode 100644 index 0000000000000..c1f9c0274b181 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/CMakeLists.txt @@ -0,0 +1,32 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + context_menu.cpp + extended_progress.cpp + filebrowser.cpp + keyboard.cpp + numeric.cpp + ok.cpp + progress.cpp + select.cpp + text_viewer.cpp + yes_no.cpp +) + +set(HEADERS + context_menu.h + extended_progress.h + filebrowser.h + keyboard.h + numeric.h + ok.h + progress.h + select.h + text_viewer.h + yes_no.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_api_gui_dialogs) +endif() diff --git a/xbmc/addons/interface/api/gui/dialogs/context_menu.cpp b/xbmc/addons/interface/api/gui/dialogs/context_menu.cpp new file mode 100644 index 0000000000000..4113307e800e1 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/context_menu.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "context_menu.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "dialogs/GUIDialogContextMenu.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_context_menu_h::InitDirect( + directFuncToKodi_gui_dialogs_context_menu_h* ifcToKodi, + directFuncToAddon_gui_dialogs_context_menu_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_context_menu_open_v1 = kodi_gui_dialogs_context_menu_open_v1; +} + +bool CHdl_kodi_gui_dialogs_context_menu_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_context_menu_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_context_menu_open_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_context_menu_open(const char* heading, const char* entries[], size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_context_menu_open_v1 t = in.get().as(); + const std::string& heading = std::get<0>(t); + const std::vector& cpp_entries = std::get<1>(t); + size_t size = std::get<2>(t); + + std::vector entries; + entries.reserve(size); + for (size_t i = 0; i < size; ++i) + { + entries.emplace_back(cpp_entries[i].c_str()); + } + assert(cpp_entries.size() == size); + + int auto_gen_ret = + kodi_gui_dialogs_context_menu_open_v1(this, heading.c_str(), entries.data(), size); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_context_menu_open_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_context_menu_h::{}: addon called with unknown function id " + "'{}' on group 'gui_dialogs_context_menu_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +int CHdl_kodi_gui_dialogs_context_menu_h::kodi_gui_dialogs_context_menu_open_v1( + void* thisClassHdl, const char* heading, const char* entries[], size_t size) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + CGUIDialogContextMenu* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_CONTEXT_MENU); + + CContextButtons choices; + for (unsigned int i = 0; i < size; ++i) + choices.Add(i, entries[i]); + + return dialog->Show(choices); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/context_menu.h b/xbmc/addons/interface/api/gui/dialogs/context_menu.h new file mode 100644 index 0000000000000..47dfb2d19b8b0 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/context_menu.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_context_menu_h; +struct directFuncToKodi_gui_dialogs_context_menu_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_context_menu_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_context_menu_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_context_menu_h* ifcToKodi, + directFuncToAddon_gui_dialogs_context_menu_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static int kodi_gui_dialogs_context_menu_open_v1(void* thisClassHdl, + const char* heading, + const char* entries[], + size_t size); // Added with API 1 + + + directFuncToAddon_gui_dialogs_context_menu_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/extended_progress.cpp b/xbmc/addons/interface/api/gui/dialogs/extended_progress.cpp new file mode 100644 index 0000000000000..65d34d2789855 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/extended_progress.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "extended_progress.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_extended_progress_h::InitDirect( + directFuncToKodi_gui_dialogs_extended_progress_h* ifcToKodi, + directFuncToAddon_gui_dialogs_extended_progress_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_extended_progress_new_dialog_v1 = + kodi_gui_dialogs_extended_progress_new_dialog_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_delete_dialog_v1 = + kodi_gui_dialogs_extended_progress_delete_dialog_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_get_title_v1 = + kodi_gui_dialogs_extended_progress_get_title_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_set_title_v1 = + kodi_gui_dialogs_extended_progress_set_title_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_get_text_v1 = + kodi_gui_dialogs_extended_progress_get_text_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_set_text_v1 = + kodi_gui_dialogs_extended_progress_set_text_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_is_finished_v1 = + kodi_gui_dialogs_extended_progress_is_finished_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_mark_finished_v1 = + kodi_gui_dialogs_extended_progress_mark_finished_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_get_percentage_v1 = + kodi_gui_dialogs_extended_progress_get_percentage_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_set_percentage_v1 = + kodi_gui_dialogs_extended_progress_set_percentage_v1; + ifcToKodi->kodi_gui_dialogs_extended_progress_set_progress_v1 = + kodi_gui_dialogs_extended_progress_set_progress_v1; +} + +bool CHdl_kodi_gui_dialogs_extended_progress_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_extended_progress_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_extended_progress_new_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog(const char* title) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_new_dialog_v1 t = in.get().as(); + const std::string& title = std::get<0>(t); + KODI_GUI_HANDLE auto_gen_ret = + kodi_gui_dialogs_extended_progress_new_dialog_v1(this, title.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_extended_progress_new_dialog_v1( + PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_delete_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_delete_dialog_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_dialogs_extended_progress_delete_dialog_v1(this, handle); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_get_title_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_title(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_get_title_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_dialogs_extended_progress_get_title_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_extended_progress_get_title_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_set_title_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_title(KODI_GUI_HANDLE handle, const char* title) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_set_title_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& title = std::get<1>(t); + kodi_gui_dialogs_extended_progress_set_title_v1(this, handle, title.c_str()); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_get_text_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_text(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_get_text_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_dialogs_extended_progress_get_text_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_extended_progress_get_text_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_set_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_text(KODI_GUI_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_set_text_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& text = std::get<1>(t); + kodi_gui_dialogs_extended_progress_set_text_v1(this, handle, text.c_str()); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_is_finished_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_extended_progress_is_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_is_finished_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_dialogs_extended_progress_is_finished_v1(this, handle); + msgpack::pack(out, + msgParent_OUT_kodi_gui_dialogs_extended_progress_is_finished_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_mark_finished_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_mark_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_mark_finished_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_dialogs_extended_progress_mark_finished_v1(this, handle); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_get_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_dialogs_extended_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_get_percentage_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float auto_gen_ret = kodi_gui_dialogs_extended_progress_get_percentage_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_extended_progress_get_percentage_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_set_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_percentage(KODI_GUI_HANDLE handle, float percentage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_set_percentage_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + float percentage = std::get<1>(t); + kodi_gui_dialogs_extended_progress_set_percentage_v1(this, handle, percentage); + return true; + } + case funcParent_kodi_gui_dialogs_extended_progress_set_progress_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_progress(KODI_GUI_HANDLE handle, int currentItem, int itemCount) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_extended_progress_set_progress_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int currentItem = std::get<1>(t); + int itemCount = std::get<2>(t); + kodi_gui_dialogs_extended_progress_set_progress_v1(this, handle, currentItem, itemCount); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_extended_progress_h::{}: addon called with unknown function " + "id '{}' on group 'gui_dialogs_extended_progress_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +KODI_GUI_HANDLE CHdl_kodi_gui_dialogs_extended_progress_h:: + kodi_gui_dialogs_extended_progress_new_dialog_v1(void* thisClassHdl, const char* title) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + // setup the progress dialog + CGUIDialogExtendedProgressBar* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_EXT_PROGRESS); + if (!dialog) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_extended_progress_h::{} - invalid handler data , " + "dialog='{}') on addon '{}'", + __func__, static_cast(dialog), thisClass->m_process->GetAddonID()); + return nullptr; + } + + CGUIDialogProgressBarHandle* dlgProgressHandle = dialog->GetHandle(title); + return dlgProgressHandle; + + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_delete_dialog_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->MarkFinished(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_get_title_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->Title().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_set_title_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, const char* title) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetTitle(title); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_get_text_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return strdup(static_cast(handle)->Text().c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_set_text_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetText(text); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_is_finished_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->IsFinished(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_mark_finished_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->MarkFinished(); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_dialogs_extended_progress_h:: + kodi_gui_dialogs_extended_progress_get_percentage_v1(void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->Percentage(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h:: + kodi_gui_dialogs_extended_progress_set_percentage_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + float percentage) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetPercentage(percentage); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_extended_progress_h::kodi_gui_dialogs_extended_progress_set_progress_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, int currentItem, int itemCount) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetProgress(currentItem, itemCount); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/extended_progress.h b/xbmc/addons/interface/api/gui/dialogs/extended_progress.h new file mode 100644 index 0000000000000..76a4b3caccf9a --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/extended_progress.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_extended_progress_h; +struct directFuncToKodi_gui_dialogs_extended_progress_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_extended_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_extended_progress_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_extended_progress_h* ifcToKodi, + directFuncToAddon_gui_dialogs_extended_progress_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog_v1( + void* thisClassHdl, const char* title); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_delete_dialog_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static char* kodi_gui_dialogs_extended_progress_get_title_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_set_title_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, const char* title); // Added with API 1 + + static char* kodi_gui_dialogs_extended_progress_get_text_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_set_text_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + const char* text); // Added with API 1 + + static bool kodi_gui_dialogs_extended_progress_is_finished_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_mark_finished_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static float kodi_gui_dialogs_extended_progress_get_percentage_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_set_percentage_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, float percentage); // Added with API 1 + + static void kodi_gui_dialogs_extended_progress_set_progress_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + int currentItem, + int itemCount); // Added with API 1 + + + directFuncToAddon_gui_dialogs_extended_progress_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/filebrowser.cpp b/xbmc/addons/interface/api/gui/dialogs/filebrowser.cpp new file mode 100644 index 0000000000000..758010475c494 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/filebrowser.cpp @@ -0,0 +1,545 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "filebrowser.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "URL.h" +#include "dialogs/GUIDialogFileBrowser.h" +#include "settings/MediaSourceSettings.h" +#include "storage/MediaManager.h" +#include "utils/URIUtils.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +namespace +{ + +void GetVECShares(VECSOURCES& vecShares, const std::string& strShares, const std::string& strPath) +{ + std::size_t found; + found = strShares.find("local"); + if (found != std::string::npos) + CServiceBroker::GetMediaManager().GetLocalDrives(vecShares); + found = strShares.find("network"); + if (found != std::string::npos) + CServiceBroker::GetMediaManager().GetNetworkLocations(vecShares); + found = strShares.find("removable"); + if (found != std::string::npos) + CServiceBroker::GetMediaManager().GetRemovableDrives(vecShares); + found = strShares.find("programs"); + if (found != std::string::npos) + { + VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("programs"); + if (sources != nullptr) + vecShares.insert(vecShares.end(), sources->begin(), sources->end()); + } + found = strShares.find("files"); + if (found != std::string::npos) + { + VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("files"); + if (sources != nullptr) + vecShares.insert(vecShares.end(), sources->begin(), sources->end()); + } + found = strShares.find("music"); + if (found != std::string::npos) + { + VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("music"); + if (sources != nullptr) + vecShares.insert(vecShares.end(), sources->begin(), sources->end()); + } + found = strShares.find("video"); + if (found != std::string::npos) + { + VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("video"); + if (sources != nullptr) + vecShares.insert(vecShares.end(), sources->begin(), sources->end()); + } + found = strShares.find("pictures"); + if (found != std::string::npos) + { + VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("pictures"); + if (sources != nullptr) + vecShares.insert(vecShares.end(), sources->begin(), sources->end()); + } + + if (vecShares.empty()) + { + CMediaSource share; + std::string basePath = strPath; + std::string tempPath; + while (URIUtils::GetParentPath(basePath, tempPath)) + basePath = tempPath; + share.strPath = basePath; + // don't include the user details in the share name + CURL url(share.strPath); + share.strName = url.GetWithoutUserDetails(); + vecShares.push_back(share); + } +} + +} /* namespace */ + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_filebrowser_h::InitDirect( + directFuncToKodi_gui_dialogs_filebrowser_h* ifcToKodi, + directFuncToAddon_gui_dialogs_filebrowser_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_directory_v1 = + kodi_gui_dialogs_file_browser_show_and_get_directory_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_file_v1 = + kodi_gui_dialogs_file_browser_show_and_get_file_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1 = + kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_file_list_v1 = + kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_source_v1 = + kodi_gui_dialogs_file_browser_show_and_get_source_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_image_v1 = + kodi_gui_dialogs_file_browser_show_and_get_image_v1; + ifcToKodi->kodi_gui_dialogs_file_browser_show_and_get_image_list_v1 = + kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; + // Unused "kodi_gui_dialogs_file_browser_clear_file_list", done only in addon lib +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_filebrowser_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_directory_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_directory( const char* shares, const char* heading, const char* path_in, char** path_out, bool write_only) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_directory_v1 t = + in.get().as(); + const std::string& shares = std::get<0>(t); + const std::string& heading = std::get<1>(t); + const std::string& path_in = std::get<2>(t); + char* path_out = nullptr; + bool write_only = std::get<3>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + this, shares.c_str(), heading.c_str(), path_in.c_str(), &path_out, write_only); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + auto_gen_ret, path_out ? path_out : "")); + if (path_out) + free(path_out); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file(const char* shares, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_v1 t = + in.get().as(); + const std::string& shares = std::get<0>(t); + const std::string& mask = std::get<1>(t); + const std::string& heading = std::get<2>(t); + const std::string& path_in = std::get<3>(t); + char* path_out = nullptr; + bool use_thumbs = std::get<4>(t); + bool use_file_directories = std::get<5>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_file_v1( + this, shares.c_str(), mask.c_str(), heading.c_str(), path_in.c_str(), &path_out, + use_thumbs, use_file_directories); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_v1( + auto_gen_ret, path_out ? path_out : "")); + if (path_out) + free(path_out); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( const char* directory, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories, bool single_list) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1 t = + in.get().as(); + const std::string& directory = std::get<0>(t); + const std::string& mask = std::get<1>(t); + const std::string& heading = std::get<2>(t); + const std::string& path_in = std::get<3>(t); + char* path_out = nullptr; + bool use_thumbs = std::get<4>(t); + bool use_file_directories = std::get<5>(t); + bool single_list = std::get<6>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1( + this, directory.c_str(), mask.c_str(), heading.c_str(), path_in.c_str(), &path_out, + use_thumbs, use_file_directories, single_list); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1( + auto_gen_ret, path_out ? path_out : "")); + if (path_out) + free(path_out); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_list( const char* shares, const char* mask, const char* heading, char*** file_list, size_t* entries, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1 t = + in.get().as(); + const std::string& shares = std::get<0>(t); + const std::string& mask = std::get<1>(t); + const std::string& heading = std::get<2>(t); + char** file_list = nullptr; + size_t entries = std::get<3>(t); + bool use_thumbs = std::get<4>(t); + bool use_file_directories = std::get<5>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + this, shares.c_str(), mask.c_str(), heading.c_str(), &file_list, &entries, use_thumbs, + use_file_directories); + std::vector cpp_file_list; + cpp_file_list.reserve(entries); + if (file_list) + { + for (size_t i = 0; i < entries; ++i) + { + if (file_list[i]) + { + cpp_file_list.emplace_back(file_list[i]); + free(file_list[i]); + } + else + { + cpp_file_list.emplace_back(""); + } + } + free(file_list); + } + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + auto_gen_ret, cpp_file_list, entries)); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_source_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_source( const char* path_in, char** path_out, bool allow_network_shares, const char* additional_share, const char* type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_source_v1 t = + in.get().as(); + const std::string& path_in = std::get<0>(t); + char* path_out = nullptr; + bool allow_network_shares = std::get<1>(t); + const std::string& additional_share = std::get<2>(t); + const std::string& type = std::get<3>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_source_v1( + this, path_in.c_str(), &path_out, allow_network_shares, additional_share.c_str(), + type.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_source_v1( + auto_gen_ret, path_out ? path_out : "")); + if (path_out) + free(path_out); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image(const char* shares, const char* heading, const char* path_in, char** path_out) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_v1 t = + in.get().as(); + const std::string& shares = std::get<0>(t); + const std::string& heading = std::get<1>(t); + const std::string& path_in = std::get<2>(t); + char* path_out = nullptr; + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_image_v1( + this, shares.c_str(), heading.c_str(), path_in.c_str(), &path_out); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_v1( + auto_gen_ret, path_out ? path_out : "")); + if (path_out) + free(path_out); + return true; + } + case funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image_list(const char* shares, const char* heading, char*** file_list, size_t* entries) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1 t = + in.get().as(); + const std::string& shares = std::get<0>(t); + const std::string& heading = std::get<1>(t); + char** file_list = nullptr; + size_t entries = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + this, shares.c_str(), heading.c_str(), &file_list, &entries); + std::vector cpp_file_list; + cpp_file_list.reserve(entries); + if (file_list) + { + for (size_t i = 0; i < entries; ++i) + { + if (file_list[i]) + { + cpp_file_list.emplace_back(file_list[i]); + free(file_list[i]); + } + else + { + cpp_file_list.emplace_back(""); + } + } + free(file_list); + } + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + auto_gen_ret, cpp_file_list, entries)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_filebrowser_h::{}: addon called with unknown function id " + "'{}' on group 'gui_dialogs_filebrowser_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + void* thisClassHdl, + const char* shares, + const char* heading, + const char* path_in, + char** path_out, + bool write_only) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strPath = path_in; + + VECSOURCES vecShares; + GetVECShares(vecShares, shares, strPath); + bool bRet = CGUIDialogFileBrowser::ShowAndGetDirectory(vecShares, heading, strPath, write_only); + if (bRet) + *path_out = strdup(strPath.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_file_v1( + void* thisClassHdl, + const char* shares, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strPath = path_in; + + VECSOURCES vecShares; + GetVECShares(vecShares, shares, strPath); + bool bRet = CGUIDialogFileBrowser::ShowAndGetFile(vecShares, mask, heading, strPath, use_thumbs, + use_file_directories); + if (bRet) + *path_out = strdup(strPath.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h:: + kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1(void* thisClassHdl, + const char* directory, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories, + bool single_list) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strPath = path_in; + bool bRet = CGUIDialogFileBrowser::ShowAndGetFile(directory, mask, heading, strPath, use_thumbs, + use_file_directories, single_list); + if (bRet) + *path_out = strdup(strPath.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + void* thisClassHdl, + const char* shares, + const char* mask, + const char* heading, + char*** file_list, + size_t* entries, + bool use_thumbs, + bool use_file_directories) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + VECSOURCES vecShares; + GetVECShares(vecShares, shares, ""); + + std::vector pathsInt; + bool bRet = CGUIDialogFileBrowser::ShowAndGetFileList(vecShares, mask, heading, pathsInt, + use_thumbs, use_file_directories); + if (bRet) + { + *entries = pathsInt.size(); + *file_list = static_cast(malloc(*entries * sizeof(char*))); + for (unsigned int i = 0; i < *entries; ++i) + (*file_list)[i] = strdup(pathsInt[i].c_str()); + } + else + *entries = 0; + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_source_v1( + void* thisClassHdl, + const char* path_in, + char** path_out, + bool allow_network_shares, + const char* additional_share, + const char* type) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strPath = path_in; + + VECSOURCES vecShares; + if (additional_share) + GetVECShares(vecShares, additional_share, strPath); + bool bRet = + CGUIDialogFileBrowser::ShowAndGetSource(strPath, allow_network_shares, &vecShares, type); + if (bRet) + *path_out = strdup(strPath.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_image_v1( + void* thisClassHdl, + const char* shares, + const char* heading, + const char* path_in, + char** path_out) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strPath = path_in; + + VECSOURCES vecShares; + GetVECShares(vecShares, shares, strPath); + bool bRet = CGUIDialogFileBrowser::ShowAndGetImage(vecShares, heading, strPath); + if (bRet) + *path_out = strdup(strPath.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_filebrowser_h::kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + void* thisClassHdl, const char* shares, const char* heading, char*** file_list, size_t* entries) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + VECSOURCES vecShares; + GetVECShares(vecShares, shares, ""); + + std::vector pathsInt; + bool bRet = CGUIDialogFileBrowser::ShowAndGetImageList(vecShares, heading, pathsInt); + if (bRet) + { + *entries = pathsInt.size(); + *file_list = static_cast(malloc(*entries * sizeof(char*))); + for (unsigned int i = 0; i < *entries; ++i) + (*file_list)[i] = strdup(pathsInt[i].c_str()); + } + else + *entries = 0; + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/filebrowser.h b/xbmc/addons/interface/api/gui/dialogs/filebrowser.h new file mode 100644 index 0000000000000..deee948ae0839 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/filebrowser.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_filebrowser_h; +struct directFuncToKodi_gui_dialogs_filebrowser_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_filebrowser_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_filebrowser_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_filebrowser_h* ifcToKodi, + directFuncToAddon_gui_dialogs_filebrowser_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + void* thisClassHdl, + const char* shares, + const char* heading, + const char* path_in, + char** path_out, + bool write_only); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_file_v1( + void* thisClassHdl, + const char* shares, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1( + void* thisClassHdl, + const char* directory, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories, + bool single_list); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + void* thisClassHdl, + const char* shares, + const char* mask, + const char* heading, + char*** file_list, + size_t* entries, + bool use_thumbs, + bool use_file_directories); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_source_v1( + void* thisClassHdl, + const char* path_in, + char** path_out, + bool allow_network_shares, + const char* additional_share, + const char* type); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_image_v1( + void* thisClassHdl, + const char* shares, + const char* heading, + const char* path_in, + char** path_out); // Added with API 1 + + static bool kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + void* thisClassHdl, + const char* shares, + const char* heading, + char*** file_list, + size_t* entries); // Added with API 1 + + + directFuncToAddon_gui_dialogs_filebrowser_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/keyboard.cpp b/xbmc/addons/interface/api/gui/dialogs/keyboard.cpp new file mode 100644 index 0000000000000..66e6512bd49a2 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/keyboard.cpp @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "keyboard.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "guilib/GUIKeyboardFactory.h" +#include "utils/Variant.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_keyboard_h::InitDirect( + directFuncToKodi_gui_dialogs_keyboard_h* ifcToKodi, + directFuncToAddon_gui_dialogs_keyboard_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1 = + kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_get_input_v1 = + kodi_gui_dialogs_keyboard_show_and_get_input_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1 = + kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_get_new_password_v1 = + kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1 = + kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1 = + kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_verify_password_v1 = + kodi_gui_dialogs_keyboard_show_and_verify_password_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_show_and_get_filter_v1 = + kodi_gui_dialogs_keyboard_show_and_get_filter_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1 = + kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; + ifcToKodi->kodi_gui_dialogs_keyboard_is_keyboard_activated_v1 = + kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_keyboard_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head( const char* text_in, char** text_out, const char* heading, bool allow_empty_result, bool hidden_input, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1 t = + in.get().as(); + const std::string& text_in = std::get<0>(t); + char* text_out = nullptr; + const std::string& heading = std::get<1>(t); + bool allow_empty_result = std::get<2>(t); + bool hidden_input = std::get<3>(t); + unsigned int auto_close_ms = std::get<4>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + this, text_in.c_str(), &text_out, heading.c_str(), allow_empty_result, hidden_input, + auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + auto_gen_ret, text_out ? text_out : "")); + if (text_out) + free(text_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input(const char* text_in, char** text_out, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_v1 t = in.get().as(); + const std::string& text_in = std::get<0>(t); + char* text_out = nullptr; + bool allow_empty_result = std::get<1>(t); + unsigned int auto_close_ms = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_get_input_v1( + this, text_in.c_str(), &text_out, allow_empty_result, auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_v1( + auto_gen_ret, text_out ? text_out : "")); + if (text_out) + free(text_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( const char* password_in, char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1 t = + in.get().as(); + const std::string& password_in = std::get<0>(t); + char* password_out = nullptr; + const std::string& heading = std::get<1>(t); + bool allow_empty_result = std::get<2>(t); + unsigned int auto_close_ms = std::get<3>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1( + this, password_in.c_str(), &password_out, heading.c_str(), allow_empty_result, + auto_close_ms); + msgpack::pack(out, + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1( + auto_gen_ret, password_out ? password_out : "")); + if (password_out) + free(password_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password( const char* password_in, char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1 t = + in.get().as(); + const std::string& password_in = std::get<0>(t); + char* password_out = nullptr; + unsigned int auto_close_ms = std::get<1>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + this, password_in.c_str(), &password_out, auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + auto_gen_ret, password_out ? password_out : "")); + if (password_out) + free(password_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1 t = + in.get().as(); + char* password_out = nullptr; + const std::string& heading = std::get<0>(t); + bool allow_empty_result = std::get<1>(t); + unsigned int auto_close_ms = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1( + this, &password_out, heading.c_str(), allow_empty_result, auto_close_ms); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1( + auto_gen_ret, password_out ? password_out : "")); + if (password_out) + free(password_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password( char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1 t = + in.get().as(); + char* password_out = nullptr; + unsigned int auto_close_ms = std::get<0>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1( + this, &password_out, auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1( + auto_gen_ret, password_out ? password_out : "")); + if (password_out) + free(password_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_verify_password_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_keyboard_show_and_verify_password(const char* password_in, char** password_out, const char* heading, int retries, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_password_v1 t = + in.get().as(); + const std::string& password_in = std::get<0>(t); + char* password_out = nullptr; + const std::string& heading = std::get<1>(t); + int retries = std::get<2>(t); + unsigned int auto_close_ms = std::get<3>(t); + int auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + this, password_in.c_str(), &password_out, heading.c_str(), retries, auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + auto_gen_ret, password_out ? password_out : "")); + if (password_out) + free(password_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_show_and_get_filter_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_filter(const char* text_in, char** text_out, bool searching, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_filter_v1 t = in.get().as(); + const std::string& text_in = std::get<0>(t); + char* text_out = nullptr; + bool searching = std::get<1>(t); + unsigned int auto_close_ms = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + this, text_in.c_str(), &text_out, searching, auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + auto_gen_ret, text_out ? text_out : "")); + if (text_out) + free(text_out); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(const char* text, bool close_keyboard) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1 t = + in.get().as(); + const std::string& text = std::get<0>(t); + bool close_keyboard = std::get<1>(t); + bool auto_gen_ret = kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + this, text.c_str(), close_keyboard); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_is_keyboard_activated() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ + bool auto_gen_ret = kodi_gui_dialogs_keyboard_is_keyboard_activated_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_keyboard_h::{}: addon called with unknown function id '{}' " + "on group 'gui_dialogs_keyboard_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + const char* heading, + bool allow_empty_result, + bool hidden_input, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = text_in; + bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, CVariant{heading}, allow_empty_result, + hidden_input, auto_close_ms); + if (bRet) + *text_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_get_input_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + bool allow_empty_result, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = text_in; + bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, allow_empty_result, auto_close_ms); + if (bRet) + *text_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h:: + kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1(void* thisClassHdl, + const char* password_in, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = password_in; + bool bRet = + CGUIKeyboardFactory::ShowAndGetNewPassword(str, heading, allow_empty_result, auto_close_ms); + if (bRet) + *password_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + void* thisClassHdl, const char* password_in, char** password_out, unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = password_in; + bool bRet = CGUIKeyboardFactory::ShowAndGetNewPassword(str, auto_close_ms); + if (bRet) + *password_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h:: + kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1(void* thisClassHdl, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str; + bool bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, heading, allow_empty_result, + auto_close_ms); + if (bRet) + *password_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1( + void* thisClassHdl, char** password_out, unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str; + bool bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, auto_close_ms); + if (bRet) + *password_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + void* thisClassHdl, + const char* password_in, + char** password_out, + const char* heading, + int retries, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = password_in; + int iRet = CGUIKeyboardFactory::ShowAndVerifyPassword(str, heading, retries, auto_close_ms); + if (iRet) + *password_out = strdup(str.c_str()); + return iRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + bool searching, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = text_in; + bool bRet = CGUIKeyboardFactory::ShowAndGetFilter(str, searching, auto_close_ms); + if (bRet) + *text_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + void* thisClassHdl, const char* text, bool close_keyboard) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CGUIKeyboardFactory::SendTextToActiveKeyboard(text, close_keyboard); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_keyboard_h::kodi_gui_dialogs_keyboard_is_keyboard_activated_v1( + void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CGUIKeyboardFactory::isKeyboardActivated(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/keyboard.h b/xbmc/addons/interface/api/gui/dialogs/keyboard.h new file mode 100644 index 0000000000000..752d84fffd775 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/keyboard.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_keyboard_h; +struct directFuncToKodi_gui_dialogs_keyboard_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_keyboard_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_keyboard_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_keyboard_h* ifcToKodi, + directFuncToAddon_gui_dialogs_keyboard_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + const char* heading, + bool allow_empty_result, + bool hidden_input, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_get_input_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + bool allow_empty_result, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1( + void* thisClassHdl, + const char* password_in, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + void* thisClassHdl, + const char* password_in, + char** password_out, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1( + void* thisClassHdl, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1( + void* thisClassHdl, char** password_out, unsigned int auto_close_ms); // Added with API 1 + + static int kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + void* thisClassHdl, + const char* password_in, + char** password_out, + const char* heading, + int retries, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + void* thisClassHdl, + const char* text_in, + char** text_out, + bool searching, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + void* thisClassHdl, const char* text, bool close_keyboard); // Added with API 1 + + static bool kodi_gui_dialogs_keyboard_is_keyboard_activated_v1( + void* thisClassHdl); // Added with API 1 + + + directFuncToAddon_gui_dialogs_keyboard_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/numeric.cpp b/xbmc/addons/interface/api/gui/dialogs/numeric.cpp new file mode 100644 index 0000000000000..d89c29ab227c6 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/numeric.cpp @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "numeric.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "XBDateTime.h" +#include "dialogs/GUIDialogNumeric.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_numeric_h::InitDirect( + directFuncToKodi_gui_dialogs_numeric_h* ifcToKodi, + directFuncToAddon_gui_dialogs_numeric_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_verify_new_password_v1 = + kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_verify_password_v1 = + kodi_gui_dialogs_numeric_show_and_verify_password_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_verify_input_v1 = + kodi_gui_dialogs_numeric_show_and_verify_input_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_get_time_v1 = + kodi_gui_dialogs_numeric_show_and_get_time_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_get_date_v1 = + kodi_gui_dialogs_numeric_show_and_get_date_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_get_ip_address_v1 = + kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_get_number_v1 = + kodi_gui_dialogs_numeric_show_and_get_number_v1; + ifcToKodi->kodi_gui_dialogs_numeric_show_and_get_seconds_v1 = + kodi_gui_dialogs_numeric_show_and_get_seconds_v1; +} + +bool CHdl_kodi_gui_dialogs_numeric_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_numeric_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_new_password(char** password) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1 t = + in.get().as(); + char* password = nullptr; + bool auto_gen_ret = kodi_gui_dialogs_numeric_show_and_verify_new_password_v1(this, &password); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1( + auto_gen_ret, password ? password : "")); + if (password) + free(password); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_verify_password_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_numeric_show_and_verify_password(const char* password, const char* heading, int retries) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_password_v1 t = + in.get().as(); + const std::string& password = std::get<0>(t); + const std::string& heading = std::get<1>(t); + int retries = std::get<2>(t); + int auto_gen_ret = kodi_gui_dialogs_numeric_show_and_verify_password_v1( + this, password.c_str(), heading.c_str(), retries); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_password_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_verify_input_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_input(const char* verify_in, char** verify_out, const char* heading, bool verify_input) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_input_v1 t = + in.get().as(); + const std::string& verify_in = std::get<0>(t); + char* verify_out = nullptr; + const std::string& heading = std::get<1>(t); + bool verify_input = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_numeric_show_and_verify_input_v1( + this, verify_in.c_str(), &verify_out, heading.c_str(), verify_input); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_input_v1( + auto_gen_ret, verify_out ? verify_out : "")); + if (verify_out) + free(verify_out); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_get_time_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_time(struct tm* time, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1 t = in.get().as(); + tm time; + std::get<0>(t).SetCStructure(&time); + const std::string& heading = std::get<1>(t); + bool auto_gen_ret = + kodi_gui_dialogs_numeric_show_and_get_time_v1(this, &time, heading.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_time_v1(auto_gen_ret, &time)); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_get_date_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_date(struct tm* date, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1 t = in.get().as(); + tm date; + std::get<0>(t).SetCStructure(&date); + const std::string& heading = std::get<1>(t); + bool auto_gen_ret = + kodi_gui_dialogs_numeric_show_and_get_date_v1(this, &date, heading.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_date_v1(auto_gen_ret, &date)); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_ip_address(const char* ip_address_in, char** ip_address_out, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1 t = + in.get().as(); + const std::string& ip_address_in = std::get<0>(t); + char* ip_address_out = nullptr; + const std::string& heading = std::get<1>(t); + bool auto_gen_ret = kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + this, ip_address_in.c_str(), &ip_address_out, heading.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + auto_gen_ret, ip_address_out ? ip_address_out : "")); + if (ip_address_out) + free(ip_address_out); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_get_number_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_number(const char* number_in, char** number_out, const char* heading, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_number_v1 t = in.get().as(); + const std::string& number_in = std::get<0>(t); + char* number_out = nullptr; + const std::string& heading = std::get<1>(t); + unsigned int auto_close_ms = std::get<2>(t); + bool auto_gen_ret = kodi_gui_dialogs_numeric_show_and_get_number_v1( + this, number_in.c_str(), &number_out, heading.c_str(), auto_close_ms); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_number_v1( + auto_gen_ret, number_out ? number_out : "")); + if (number_out) + free(number_out); + return true; + } + case funcParent_kodi_gui_dialogs_numeric_show_and_get_seconds_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_seconds(const char* time_in, char** time_out, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_seconds_v1 t = in.get().as(); + const std::string& time_in = std::get<0>(t); + char* time_out = nullptr; + const std::string& heading = std::get<1>(t); + bool auto_gen_ret = kodi_gui_dialogs_numeric_show_and_get_seconds_v1( + this, time_in.c_str(), &time_out, heading.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_seconds_v1( + auto_gen_ret, time_out ? time_out : "")); + if (time_out) + free(time_out); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_numeric_h::{}: addon called with unknown function id '{}' " + "on group 'gui_dialogs_numeric_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_verify_new_password_v1( + void* thisClassHdl, char** password) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str; + bool bRet = CGUIDialogNumeric::ShowAndVerifyNewPassword(str); + if (bRet) + *password = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_verify_password_v1( + void* thisClassHdl, const char* password, const char* heading, int retries) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + std::string pw(password); + return CGUIDialogNumeric::ShowAndVerifyPassword(pw, heading, retries); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_verify_input_v1( + void* thisClassHdl, + const char* verify_in, + char** verify_out, + const char* heading, + bool verify_input) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = verify_in; + if (CGUIDialogNumeric::ShowAndVerifyInput(str, heading, verify_input) == + InputVerificationResult::SUCCESS) + { + *verify_out = strdup(str.c_str()); + return true; + } + return false; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_get_time_v1( + void* thisClassHdl, struct tm* time, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + KODI::TIME::SystemTime systemTime; + CDateTime dateTime(*time); + dateTime.GetAsSystemTime(systemTime); + if (CGUIDialogNumeric::ShowAndGetTime(systemTime, heading)) + { + dateTime = systemTime; + dateTime.GetAsTm(*time); + return true; + } + return false; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_get_date_v1( + void* thisClassHdl, struct tm* date, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + KODI::TIME::SystemTime systemTime; + CDateTime dateTime(*date); + dateTime.GetAsSystemTime(systemTime); + if (CGUIDialogNumeric::ShowAndGetDate(systemTime, heading)) + { + dateTime = systemTime; + dateTime.GetAsTm(*date); + return true; + } + return false; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + void* thisClassHdl, const char* ip_address_in, char** ip_address_out, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string strIP = ip_address_in; + bool bRet = CGUIDialogNumeric::ShowAndGetIPAddress(strIP, heading); + if (bRet) + *ip_address_out = strdup(strIP.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_get_number_v1( + void* thisClassHdl, + const char* number_in, + char** number_out, + const char* heading, + unsigned int auto_close_ms) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = number_in; + bool bRet = CGUIDialogNumeric::ShowAndGetNumber(str, heading, auto_close_ms); + if (bRet) + *number_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_numeric_h::kodi_gui_dialogs_numeric_show_and_get_seconds_v1( + void* thisClassHdl, const char* time_in, char** time_out, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + std::string str = time_in; + bool bRet = CGUIDialogNumeric::ShowAndGetSeconds(str, heading); + if (bRet) + *time_out = strdup(str.c_str()); + return bRet; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/numeric.h b/xbmc/addons/interface/api/gui/dialogs/numeric.h new file mode 100644 index 0000000000000..5e39760529e24 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/numeric.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_numeric_h; +struct directFuncToKodi_gui_dialogs_numeric_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_numeric_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_numeric_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_numeric_h* ifcToKodi, + directFuncToAddon_gui_dialogs_numeric_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_gui_dialogs_numeric_show_and_verify_new_password_v1( + void* thisClassHdl, char** password); // Added with API 1 + + static int kodi_gui_dialogs_numeric_show_and_verify_password_v1(void* thisClassHdl, + const char* password, + const char* heading, + int retries); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_verify_input_v1( + void* thisClassHdl, + const char* verify_in, + char** verify_out, + const char* heading, + bool verify_input); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_get_time_v1( + void* thisClassHdl, struct tm* time, const char* heading); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_get_date_v1( + void* thisClassHdl, struct tm* date, const char* heading); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + void* thisClassHdl, + const char* ip_address_in, + char** ip_address_out, + const char* heading); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_get_number_v1( + void* thisClassHdl, + const char* number_in, + char** number_out, + const char* heading, + unsigned int auto_close_ms); // Added with API 1 + + static bool kodi_gui_dialogs_numeric_show_and_get_seconds_v1( + void* thisClassHdl, + const char* time_in, + char** time_out, + const char* heading); // Added with API 1 + + + directFuncToAddon_gui_dialogs_numeric_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/ok.cpp b/xbmc/addons/interface/api/gui/dialogs/ok.cpp new file mode 100644 index 0000000000000..20004565568a6 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/ok.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "ok.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "messaging/helpers/DialogOKHelper.h" +#include "utils/Variant.h" + +using namespace KODI::MESSAGING; + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_ok_h::InitDirect(directFuncToKodi_gui_dialogs_ok_h* ifcToKodi, + directFuncToAddon_gui_dialogs_ok_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_ok_show_and_get_input_single_text_v1 = + kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; + ifcToKodi->kodi_gui_dialogs_ok_show_and_get_input_line_text_v1 = + kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; +} + +bool CHdl_kodi_gui_dialogs_ok_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_ok_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_single_text(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1 t = + in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& text = std::get<1>(t); + kodi_gui_dialogs_ok_show_and_get_input_single_text_v1(this, heading.c_str(), text.c_str()); + return true; + } + case funcParent_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1 t = + in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& line0 = std::get<1>(t); + const std::string& line1 = std::get<2>(t); + const std::string& line2 = std::get<3>(t); + kodi_gui_dialogs_ok_show_and_get_input_line_text_v1(this, heading.c_str(), line0.c_str(), + line1.c_str(), line2.c_str()); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_ok_h::{}: addon called with unknown function id '{}' on " + "group 'gui_dialogs_ok_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_dialogs_ok_h::kodi_gui_dialogs_ok_show_and_get_input_single_text_v1( + void* thisClassHdl, const char* heading, const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + HELPERS::ShowOKDialogText(CVariant{heading}, CVariant{text}); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_ok_h::kodi_gui_dialogs_ok_show_and_get_input_line_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + HELPERS::ShowOKDialogLines(CVariant{heading}, CVariant{line0}, CVariant{line1}, CVariant{line2}); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/ok.h b/xbmc/addons/interface/api/gui/dialogs/ok.h new file mode 100644 index 0000000000000..09745c66d86a3 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/ok.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_ok_h; +struct directFuncToKodi_gui_dialogs_ok_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_ok_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_ok_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_ok_h* ifcToKodi, + directFuncToAddon_gui_dialogs_ok_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_dialogs_ok_show_and_get_input_single_text_v1( + void* thisClassHdl, const char* heading, const char* text); // Added with API 1 + + static void kodi_gui_dialogs_ok_show_and_get_input_line_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2); // Added with API 1 + + + directFuncToAddon_gui_dialogs_ok_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/progress.cpp b/xbmc/addons/interface/api/gui/dialogs/progress.cpp new file mode 100644 index 0000000000000..47f6fa43362e9 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/progress.cpp @@ -0,0 +1,439 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "progress.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "dialogs/GUIDialogProgress.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "utils/Variant.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_progress_h::InitDirect( + directFuncToKodi_gui_dialogs_progress_h* ifcToKodi, + directFuncToAddon_gui_dialogs_progress_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_progress_new_dialog_v1 = kodi_gui_dialogs_progress_new_dialog_v1; + ifcToKodi->kodi_gui_dialogs_progress_delete_dialog_v1 = + kodi_gui_dialogs_progress_delete_dialog_v1; + ifcToKodi->kodi_gui_dialogs_progress_open_v1 = kodi_gui_dialogs_progress_open_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_heading_v1 = kodi_gui_dialogs_progress_set_heading_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_line_v1 = kodi_gui_dialogs_progress_set_line_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_can_cancel_v1 = + kodi_gui_dialogs_progress_set_can_cancel_v1; + ifcToKodi->kodi_gui_dialogs_progress_is_canceled_v1 = kodi_gui_dialogs_progress_is_canceled_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_percentage_v1 = + kodi_gui_dialogs_progress_set_percentage_v1; + ifcToKodi->kodi_gui_dialogs_progress_get_percentage_v1 = + kodi_gui_dialogs_progress_get_percentage_v1; + ifcToKodi->kodi_gui_dialogs_progress_show_progress_bar_v1 = + kodi_gui_dialogs_progress_show_progress_bar_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_progress_max_v1 = + kodi_gui_dialogs_progress_set_progress_max_v1; + ifcToKodi->kodi_gui_dialogs_progress_set_progress_advance_v1 = + kodi_gui_dialogs_progress_set_progress_advance_v1; + ifcToKodi->kodi_gui_dialogs_progress_abort_v1 = kodi_gui_dialogs_progress_abort_v1; +} + +bool CHdl_kodi_gui_dialogs_progress_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_progress_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_progress_new_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ + KODI_GUI_HANDLE auto_gen_ret = kodi_gui_dialogs_progress_new_dialog_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_gui_dialogs_progress_new_dialog_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_dialogs_progress_delete_dialog_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_delete_dialog_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_dialogs_progress_delete_dialog_v1(this, handle); + return true; + } + case funcParent_kodi_gui_dialogs_progress_open_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_open(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_open_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_dialogs_progress_open_v1(this, handle); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_heading_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_heading(KODI_GUI_HANDLE handle, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_heading_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& heading = std::get<1>(t); + kodi_gui_dialogs_progress_set_heading_v1(this, handle, heading.c_str()); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_line_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_line(KODI_GUI_HANDLE handle, unsigned int line_no, const char* line) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_line_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + unsigned int line_no = std::get<1>(t); + const std::string& line = std::get<2>(t); + kodi_gui_dialogs_progress_set_line_v1(this, handle, line_no, line.c_str()); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_can_cancel_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_can_cancel(KODI_GUI_HANDLE handle, bool can_cancel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_can_cancel_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool can_cancel = std::get<1>(t); + kodi_gui_dialogs_progress_set_can_cancel_v1(this, handle, can_cancel); + return true; + } + case funcParent_kodi_gui_dialogs_progress_is_canceled_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_is_canceled(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_is_canceled_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_dialogs_progress_is_canceled_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_progress_is_canceled_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_percentage(KODI_GUI_HANDLE handle, int percentage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_percentage_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int percentage = std::get<1>(t); + kodi_gui_dialogs_progress_set_percentage_v1(this, handle, percentage); + return true; + } + case funcParent_kodi_gui_dialogs_progress_get_percentage_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_get_percentage_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_dialogs_progress_get_percentage_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_progress_get_percentage_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_progress_show_progress_bar_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_show_progress_bar(KODI_GUI_HANDLE handle, bool on_off) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_show_progress_bar_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool on_off = std::get<1>(t); + kodi_gui_dialogs_progress_show_progress_bar_v1(this, handle, on_off); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_progress_max_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_max(KODI_GUI_HANDLE handle, int max) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_progress_max_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int max = std::get<1>(t); + kodi_gui_dialogs_progress_set_progress_max_v1(this, handle, max); + return true; + } + case funcParent_kodi_gui_dialogs_progress_set_progress_advance_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_advance(KODI_GUI_HANDLE handle, int n_steps) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_set_progress_advance_v1 t = + in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int n_steps = std::get<1>(t); + kodi_gui_dialogs_progress_set_progress_advance_v1(this, handle, n_steps); + return true; + } + case funcParent_kodi_gui_dialogs_progress_abort_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_abort(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_progress_abort_v1 t = in.get().as(); + KODI_GUI_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_dialogs_progress_abort_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_progress_abort_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_progress_h::{}: addon called with unknown function id '{}' " + "on group 'gui_dialogs_progress_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +KODI_GUI_HANDLE CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_new_dialog_v1( + void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + CGUIDialogProgress* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_PROGRESS); + if (!dialog) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_dialogs_progress_h::{} - invalid handler data (dialog='{}') on addon '{}'", + __func__, static_cast(dialog), thisClass->m_process->GetAddonID()); + return nullptr; + } + + return dialog; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_delete_dialog_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->Close(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_open_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->Open(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_heading_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, const char* heading) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetHeading(heading); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_line_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + unsigned int line_no, + const char* line) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetLine(line_no, line); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_can_cancel_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, bool can_cancel) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetCanCancel(can_cancel); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_is_canceled_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->IsCanceled(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_percentage_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, int percentage) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetPercentage(percentage); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_get_percentage_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->GetPercentage(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_show_progress_bar_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, bool on_off) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->ShowProgressBar(on_off); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_progress_max_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, int max) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetProgressMax(max); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_set_progress_advance_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle, int n_steps) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + static_cast(handle)->SetProgressAdvance(n_steps); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_progress_h::kodi_gui_dialogs_progress_abort_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return static_cast(handle)->Abort(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/progress.h b/xbmc/addons/interface/api/gui/dialogs/progress.h new file mode 100644 index 0000000000000..f95cbc1289e0e --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/progress.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_progress_h; +struct directFuncToKodi_gui_dialogs_progress_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_progress_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_progress_h* ifcToKodi, + directFuncToAddon_gui_dialogs_progress_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog_v1( + void* thisClassHdl); // Added with API 1 + + static void kodi_gui_dialogs_progress_delete_dialog_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_progress_open_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_heading_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + const char* heading); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_line_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + unsigned int line_no, + const char* line); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_can_cancel_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + bool can_cancel); // Added with API 1 + + static bool kodi_gui_dialogs_progress_is_canceled_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_percentage_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + int percentage); // Added with API 1 + + static int kodi_gui_dialogs_progress_get_percentage_v1( + void* thisClassHdl, KODI_GUI_HANDLE handle); // Added with API 1 + + static void kodi_gui_dialogs_progress_show_progress_bar_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + bool on_off); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_progress_max_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + int max); // Added with API 1 + + static void kodi_gui_dialogs_progress_set_progress_advance_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle, + int n_steps); // Added with API 1 + + static bool kodi_gui_dialogs_progress_abort_v1(void* thisClassHdl, + KODI_GUI_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_dialogs_progress_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/select.cpp b/xbmc/addons/interface/api/gui/dialogs/select.cpp new file mode 100644 index 0000000000000..a17cc7978a4f7 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/select.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "select.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "dialogs/GUIDialogSelect.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "utils/Variant.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_select_h::InitDirect(directFuncToKodi_gui_dialogs_select_h* ifcToKodi, + directFuncToAddon_gui_dialogs_select_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_select_open_v1 = kodi_gui_dialogs_select_open_v1; + ifcToKodi->kodi_gui_dialogs_select_open_multi_select_v1 = + kodi_gui_dialogs_select_open_multi_select_v1; +} + +bool CHdl_kodi_gui_dialogs_select_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_select_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_select_open_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_select_open(const char* heading, const char* entries[], size_t size, int selected, unsigned int autoclose) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t, int, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_select_open_v1 t = in.get().as(); + const std::string& heading = std::get<0>(t); + const std::vector& cpp_entries = std::get<1>(t); + size_t size = std::get<2>(t); + int selected = std::get<3>(t); + unsigned int autoclose = std::get<4>(t); + + std::vector entries; + entries.reserve(size); + for (size_t i = 0; i < size; ++i) + { + entries.emplace_back(cpp_entries[i].c_str()); + } + assert(cpp_entries.size() == size); + + int auto_gen_ret = kodi_gui_dialogs_select_open_v1(this, heading.c_str(), entries.data(), + size, selected, autoclose); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_select_open_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_select_open_multi_select_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_select_open_multi_select(const char* heading, const char* entryIDs[], const char* entryNames[], uint8_t entriesSelected[], size_t size, unsigned int autoclose) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, std::vector, std::vector, size_t, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgParent_OUT_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_select_open_multi_select_v1 t = in.get().as(); + const std::string& heading = std::get<0>(t); + const std::vector& cpp_entryIDs = std::get<1>(t); + const std::vector& cpp_entryNames = std::get<2>(t); + std::vector& entriesSelected = std::get<3>(t); + size_t size = std::get<4>(t); + unsigned int autoclose = std::get<5>(t); + + std::vector entryIDs; + entryIDs.reserve(size); + for (size_t i = 0; i < size; ++i) + { + entryIDs.emplace_back(cpp_entryIDs[i].c_str()); + } + assert(cpp_entryIDs.size() == size); + + + std::vector entryNames; + entryNames.reserve(size); + for (size_t i = 0; i < size; ++i) + { + entryNames.emplace_back(cpp_entryNames[i].c_str()); + } + assert(cpp_entryNames.size() == size); + + bool auto_gen_ret = kodi_gui_dialogs_select_open_multi_select_v1( + this, heading.c_str(), entryIDs.data(), entryNames.data(), entriesSelected.data(), size, + autoclose); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_select_open_multi_select_v1( + auto_gen_ret, entriesSelected)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_select_h::{}: addon called with unknown function id '{}' on " + "group 'gui_dialogs_select_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +int CHdl_kodi_gui_dialogs_select_h::kodi_gui_dialogs_select_open_v1(void* thisClassHdl, + const char* heading, + const char* entries[], + size_t size, + int selected, + unsigned int autoclose) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIDialogSelect* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_SELECT); + + dialog->Reset(); + dialog->SetHeading(CVariant{heading}); + + for (unsigned int i = 0; i < size; ++i) + dialog->Add(entries[i]); + + if (selected > 0) + dialog->SetSelected(selected); + if (autoclose > 0) + dialog->SetAutoClose(autoclose); + + dialog->Open(); + return dialog->GetSelectedItem(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_select_h::kodi_gui_dialogs_select_open_multi_select_v1( + void* thisClassHdl, + const char* heading, + const char* entryIDs[], + const char* entryNames[], + uint8_t entriesSelected[], + size_t size, + unsigned int autoclose) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIDialogSelect* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_SELECT); + dialog->Reset(); + dialog->SetMultiSelection(true); + dialog->SetHeading(CVariant{heading}); + + std::vector selectedIndexes; + + for (unsigned int i = 0; i < size; ++i) + { + dialog->Add(entryNames[i]); + if (entriesSelected[i]) + selectedIndexes.push_back(i); + } + + dialog->SetSelected(selectedIndexes); + if (autoclose > 0) + dialog->SetAutoClose(autoclose); + + dialog->Open(); + if (dialog->IsConfirmed()) + { + for (unsigned int i = 0; i < size; ++i) + entriesSelected[i] = 0; + + selectedIndexes = dialog->GetSelectedItems(); + + for (unsigned int i = 0; i < selectedIndexes.size(); ++i) + { + if (selectedIndexes[i]) + entriesSelected[selectedIndexes[i]] = 1; + } + } + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/select.h b/xbmc/addons/interface/api/gui/dialogs/select.h new file mode 100644 index 0000000000000..fc303b4db5502 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/select.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_select_h; +struct directFuncToKodi_gui_dialogs_select_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_select_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_select_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_select_h* ifcToKodi, + directFuncToAddon_gui_dialogs_select_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static int kodi_gui_dialogs_select_open_v1(void* thisClassHdl, + const char* heading, + const char* entries[], + size_t size, + int selected, + unsigned int autoclose); // Added with API 1 + + static bool kodi_gui_dialogs_select_open_multi_select_v1( + void* thisClassHdl, + const char* heading, + const char* entryIDs[], + const char* entryNames[], + uint8_t entriesSelected[], + size_t size, + unsigned int autoclose); // Added with API 1 + + + directFuncToAddon_gui_dialogs_select_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/text_viewer.cpp b/xbmc/addons/interface/api/gui/dialogs/text_viewer.cpp new file mode 100644 index 0000000000000..0bf7798a657ea --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/text_viewer.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "text_viewer.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "dialogs/GUIDialogTextViewer.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_text_viewer_h::InitDirect( + directFuncToKodi_gui_dialogs_text_viewer_h* ifcToKodi, + directFuncToAddon_gui_dialogs_text_viewer_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_text_viewer_show_v1 = kodi_gui_dialogs_text_viewer_show_v1; +} + +bool CHdl_kodi_gui_dialogs_text_viewer_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_text_viewer_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_text_viewer_show_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_text_viewer_show(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_text_viewer_show_v1 t = in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& text = std::get<1>(t); + kodi_gui_dialogs_text_viewer_show_v1(this, heading.c_str(), text.c_str()); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_text_viewer_h::{}: addon called with unknown function id " + "'{}' on group 'gui_dialogs_text_viewer_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_dialogs_text_viewer_h::kodi_gui_dialogs_text_viewer_show_v1(void* thisClassHdl, + const char* heading, + const char* text) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIDialogTextViewer* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_TEXT_VIEWER); + if (!heading || !text || !dialog) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_dialogs_text_viewer_h::{} - invalid handler data (heading='{}', text='{}', " + "dialog='{}') on addon '{}'", + __func__, static_cast(heading), static_cast(text), + static_cast(dialog), thisClass->m_process->GetAddonID()); + return; + } + + dialog->SetHeading(heading); + dialog->SetText(text); + dialog->Open(); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/text_viewer.h b/xbmc/addons/interface/api/gui/dialogs/text_viewer.h new file mode 100644 index 0000000000000..b6274da1aae0b --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/text_viewer.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_text_viewer_h; +struct directFuncToKodi_gui_dialogs_text_viewer_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_text_viewer_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_text_viewer_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_text_viewer_h* ifcToKodi, + directFuncToAddon_gui_dialogs_text_viewer_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_dialogs_text_viewer_show_v1(void* thisClassHdl, + const char* heading, + const char* text); // Added with API 1 + + + directFuncToAddon_gui_dialogs_text_viewer_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/yes_no.cpp b/xbmc/addons/interface/api/gui/dialogs/yes_no.cpp new file mode 100644 index 0000000000000..535c73bae9fb4 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/yes_no.cpp @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "yes_no.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "dialogs/GUIDialogYesNo.h" +#include "messaging/helpers/DialogHelper.h" + +using namespace KODI::MESSAGING; +using KODI::MESSAGING::HELPERS::DialogResponse; + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_yes_no_h::InitDirect(directFuncToKodi_gui_dialogs_yes_no_h* ifcToKodi, + directFuncToAddon_gui_dialogs_yes_no_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1 = + kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; + ifcToKodi->kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1 = + kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; + ifcToKodi->kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1 = + kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; +} + +bool CHdl_kodi_gui_dialogs_yes_no_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_dialogs_yes_no_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_single_text(const char* heading, const char* text, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1 t = + in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& text = std::get<1>(t); + bool canceled = std::get<2>(t); + const std::string& noLabel = std::get<3>(t); + const std::string& yesLabel = std::get<4>(t); + bool auto_gen_ret = kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + this, heading.c_str(), text.c_str(), &canceled, noLabel.c_str(), yesLabel.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + auto_gen_ret, canceled)); + return true; + } + case funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1 t = + in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& line0 = std::get<1>(t); + const std::string& line1 = std::get<2>(t); + const std::string& line2 = std::get<3>(t); + const std::string& noLabel = std::get<4>(t); + const std::string& yesLabel = std::get<5>(t); + bool auto_gen_ret = kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1( + this, heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str(), noLabel.c_str(), + yesLabel.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( const char* heading, const char* line0, const char* line1, const char* line2, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1 t = + in.get().as(); + const std::string& heading = std::get<0>(t); + const std::string& line0 = std::get<1>(t); + const std::string& line1 = std::get<2>(t); + const std::string& line2 = std::get<3>(t); + bool canceled = std::get<4>(t); + const std::string& noLabel = std::get<5>(t); + const std::string& yesLabel = std::get<6>(t); + bool auto_gen_ret = kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + this, heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str(), &canceled, + noLabel.c_str(), yesLabel.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + auto_gen_ret, canceled)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_yes_no_h::{}: addon called with unknown function id '{}' on " + "group 'gui_dialogs_yes_no_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_gui_dialogs_yes_no_h::kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + void* thisClassHdl, + const char* heading, + const char* text, + bool* canceled, + const char* noLabel, + const char* yesLabel) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + if (!heading || !text || !canceled || !noLabel || !yesLabel) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_dialogs_yes_no_h::{} - invalid handler data (heading='{}', text='{}', " + "canceled='{}', noLabel='{}', yesLabel='{}') on addon '{}'", + __func__, static_cast(heading), static_cast(text), + static_cast(canceled), static_cast(noLabel), + static_cast(yesLabel), thisClass->m_process->GetAddonID()); + return false; + } + + DialogResponse result = HELPERS::ShowYesNoDialogText(heading, text, noLabel, yesLabel); + *canceled = (result == DialogResponse::CANCELLED); + return (result == DialogResponse::YES); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_yes_no_h::kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2, + const char* noLabel, + const char* yesLabel) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + if (!heading || !line0 || !line1 || !line2 || !noLabel || !yesLabel) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_dialogs_yes_no_h::{} - invalid handler data (heading='{}', line0='{}', " + "line1='{}', line2='{}', " + "noLabel='{}', yesLabel='{}') on addon '{}'", + __func__, static_cast(heading), static_cast(line0), + static_cast(line1), static_cast(line2), + static_cast(noLabel), static_cast(yesLabel), + thisClass->m_process->GetAddonID()); + return false; + } + + return HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel) == + DialogResponse::YES; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_dialogs_yes_no_h::kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2, + bool* canceled, + const char* noLabel, + const char* yesLabel) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + if (!heading || !line0 || !line1 || !line2 || !canceled || !noLabel || !yesLabel) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_dialogs_yes_no_h::{} - invalid handler data (heading='{}', line0='{}', " + "line1='{}', line2='{}', " + "canceled='{}', noLabel='{}', yesLabel='{}') on addon '{}'", + __func__, static_cast(heading), static_cast(line0), + static_cast(line1), static_cast(line2), + static_cast(canceled), static_cast(noLabel), + static_cast(yesLabel), thisClass->m_process->GetAddonID()); + return false; + } + + DialogResponse result = + HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel); + *canceled = (result == DialogResponse::CANCELLED); + return (result == DialogResponse::YES); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/dialogs/yes_no.h b/xbmc/addons/interface/api/gui/dialogs/yes_no.h new file mode 100644 index 0000000000000..e5cf02476529b --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/yes_no.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_yes_no_h; +struct directFuncToKodi_gui_dialogs_yes_no_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_dialogs_yes_no_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_yes_no_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_dialogs_yes_no_h* ifcToKodi, + directFuncToAddon_gui_dialogs_yes_no_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + void* thisClassHdl, + const char* heading, + const char* text, + bool* canceled, + const char* noLabel, + const char* yesLabel); // Added with API 1 + + static bool kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2, + const char* noLabel, + const char* yesLabel); // Added with API 1 + + static bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + void* thisClassHdl, + const char* heading, + const char* line0, + const char* line1, + const char* line2, + bool* canceled, + const char* noLabel, + const char* yesLabel); // Added with API 1 + + + directFuncToAddon_gui_dialogs_yes_no_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/general.cpp b/xbmc/addons/interface/api/gui/general.cpp new file mode 100644 index 0000000000000..2654bba77bb27 --- /dev/null +++ b/xbmc/addons/interface/api/gui/general.cpp @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "general.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/general.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "ServiceBroker.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +int CHdl_kodi_gui_general_h::m_iAddonGUILockRef = 0; + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_general_h::InitDirect(directFuncToKodi_gui_general_h* ifcToKodi, + directFuncToAddon_gui_general_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_lock_v1 = kodi_gui_lock_v1; + ifcToKodi->kodi_gui_unlock_v1 = kodi_gui_unlock_v1; + ifcToKodi->kodi_gui_get_screen_height_v1 = kodi_gui_get_screen_height_v1; + ifcToKodi->kodi_gui_get_screen_width_v1 = kodi_gui_get_screen_width_v1; + ifcToKodi->kodi_gui_get_video_resolution_v1 = kodi_gui_get_video_resolution_v1; + ifcToKodi->kodi_gui_get_current_window_dialog_id_v1 = kodi_gui_get_current_window_dialog_id_v1; + ifcToKodi->kodi_gui_get_current_window_id_v1 = kodi_gui_get_current_window_id_v1; + ifcToKodi->kodi_gui_get_hw_context_v1 = kodi_gui_get_hw_context_v1; +} + +bool CHdl_kodi_gui_general_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_general_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_lock_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_lock() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_lock_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_lock_v1; /* Autogenerated */ + kodi_gui_lock_v1(this); + return true; + } + case funcParent_kodi_gui_unlock_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_unlock() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_unlock_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_unlock_v1; /* Autogenerated */ + kodi_gui_unlock_v1(this); + return true; + } + case funcParent_kodi_gui_get_screen_height_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_height() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_screen_height_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_screen_height_v1; /* Autogenerated */ + int auto_gen_ret = kodi_gui_get_screen_height_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_screen_height_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_get_screen_width_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_width() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_screen_width_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_screen_width_v1; /* Autogenerated */ + int auto_gen_ret = kodi_gui_get_screen_width_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_screen_width_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_get_video_resolution_v1: + { + // Original API call: ATTR_DLL_EXPORT float kodi_gui_get_video_resolution() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_video_resolution_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_video_resolution_v1; /* Autogenerated */ + float auto_gen_ret = kodi_gui_get_video_resolution_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_video_resolution_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_get_current_window_dialog_id_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_dialog_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ + int auto_gen_ret = kodi_gui_get_current_window_dialog_id_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_current_window_dialog_id_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_get_current_window_id_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_current_window_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_id_v1; /* Autogenerated */ + int auto_gen_ret = kodi_gui_get_current_window_id_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_current_window_id_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_get_hw_context_v1: + { + // Original API call: ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_hw_context_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_hw_context_v1; /* Autogenerated */ + ADDON_HARDWARE_CONTEXT2 auto_gen_ret = kodi_gui_get_hw_context_v1(this); + msgpack::pack(out, msgParent_OUT_kodi_gui_get_hw_context_v1(PtrValue(auto_gen_ret))); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_general_h::{}: addon called with unknown function id '{}' on group " + "'gui_general_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +void CHdl_kodi_gui_general_h::kodi_gui_lock_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + lock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_general_h::kodi_gui_unlock_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_general_h::kodi_gui_get_screen_height_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_general_h::kodi_gui_get_screen_width_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); + + /*---AUTO_GEN_PARSE---*/ +} + +float CHdl_kodi_gui_general_h::kodi_gui_get_video_resolution_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0f; + + /*---AUTO_GEN_PARSE---*/ + + return (int)CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_general_h::kodi_gui_get_current_window_dialog_id_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + return (int)CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_general_h::kodi_gui_get_current_window_id_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CSingleLock gl(CServiceBroker::GetWinSystem()->GetGfxContext()); + return CServiceBroker::GetGUI()->GetWindowManager().GetTopmostModalDialog(); + + /*---AUTO_GEN_PARSE---*/ +} + +ADDON_HARDWARE_CONTEXT2 CHdl_kodi_gui_general_h::kodi_gui_get_hw_context_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return CServiceBroker::GetWinSystem()->GetHWContext(); + ; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_general_h::lock() +{ + if (m_iAddonGUILockRef == 0) + CServiceBroker::GetWinSystem()->GetGfxContext().lock(); + ++m_iAddonGUILockRef; +} + +void CHdl_kodi_gui_general_h::unlock() +{ + if (m_iAddonGUILockRef > 0) + { + --m_iAddonGUILockRef; + if (m_iAddonGUILockRef == 0) + CServiceBroker::GetWinSystem()->GetGfxContext().unlock(); + } +} + +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/general.h b/xbmc/addons/interface/api/gui/general.h new file mode 100644 index 0000000000000..6fe3bde365a11 --- /dev/null +++ b/xbmc/addons/interface/api/gui/general.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/general.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_general_h; +struct directFuncToKodi_gui_general_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_general_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_general_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_general_h* ifcToKodi, + directFuncToAddon_gui_general_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + static void lock(); + static void unlock(); + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + static int m_iAddonGUILockRef; + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static void kodi_gui_lock_v1(void* thisClassHdl); // Added with API 1 + + static void kodi_gui_unlock_v1(void* thisClassHdl); // Added with API 1 + + static int kodi_gui_get_screen_height_v1(void* thisClassHdl); // Added with API 1 + + static int kodi_gui_get_screen_width_v1(void* thisClassHdl); // Added with API 1 + + static float kodi_gui_get_video_resolution_v1(void* thisClassHdl); // Added with API 1 + + static int kodi_gui_get_current_window_dialog_id_v1(void* thisClassHdl); // Added with API 1 + + static int kodi_gui_get_current_window_id_v1(void* thisClassHdl); // Added with API 1 + + static ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context_v1(void* thisClassHdl); // Added with API 1 + + + directFuncToAddon_gui_general_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/list_item.cpp b/xbmc/addons/interface/api/gui/list_item.cpp new file mode 100644 index 0000000000000..5d18152c7e172 --- /dev/null +++ b/xbmc/addons/interface/api/gui/list_item.cpp @@ -0,0 +1,625 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "list_item.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/list_item.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "FileItem.h" +#include "general.h" +#include "utils/StringUtils.h" +#include "utils/Variant.h" + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_list_item_h::InitDirect(directFuncToKodi_gui_list_item_h* ifcToKodi, + directFuncToAddon_gui_list_item_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_listitem_create_v1 = kodi_gui_listitem_create_v1; + ifcToKodi->kodi_gui_listitem_destroy_v1 = kodi_gui_listitem_destroy_v1; + ifcToKodi->kodi_gui_listitem_get_label_v1 = kodi_gui_listitem_get_label_v1; + ifcToKodi->kodi_gui_listitem_set_label_v1 = kodi_gui_listitem_set_label_v1; + ifcToKodi->kodi_gui_listitem_get_label2_v1 = kodi_gui_listitem_get_label2_v1; + ifcToKodi->kodi_gui_listitem_set_label2_v1 = kodi_gui_listitem_set_label2_v1; + ifcToKodi->kodi_gui_listitem_get_art_v1 = kodi_gui_listitem_get_art_v1; + ifcToKodi->kodi_gui_listitem_set_art_v1 = kodi_gui_listitem_set_art_v1; + ifcToKodi->kodi_gui_listitem_get_path_v1 = kodi_gui_listitem_get_path_v1; + ifcToKodi->kodi_gui_listitem_set_path_v1 = kodi_gui_listitem_set_path_v1; + ifcToKodi->kodi_gui_listitem_get_property_v1 = kodi_gui_listitem_get_property_v1; + ifcToKodi->kodi_gui_listitem_set_property_v1 = kodi_gui_listitem_set_property_v1; + ifcToKodi->kodi_gui_listitem_select_v1 = kodi_gui_listitem_select_v1; + ifcToKodi->kodi_gui_listitem_is_selected_v1 = kodi_gui_listitem_is_selected_v1; +} + +bool CHdl_kodi_gui_list_item_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_list_item_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_listitem_create_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create(const char* label, const char* label2, const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_create_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_create_v1 t = in.get().as(); + const std::string& label = std::get<0>(t); + const std::string& label2 = std::get<1>(t); + const std::string& path = std::get<2>(t); + KODI_GUI_LISTITEM_HANDLE auto_gen_ret = + kodi_gui_listitem_create_v1(this, label.c_str(), label2.c_str(), path.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_listitem_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_listitem_destroy_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_destroy(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_destroy_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_destroy_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_listitem_destroy_v1(this, handle); + return true; + } + case funcParent_kodi_gui_listitem_get_label_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_get_label_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_listitem_get_label_v1(this, handle); + msgpack::pack(out, + msgParent_OUT_kodi_gui_listitem_get_label_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_listitem_set_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_set_label_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_listitem_set_label_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_listitem_get_label2_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label2(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_get_label2_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_listitem_get_label2_v1(this, handle); + msgpack::pack( + out, msgParent_OUT_kodi_gui_listitem_get_label2_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_listitem_set_label2_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label2(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_set_label2_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& label = std::get<1>(t); + kodi_gui_listitem_set_label2_v1(this, handle, label.c_str()); + return true; + } + case funcParent_kodi_gui_listitem_get_art_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_art_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_art_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_get_art_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& type = std::get<1>(t); + char* auto_gen_ret = kodi_gui_listitem_get_art_v1(this, handle, type.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_gui_listitem_get_art_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_listitem_set_art_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type, const char* image) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_art_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_art_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_set_art_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& type = std::get<1>(t); + const std::string& image = std::get<2>(t); + kodi_gui_listitem_set_art_v1(this, handle, type.c_str(), image.c_str()); + return true; + } + case funcParent_kodi_gui_listitem_get_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_path(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_path_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_get_path_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_gui_listitem_get_path_v1(this, handle); + msgpack::pack(out, + msgParent_OUT_kodi_gui_listitem_get_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_listitem_set_path_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_path(KODI_GUI_LISTITEM_HANDLE handle, const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_path_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_set_path_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& path = std::get<1>(t); + kodi_gui_listitem_set_path_v1(this, handle, path.c_str()); + return true; + } + case funcParent_kodi_gui_listitem_get_property_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_get_property_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + char* auto_gen_ret = kodi_gui_listitem_get_property_v1(this, handle, key.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_gui_listitem_get_property_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_listitem_set_property_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_set_property_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + const std::string& value = std::get<2>(t); + kodi_gui_listitem_set_property_v1(this, handle, key.c_str(), value.c_str()); + return true; + } + case funcParent_kodi_gui_listitem_select_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_select(KODI_GUI_LISTITEM_HANDLE handle, bool select) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_select_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_select_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_select_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool select = std::get<1>(t); + kodi_gui_listitem_select_v1(this, handle, select); + return true; + } + case funcParent_kodi_gui_listitem_is_selected_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_listitem_is_selected(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_listitem_is_selected_v1 t = in.get().as(); + KODI_GUI_LISTITEM_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_listitem_is_selected_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_listitem_is_selected_v1(auto_gen_ret)); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_list_item_h::{}: addon called with unknown function id '{}' on " + "group 'gui_list_item_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +KODI_GUI_LISTITEM_HANDLE CHdl_kodi_gui_list_item_h::kodi_gui_listitem_create_v1(void* thisClassHdl, + const char* label, + const char* label2, + const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = new CFileItemPtr(new CFileItem()); + if (label) + item->get()->SetLabel(label); + if (label2) + item->get()->SetLabel2(label2); + if (path) + item->get()->SetPath(path); + + return item; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_destroy_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item) + delete item; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_list_item_h::kodi_gui_listitem_get_label_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return nullptr; + } + + char* ret; + CHdl_kodi_gui_general_h::lock(); + ret = strdup(item->get()->GetLabel().c_str()); + CHdl_kodi_gui_general_h::unlock(); + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_set_label_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + item->get()->SetLabel(label); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_list_item_h::kodi_gui_listitem_get_label2_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return nullptr; + } + + char* ret; + CHdl_kodi_gui_general_h::lock(); + ret = strdup(item->get()->GetLabel2().c_str()); + CHdl_kodi_gui_general_h::unlock(); + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_set_label2_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + item->get()->SetLabel2(label); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_list_item_h::kodi_gui_listitem_get_art_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* type) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return nullptr; + } + + char* ret; + CHdl_kodi_gui_general_h::lock(); + ret = strdup(item->get()->GetArt(type).c_str()); + CHdl_kodi_gui_general_h::unlock(); + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_set_art_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* type, + const char* image) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + item->get()->SetArt(type, image); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_list_item_h::kodi_gui_listitem_get_path_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return nullptr; + } + + char* ret; + CHdl_kodi_gui_general_h::lock(); + ret = strdup(item->get()->GetPath().c_str()); + CHdl_kodi_gui_general_h::unlock(); + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_set_path_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* path) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + item->get()->SetPath(path); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_list_item_h::kodi_gui_listitem_get_property_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return nullptr; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + char* ret = strdup(item->get()->GetProperty(lowerKey).asString().c_str()); + CHdl_kodi_gui_general_h::unlock(); + + return ret; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_set_property_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* key, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + item->get()->SetProperty(lowerKey, CVariant(value)); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_list_item_h::kodi_gui_listitem_select_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + bool select) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + item->get()->Select(select); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_list_item_h::kodi_gui_listitem_is_selected_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CFileItemPtr* item = static_cast(handle); + if (item->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_list_item_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return false; + } + + CHdl_kodi_gui_general_h::lock(); + bool ret = item->get()->IsSelected(); + CHdl_kodi_gui_general_h::unlock(); + + return ret; + + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/list_item.h b/xbmc/addons/interface/api/gui/list_item.h new file mode 100644 index 0000000000000..65147d1347585 --- /dev/null +++ b/xbmc/addons/interface/api/gui/list_item.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_list_item_h; +struct directFuncToKodi_gui_list_item_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_list_item_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_list_item_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_list_item_h* ifcToKodi, + directFuncToAddon_gui_list_item_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create_v1(void* thisClassHdl, + const char* label, + const char* label2, + const char* path); // Added with API 1 + + static void kodi_gui_listitem_destroy_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle); // Added with API 1 + + static char* kodi_gui_listitem_get_label_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle); // Added with API 1 + + static void kodi_gui_listitem_set_label_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* label); // Added with API 1 + + static char* kodi_gui_listitem_get_label2_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle); // Added with API 1 + + static void kodi_gui_listitem_set_label2_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* label); // Added with API 1 + + static char* kodi_gui_listitem_get_art_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* type); // Added with API 1 + + static void kodi_gui_listitem_set_art_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* type, + const char* image); // Added with API 1 + + static char* kodi_gui_listitem_get_path_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle); // Added with API 1 + + static void kodi_gui_listitem_set_path_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* path); // Added with API 1 + + static char* kodi_gui_listitem_get_property_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* key); // Added with API 1 + + static void kodi_gui_listitem_set_property_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + const char* key, + const char* value); // Added with API 1 + + static void kodi_gui_listitem_select_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle, + bool select); // Added with API 1 + + static bool kodi_gui_listitem_is_selected_v1(void* thisClassHdl, + KODI_GUI_LISTITEM_HANDLE handle); // Added with API 1 + + + directFuncToAddon_gui_list_item_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/window.cpp b/xbmc/addons/interface/api/gui/window.cpp new file mode 100644 index 0000000000000..94cca3b348df4 --- /dev/null +++ b/xbmc/addons/interface/api/gui/window.cpp @@ -0,0 +1,2304 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "window.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/gui/window.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "Application.h" +#include "FileItem.h" +#include "ServiceBroker.h" +#include "addons/Skin.h" +#include "addons/interface/tools/GUITranslator.h" +#include "general.h" +// #include "controls/Rendering.h" +#include "filesystem/File.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIRenderingControl.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/TextureManager.h" +#include "input/Key.h" +#include "messaging/ApplicationMessenger.h" +#include "threads/Event.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "utils/Variant.h" + +using namespace ADDON; +using namespace KODI::MESSAGING; + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +CGUIAddonWindow::CGUIAddonWindow(int id, + const std::string& strXML, + std::shared_ptr addon, + bool isMedia) + : CGUIMediaWindow(id, strXML.c_str()), + m_windowId(id), + m_oldWindowId(0), + m_addon(addon), + m_isMedia(isMedia) +{ + m_loadType = LOAD_ON_GUI_INIT; +} + +CGUIControl* CGUIAddonWindow::GetAddonControl(int controlId, + CGUIControl::GUICONTROLTYPES type, + const std::string& typeName) +{ + // Load window resources, if not already done, to have related xml content + // present and to let control find it + if (!m_windowLoaded) + { + if (!Initialize()) + { + CLog::Log(LOGERROR, + "CGUIAddonGUI_Window::{}: {} - Window initialize failed by control id '{}' request " + "for '{}'", + __func__, m_addon->Name(), controlId, typeName); + return nullptr; + } + } + + CGUIControl* pGUIControl = GetControl(controlId); + if (!pGUIControl) + { + CLog::Log(LOGERROR, + "CGUIAddonGUI_Window::{}: {} - Requested GUI control Id '{}' for '{}' not present!", + __func__, m_addon->Name(), controlId, typeName); + return nullptr; + } + else if (pGUIControl->GetControlType() != type) + { + CLog::Log(LOGERROR, + "CGUIAddonGUI_Window::{}: {} - Requested GUI control Id '{}' not the type '{}'!", + __func__, m_addon->Name(), controlId, typeName); + return nullptr; + } + + return pGUIControl; +} + +bool CGUIAddonWindow::OnAction(const CAction& action) +{ + // Let addon decide whether it wants to handle action first + if (CBOnAction && + CBOnAction(m_clientHandle, CAddonGUITranslator::TranslateActionIdToAddon(action.GetID()))) + return true; + + return CGUIWindow::OnAction(action); +} +bool CGUIAddonWindow::OnMessage(CGUIMessage& message) +{ + switch (message.GetMessage()) + { + case GUI_MSG_WINDOW_DEINIT: + { + return CGUIMediaWindow::OnMessage(message); + } + break; + + case GUI_MSG_WINDOW_INIT: + { + CGUIMediaWindow::OnMessage(message); + + if (CBOnInit) + CBOnInit(m_clientHandle); + return true; + } + break; + + case GUI_MSG_FOCUSED: + { + if (m_viewControl.HasControl(message.GetControlId()) && + m_viewControl.GetCurrentControl() != message.GetControlId()) + { + m_viewControl.SetFocused(); + return true; + } + // check if our focused control is one of our category buttons + int iControl = message.GetControlId(); + if (CBOnFocus) + CBOnFocus(m_clientHandle, iControl); + } + break; + + case GUI_MSG_NOTIFY_ALL: + { + // most messages from GUI_MSG_NOTIFY_ALL break container content, whitelist working ones. + if (message.GetParam1() == GUI_MSG_PAGE_CHANGE || + message.GetParam1() == GUI_MSG_WINDOW_RESIZE) + return CGUIMediaWindow::OnMessage(message); + return true; + } + + case GUI_MSG_CLICKED: + { + int iControl = message.GetSenderId(); + if (iControl && iControl != this->GetID()) + { + CGUIControl* controlClicked = this->GetControl(iControl); + + // The old python way used to check list AND SELECITEM method or if its a button, checkmark. + // Its done this way for now to allow other controls without a python version like togglebutton to still raise a onAction event + if (controlClicked) // Will get problems if we the id is not on the window and we try to do GetControlType on it. So check to make sure it exists + { + if ((controlClicked->IsContainer() && (message.GetParam1() == ACTION_SELECT_ITEM || + message.GetParam1() == ACTION_MOUSE_LEFT_CLICK)) || + !controlClicked->IsContainer()) + { + if (CBOnClick) + return CBOnClick(m_clientHandle, iControl); + } + else if (controlClicked->IsContainer() && + (message.GetParam1() == ACTION_MOUSE_RIGHT_CLICK || + message.GetParam1() == ACTION_CONTEXT_MENU)) + { + if (CBOnAction) + { + // Check addon want to handle right click for a context menu, if + // not used from addon becomes "GetContextButtons(...)" called. + if (CBOnAction(m_clientHandle, ADDON_ACTION_CONTEXT_MENU)) + return true; + } + } + } + } + } + break; + } + + return CGUIMediaWindow::OnMessage(message); +} + +void CGUIAddonWindow::AllocResources(bool forceLoad /*= false */) +{ + std::string tmpDir = URIUtils::GetDirectory(GetProperty("xmlfile").asString()); + std::string fallbackMediaPath; + URIUtils::GetParentPath(tmpDir, fallbackMediaPath); + URIUtils::RemoveSlashAtEnd(fallbackMediaPath); + m_mediaDir = fallbackMediaPath; + + CServiceBroker::GetGUI()->GetTextureManager().AddTexturePath(m_mediaDir); + CGUIMediaWindow::AllocResources(forceLoad); + CServiceBroker::GetGUI()->GetTextureManager().RemoveTexturePath(m_mediaDir); +} + +void CGUIAddonWindow::Render() +{ + CServiceBroker::GetGUI()->GetTextureManager().AddTexturePath(m_mediaDir); + CGUIMediaWindow::Render(); + CServiceBroker::GetGUI()->GetTextureManager().RemoveTexturePath(m_mediaDir); +} + +void CGUIAddonWindow::AddItem(CFileItemPtr* fileItem, int itemPosition) +{ + if (itemPosition == -1 || itemPosition > m_vecItems->Size()) + { + m_vecItems->Add(*fileItem); + } + else if (itemPosition < -1 && !(itemPosition - 1 < m_vecItems->Size())) + { + m_vecItems->AddFront(*fileItem, 0); + } + else + { + m_vecItems->AddFront(*fileItem, itemPosition); + } + m_viewControl.SetItems(*m_vecItems); + UpdateButtons(); +} + +void CGUIAddonWindow::RemoveItem(int itemPosition) +{ + m_vecItems->Remove(itemPosition); + m_viewControl.SetItems(*m_vecItems); + UpdateButtons(); +} + +void CGUIAddonWindow::RemoveItem(CFileItemPtr* fileItem) +{ + m_vecItems->Remove(fileItem->get()); + m_viewControl.SetItems(*m_vecItems); + UpdateButtons(); +} + +int CGUIAddonWindow::GetCurrentListPosition() +{ + return m_viewControl.GetSelectedItem(); +} + +void CGUIAddonWindow::SetCurrentListPosition(int item) +{ + m_viewControl.SetSelectedItem(item); +} + +int CGUIAddonWindow::GetListSize() +{ + return m_vecItems->Size(); +} + +CFileItemPtr* CGUIAddonWindow::GetListItem(int position) +{ + if (position < 0 || position >= m_vecItems->Size()) + return nullptr; + return new CFileItemPtr(m_vecItems->Get(position)); +} + +void CGUIAddonWindow::ClearList() +{ + ClearFileItems(); + + m_viewControl.SetItems(*m_vecItems); + UpdateButtons(); +} + +void CGUIAddonWindow::SetContainerProperty(const std::string& key, const std::string& value) +{ + m_vecItems->SetProperty(key, value); +} + +void CGUIAddonWindow::SetContainerContent(const std::string& value) +{ + m_vecItems->SetContent(value); +} + +int CGUIAddonWindow::GetCurrentContainerControlId() +{ + return m_viewControl.GetCurrentControl(); +} + +void CGUIAddonWindow::GetContextButtons(int itemNumber, CContextButtons& buttons) +{ + gui_context_menu_pair c_buttons[ADDON_MAX_CONTEXT_ENTRIES] = {{0}}; + unsigned int size = ADDON_MAX_CONTEXT_ENTRIES; + if (CBGetContextButtons) + { + CBGetContextButtons(m_clientHandle, itemNumber, c_buttons, &size); + for (unsigned int i = 0; i < size; ++i) + buttons.push_back(std::pair(c_buttons[i].id, c_buttons[i].name)); + } +} + +bool CGUIAddonWindow::OnContextButton(int itemNumber, CONTEXT_BUTTON button) +{ + if (CBOnContextButton) + return CBOnContextButton(m_clientHandle, itemNumber, static_cast(button)); + return false; +} + +void CGUIAddonWindow::WaitForActionEvent(unsigned int timeout) +{ + m_actionEvent.Wait(std::chrono::milliseconds(timeout)); + m_actionEvent.Reset(); +} + +void CGUIAddonWindow::PulseActionEvent() +{ + m_actionEvent.Set(); +} + +void CGUIAddonWindow::SetupShares() +{ + UpdateButtons(); +} + + +CGUIAddonWindowDialog::CGUIAddonWindowDialog(int id, + const std::string& strXML, + std::shared_ptr addon) + : CGUIAddonWindow(id, strXML, addon, false), m_bRunning(false) +{ +} + +void CGUIAddonWindowDialog::Show(bool show /* = true */, bool modal /* = true*/) +{ + if (modal) + { + unsigned int count = CServiceBroker::GetWinSystem()->GetGfxContext().exit(); + CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, + static_cast(this)); + CServiceBroker::GetWinSystem()->GetGfxContext().restore(count); + } + else + CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, + static_cast(this)); +} + +void CGUIAddonWindowDialog::Show_Internal(bool show /* = true */) +{ + if (show) + { + m_bRunning = true; + CServiceBroker::GetGUI()->GetWindowManager().RegisterDialog(this); + + // activate this window... + CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, GetID()); + OnMessage(msg); + + // this dialog is derived from GUIMediaWindow + // make sure it is rendered last + m_renderOrder = RENDER_ORDER_DIALOG; + while (m_bRunning) + { + if (!ProcessRenderLoop(false)) + break; + } + } + else // hide + { + m_bRunning = false; + + CGUIMessage msg(GUI_MSG_WINDOW_DEINIT, 0, 0); + OnMessage(msg); + + CServiceBroker::GetGUI()->GetWindowManager().RemoveDialog(GetID()); + } +} + +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_window_h::InitDirect(directFuncToKodi_gui_window_h* ifcToKodi, + directFuncToAddon_gui_window_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_gui_window_create_v1 = kodi_gui_window_create_v1; + ifcToKodi->kodi_gui_window_destroy_v1 = kodi_gui_window_destroy_v1; + ifcToKodi->kodi_gui_window_show_v1 = kodi_gui_window_show_v1; + ifcToKodi->kodi_gui_window_close_v1 = kodi_gui_window_close_v1; + ifcToKodi->kodi_gui_window_do_modal_v1 = kodi_gui_window_do_modal_v1; + ifcToKodi->kodi_gui_window_set_focus_id_v1 = kodi_gui_window_set_focus_id_v1; + ifcToKodi->kodi_gui_window_get_focus_id_v1 = kodi_gui_window_get_focus_id_v1; + ifcToKodi->kodi_gui_window_set_control_label_v1 = kodi_gui_window_set_control_label_v1; + ifcToKodi->kodi_gui_window_set_control_visible_v1 = kodi_gui_window_set_control_visible_v1; + ifcToKodi->kodi_gui_window_set_control_selected_v1 = kodi_gui_window_set_control_selected_v1; + ifcToKodi->kodi_gui_window_set_property_v1 = kodi_gui_window_set_property_v1; + ifcToKodi->kodi_gui_window_set_property_int_v1 = kodi_gui_window_set_property_int_v1; + ifcToKodi->kodi_gui_window_set_property_bool_v1 = kodi_gui_window_set_property_bool_v1; + ifcToKodi->kodi_gui_window_set_property_double_v1 = kodi_gui_window_set_property_double_v1; + ifcToKodi->kodi_gui_window_get_property_v1 = kodi_gui_window_get_property_v1; + ifcToKodi->kodi_gui_window_get_property_int_v1 = kodi_gui_window_get_property_int_v1; + ifcToKodi->kodi_gui_window_get_property_bool_v1 = kodi_gui_window_get_property_bool_v1; + ifcToKodi->kodi_gui_window_get_property_double_v1 = kodi_gui_window_get_property_double_v1; + ifcToKodi->kodi_gui_window_clear_properties_v1 = kodi_gui_window_clear_properties_v1; + ifcToKodi->kodi_gui_window_clear_property_v1 = kodi_gui_window_clear_property_v1; + ifcToKodi->kodi_gui_window_clear_item_list_v1 = kodi_gui_window_clear_item_list_v1; + ifcToKodi->kodi_gui_window_add_list_item_v1 = kodi_gui_window_add_list_item_v1; + ifcToKodi->kodi_gui_window_remove_list_item_from_position_v1 = + kodi_gui_window_remove_list_item_from_position_v1; + ifcToKodi->kodi_gui_window_remove_list_item_v1 = kodi_gui_window_remove_list_item_v1; + ifcToKodi->kodi_gui_window_get_list_item_v1 = kodi_gui_window_get_list_item_v1; + ifcToKodi->kodi_gui_window_set_current_list_position_v1 = + kodi_gui_window_set_current_list_position_v1; + ifcToKodi->kodi_gui_window_get_current_list_position_v1 = + kodi_gui_window_get_current_list_position_v1; + ifcToKodi->kodi_gui_window_get_list_size_v1 = kodi_gui_window_get_list_size_v1; + ifcToKodi->kodi_gui_window_set_container_property_v1 = kodi_gui_window_set_container_property_v1; + ifcToKodi->kodi_gui_window_set_container_content_v1 = kodi_gui_window_set_container_content_v1; + ifcToKodi->kodi_gui_window_get_current_container_id_v1 = + kodi_gui_window_get_current_container_id_v1; + ifcToKodi->kodi_gui_window_mark_dirty_region_v1 = kodi_gui_window_mark_dirty_region_v1; + ifcToKodi->kodi_gui_window_get_control_button_v1 = kodi_gui_window_get_control_button_v1; + ifcToKodi->kodi_gui_window_get_control_edit_v1 = kodi_gui_window_get_control_edit_v1; + ifcToKodi->kodi_gui_window_get_control_fade_label_v1 = kodi_gui_window_get_control_fade_label_v1; + ifcToKodi->kodi_gui_window_get_control_image_v1 = kodi_gui_window_get_control_image_v1; + ifcToKodi->kodi_gui_window_get_control_label_v1 = kodi_gui_window_get_control_label_v1; + ifcToKodi->kodi_gui_window_get_control_progress_v1 = kodi_gui_window_get_control_progress_v1; + ifcToKodi->kodi_gui_window_get_control_radio_button_v1 = + kodi_gui_window_get_control_radio_button_v1; + ifcToKodi->kodi_gui_window_get_control_render_addon_v1 = + kodi_gui_window_get_control_render_addon_v1; + ifcToKodi->kodi_gui_window_get_control_settings_slider_v1 = + kodi_gui_window_get_control_settings_slider_v1; + ifcToKodi->kodi_gui_window_get_control_slider_v1 = kodi_gui_window_get_control_slider_v1; + ifcToKodi->kodi_gui_window_get_control_spin_v1 = kodi_gui_window_get_control_spin_v1; + ifcToKodi->kodi_gui_window_get_control_text_box_v1 = kodi_gui_window_get_control_text_box_v1; +} + +bool CHdl_kodi_gui_window_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_gui_window_h) + return false; + + switch (func) + { + case funcParent_kodi_gui_window_create_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_WINDOW_HANDLE kodi_gui_window_create(KODI_HANDLE kodiBase, const char* xml_filename, const char* default_skin, bool as_dialog, bool is_media) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_create_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_create_v1 t = in.get().as(); + KODI_HANDLE kodiBase = reinterpret_cast(std::get<0>(t)); + const std::string& xml_filename = std::get<1>(t); + const std::string& default_skin = std::get<2>(t); + bool as_dialog = std::get<3>(t); + bool is_media = std::get<4>(t); + KODI_GUI_WINDOW_HANDLE auto_gen_ret = kodi_gui_window_create_v1( + this, kodiBase, xml_filename.c_str(), default_skin.c_str(), as_dialog, is_media); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_destroy_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_destroy(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_destroy_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_destroy_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_window_destroy_v1(this, handle); + return true; + } + case funcParent_kodi_gui_window_show_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_show(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_show_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_show_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_show_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_window_show_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_show_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_close_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_close(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_close_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_close_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_window_close_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_close_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_do_modal_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_do_modal(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_do_modal_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_do_modal_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_do_modal_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_gui_window_do_modal_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_do_modal_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_set_focus_id_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_set_focus_id(KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_focus_id_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + bool auto_gen_ret = kodi_gui_window_set_focus_id_v1(this, handle, control_id); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_set_focus_id_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_get_focus_id_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_focus_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_focus_id_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_window_get_focus_id_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_focus_id_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_set_control_label_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_label(KODI_GUI_WINDOW_HANDLE handle, int control_id, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_control_label_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + const std::string& label = std::get<2>(t); + kodi_gui_window_set_control_label_v1(this, handle, control_id, label.c_str()); + return true; + } + case funcParent_kodi_gui_window_set_control_visible_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_visible(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_control_visible_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + bool visible = std::get<2>(t); + kodi_gui_window_set_control_visible_v1(this, handle, control_id, visible); + return true; + } + case funcParent_kodi_gui_window_set_control_selected_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_selected(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool selected) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_control_selected_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + bool selected = std::get<2>(t); + kodi_gui_window_set_control_selected_v1(this, handle, control_id, selected); + return true; + } + case funcParent_kodi_gui_window_set_property_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_property_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + const std::string& value = std::get<2>(t); + kodi_gui_window_set_property_v1(this, handle, key.c_str(), value.c_str()); + return true; + } + case funcParent_kodi_gui_window_set_property_int_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_int_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_property_int_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + int value = std::get<2>(t); + kodi_gui_window_set_property_int_v1(this, handle, key.c_str(), value); + return true; + } + case funcParent_kodi_gui_window_set_property_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_property_bool_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + bool value = std::get<2>(t); + kodi_gui_window_set_property_bool_v1(this, handle, key.c_str(), value); + return true; + } + case funcParent_kodi_gui_window_set_property_double_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key, double value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_double_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_double_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_property_double_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + double value = std::get<2>(t); + kodi_gui_window_set_property_double_v1(this, handle, key.c_str(), value); + return true; + } + case funcParent_kodi_gui_window_get_property_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_window_get_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_property_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + char* auto_gen_ret = kodi_gui_window_get_property_v1(this, handle, key.c_str()); + msgpack::pack( + out, msgParent_OUT_kodi_gui_window_get_property_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_gui_window_get_property_int_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_int_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_property_int_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + int auto_gen_ret = kodi_gui_window_get_property_int_v1(this, handle, key.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_property_int_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_get_property_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_get_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_property_bool_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + bool auto_gen_ret = kodi_gui_window_get_property_bool_v1(this, handle, key.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_property_bool_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_get_property_double_v1: + { + // Original API call: ATTR_DLL_EXPORT double kodi_gui_window_get_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_double_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_double_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_property_double_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + double auto_gen_ret = kodi_gui_window_get_property_double_v1(this, handle, key.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_property_double_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_clear_properties_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_properties(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_properties_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_clear_properties_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_window_clear_properties_v1(this, handle); + return true; + } + case funcParent_kodi_gui_window_clear_property_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_clear_property_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + kodi_gui_window_clear_property_v1(this, handle, key.c_str()); + return true; + } + case funcParent_kodi_gui_window_clear_item_list_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_item_list(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_clear_item_list_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_window_clear_item_list_v1(this, handle); + return true; + } + case funcParent_kodi_gui_window_add_list_item_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_add_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_add_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_add_list_item_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_add_list_item_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + KODI_GUI_LISTITEM_HANDLE item = reinterpret_cast(std::get<1>(t)); + int list_position = std::get<2>(t); + kodi_gui_window_add_list_item_v1(this, handle, item, list_position); + return true; + } + case funcParent_kodi_gui_window_remove_list_item_from_position_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item_from_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_remove_list_item_from_position_v1 t = + in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int list_position = std::get<1>(t); + kodi_gui_window_remove_list_item_from_position_v1(this, handle, list_position); + return true; + } + case funcParent_kodi_gui_window_remove_list_item_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_remove_list_item_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + KODI_GUI_LISTITEM_HANDLE item = reinterpret_cast(std::get<1>(t)); + kodi_gui_window_remove_list_item_v1(this, handle, item); + return true; + } + case funcParent_kodi_gui_window_get_list_item_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_window_get_list_item(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_item_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_list_item_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int list_position = std::get<1>(t); + KODI_GUI_LISTITEM_HANDLE auto_gen_ret = + kodi_gui_window_get_list_item_v1(this, handle, list_position); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_list_item_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_set_current_list_position_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_current_list_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_current_list_position_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int list_position = std::get<1>(t); + kodi_gui_window_set_current_list_position_v1(this, handle, list_position); + return true; + } + case funcParent_kodi_gui_window_get_current_list_position_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_list_position(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_current_list_position_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_window_get_current_list_position_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_current_list_position_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_get_list_size_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_list_size(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_list_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_size_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_list_size_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_window_get_list_size_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_list_size_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_set_container_property_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_container_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_property_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_container_property_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& key = std::get<1>(t); + const std::string& value = std::get<2>(t); + kodi_gui_window_set_container_property_v1(this, handle, key.c_str(), value.c_str()); + return true; + } + case funcParent_kodi_gui_window_set_container_content_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_content(KODI_GUI_WINDOW_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_container_content_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_content_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_set_container_content_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + const std::string& value = std::get<1>(t); + kodi_gui_window_set_container_content_v1(this, handle, value.c_str()); + return true; + } + case funcParent_kodi_gui_window_get_current_container_id_v1: + { + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_container_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_current_container_id_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_gui_window_get_current_container_id_v1(this, handle); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_current_container_id_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_gui_window_mark_dirty_region_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_mark_dirty_region(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_mark_dirty_region_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + kodi_gui_window_mark_dirty_region_v1(this, handle); + return true; + } + case funcParent_kodi_gui_window_get_control_button_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_button_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_button_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_button_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_button_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_button_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_edit_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_edit( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_edit_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_edit_v1(this, handle, control_id); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_control_edit_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_fade_label_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_fade_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_fade_label_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_fade_label_v1(this, handle, control_id); + msgpack::pack( + out, msgParent_OUT_kodi_gui_window_get_control_fade_label_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_image_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_image( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_image_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_image_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_image_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_image_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_image_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_label_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_label_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_label_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_label_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_label_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_progress_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_progress( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_progress_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_progress_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_progress_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_radio_button_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_radio_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_radio_button_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_radio_button_v1(this, handle, control_id); + msgpack::pack( + out, msgParent_OUT_kodi_gui_window_get_control_radio_button_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_render_addon_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_render_addon( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_render_addon_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_render_addon_v1(this, handle, control_id); + msgpack::pack( + out, msgParent_OUT_kodi_gui_window_get_control_render_addon_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_settings_slider_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_settings_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_settings_slider_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_settings_slider_v1(this, handle, control_id); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_control_settings_slider_v1( + PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_slider_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_slider_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_slider_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_slider_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_spin_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_spin( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_spin_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_spin_v1(this, handle, control_id); + msgpack::pack(out, msgParent_OUT_kodi_gui_window_get_control_spin_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcParent_kodi_gui_window_get_control_text_box_v1: + { + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_text_box( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ + msgParent__IN_kodi_gui_window_get_control_text_box_v1 t = in.get().as(); + KODI_GUI_WINDOW_HANDLE handle = reinterpret_cast(std::get<0>(t)); + int control_id = std::get<1>(t); + KODI_GUI_CONTROL_HANDLE auto_gen_ret = + kodi_gui_window_get_control_text_box_v1(this, handle, control_id); + msgpack::pack(out, + msgParent_OUT_kodi_gui_window_get_control_text_box_v1(PtrValue(auto_gen_ret))); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{}: addon called with unknown function id '{}' on group " + "'gui_window_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +KODI_GUI_WINDOW_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_create_v1(void* thisClassHdl, + KODI_HANDLE kodiBase, + const char* xml_filename, + const char* default_skin, + bool as_dialog, + bool is_media) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::shared_ptr addon = thisClass->m_process->GetAddon(); + if (as_dialog && is_media) + { + CLog::Log( + LOGWARNING, + "CHdl_kodi_gui_window_h::{}: {}/{} - addon tries to create dialog as media window who " + "not allowed, contact Developer '{}' of this addon", + __func__, CAddonInfo::TranslateType(addon->Type()), addon->Name(), addon->Author()); + } + + RESOLUTION_INFO res; + std::string strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res); + + if (!XFILE::CFile::Exists(strSkinPath)) + { + std::string str("none"); + ADDON::AddonInfoPtr addonInfo = std::make_shared(str, ADDON::ADDON_SKIN); + + // Check for the matching folder for the skin in the fallback skins folder + std::string fallbackPath = URIUtils::AddFileToFolder(addon->Path(), "resources", "skins"); + std::string basePath = URIUtils::AddFileToFolder(fallbackPath, g_SkinInfo->ID()); + + strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res, basePath); + + // Check for the matching folder for the skin in the fallback skins folder (if it exists) + if (XFILE::CFile::Exists(basePath)) + { + addonInfo->SetPath(basePath); + const std::shared_ptr skinInfo = + std::make_shared(addonInfo, res); + skinInfo->Start(); + strSkinPath = skinInfo->GetSkinPath(xml_filename, &res); + } + + if (!XFILE::CFile::Exists(strSkinPath)) + { + // Finally fallback to the DefaultSkin as it didn't exist in either the Kodi Skin folder or the fallback skin folder + addonInfo->SetPath(URIUtils::AddFileToFolder(fallbackPath, default_skin)); + const std::shared_ptr skinInfo = + std::make_shared(addonInfo, res); + + skinInfo->Start(); + strSkinPath = skinInfo->GetSkinPath(xml_filename, &res); + if (!XFILE::CFile::Exists(strSkinPath)) + { + CLog::Log( + LOGERROR, + "CHdl_kodi_gui_window_h::{}: {}/{} - XML File '{}' for Window is missing, contact " + "Developer '{}' of this addon", + __func__, CAddonInfo::TranslateType(addon->Type()), addon->Name(), strSkinPath, + addon->Author()); + return nullptr; + } + } + } + + int id = GetNextAvailableWindowId(); + if (id < 0) + return nullptr; + + CGUIWindow* window; + if (!as_dialog) + window = new CGUIAddonWindow(id, strSkinPath, addon, is_media); + else + window = new CGUIAddonWindowDialog(id, strSkinPath, addon); + + CHdl_kodi_gui_general_h::lock(); + CServiceBroker::GetGUI()->GetWindowManager().Add(window); + CHdl_kodi_gui_general_h::unlock(); + + if (!CServiceBroker::GetGUI()->GetWindowManager().GetWindow(id)) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - Requested window id '{}' does not exist for addon '{}'", + __func__, id, thisClass->m_process->GetAddonID()); + delete window; + return nullptr; + } + window->SetCoordsRes(res); + return window; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_destroy_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + CGUIWindow* pWindow = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow(pAddonWindow->GetID()); + if (pWindow) + { + // first change to an existing window + if (CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == pAddonWindow->GetID() && + !g_application.m_bStop) + { + if (CServiceBroker::GetGUI()->GetWindowManager().GetWindow(pAddonWindow->m_oldWindowId)) + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->m_oldWindowId); + else // old window does not exist anymore, switch to home + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_HOME); + } + // Free any window properties + pAddonWindow->ClearProperties(); + // free the window's resources and unload it (free all guicontrols) + pAddonWindow->FreeResources(true); + + CServiceBroker::GetGUI()->GetWindowManager().Remove(pAddonWindow->GetID()); + } + delete pAddonWindow; + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_window_h::kodi_gui_window_show_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return false; + } + + if (pAddonWindow->m_oldWindowId != pAddonWindow->m_windowId && + pAddonWindow->m_windowId != CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) + pAddonWindow->m_oldWindowId = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); + + CHdl_kodi_gui_general_h::lock(); + if (pAddonWindow->IsDialog()) + dynamic_cast(pAddonWindow)->Show(true, false); + else + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->GetID()); + CHdl_kodi_gui_general_h::unlock(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_window_h::kodi_gui_window_close_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return false; + } + + pAddonWindow->PulseActionEvent(); + + CHdl_kodi_gui_general_h::lock(); + + // if it's a dialog, we have to close it a bit different + if (pAddonWindow->IsDialog()) + dynamic_cast(pAddonWindow)->Show(false); + else + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->m_oldWindowId); + pAddonWindow->m_oldWindowId = 0; + + CHdl_kodi_gui_general_h::unlock(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_window_h::kodi_gui_window_do_modal_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return false; + } + + if (pAddonWindow->GetID() == CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) + return true; + + if (pAddonWindow->m_oldWindowId != pAddonWindow->m_windowId && + pAddonWindow->m_windowId != CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) + pAddonWindow->m_oldWindowId = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); + + CHdl_kodi_gui_general_h::lock(); + if (pAddonWindow->IsDialog()) + dynamic_cast(pAddonWindow)->Show(true, true); + else + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->GetID()); + CHdl_kodi_gui_general_h::unlock(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_window_h::kodi_gui_window_set_focus_id_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return false; + } + + CHdl_kodi_gui_general_h::lock(); + CGUIMessage msg(GUI_MSG_SETFOCUS, pAddonWindow->m_windowId, control_id); + pAddonWindow->OnMessage(msg); + CHdl_kodi_gui_general_h::unlock(); + + return true; + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_window_h::kodi_gui_window_get_focus_id_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return -1; + } + + CHdl_kodi_gui_general_h::lock(); + int control_id = pAddonWindow->GetFocusedControlID(); + CHdl_kodi_gui_general_h::unlock(); + + if (control_id == -1) + CLog::Log(LOGERROR, "CHdl_kodi_gui_window_h - {}: {} - No control in this window has focus", + __func__, thisClass->m_process->GetAddonID()); + + return control_id; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_control_label_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* label) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + CGUIMessage msg(GUI_MSG_LABEL_SET, pAddonWindow->m_windowId, control_id); + msg.SetLabel(label); + pAddonWindow->OnMessage(msg); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_control_visible_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool visible) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + CGUIMessage msg(visible ? GUI_MSG_VISIBLE : GUI_MSG_HIDDEN, pAddonWindow->m_windowId, control_id); + pAddonWindow->OnMessage(msg); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_control_selected_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool selected) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + CGUIMessage msg(selected ? GUI_MSG_SET_SELECTED : GUI_MSG_SET_DESELECTED, + pAddonWindow->m_windowId, control_id); + pAddonWindow->OnMessage(msg); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetProperty(lowerKey, value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_property_int_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetProperty(lowerKey, value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_property_bool_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + bool value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetProperty(lowerKey, value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_property_double_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + double value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetProperty(lowerKey, value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_gui_window_h::kodi_gui_window_get_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return nullptr; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + std::string value = pAddonWindow->GetProperty(lowerKey).asString(); + CHdl_kodi_gui_general_h::unlock(); + + return strdup(value.c_str()); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_window_h::kodi_gui_window_get_property_int_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return -1; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + int value = static_cast(pAddonWindow->GetProperty(lowerKey).asInteger()); + CHdl_kodi_gui_general_h::unlock(); + + return value; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_gui_window_h::kodi_gui_window_get_property_bool_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return false; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + bool value = pAddonWindow->GetProperty(lowerKey).asBoolean(); + CHdl_kodi_gui_general_h::unlock(); + + return value; + + /*---AUTO_GEN_PARSE---*/ +} + +double CHdl_kodi_gui_window_h::kodi_gui_window_get_property_double_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0.0; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return 0.0; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + double value = pAddonWindow->GetProperty(lowerKey).asDouble(); + CHdl_kodi_gui_general_h::unlock(); + + return value; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_clear_properties_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->ClearProperties(); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_clear_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + std::string lowerKey = key; + StringUtils::ToLower(lowerKey); + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetProperty(lowerKey, ""); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_clear_item_list_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->ClearList(); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_add_list_item_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item, + int list_position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CFileItemPtr* pItem(static_cast(item)); + if (pItem->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_window_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->AddItem(pItem, list_position); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_remove_list_item_from_position_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int list_position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->RemoveItem(list_position); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_remove_list_item_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CFileItemPtr* pItem(static_cast(item)); + if (pItem->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_window_h::{} - empty list item called on addon '{}'", + __func__, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->RemoveItem(pItem); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_LISTITEM_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_list_item_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int list_position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return nullptr; + } + + CHdl_kodi_gui_general_h::lock(); + CFileItemPtr* pItem(pAddonWindow->GetListItem(list_position)); + if (pItem == nullptr || pItem->get() == nullptr) + { + CLog::Log(LOGERROR, "CHdl_kodi_gui_window_h - {}: {} - Index out of range", __func__, + thisClass->m_process->GetAddonID()); + + if (pItem) + { + delete pItem; + pItem = nullptr; + } + } + CHdl_kodi_gui_general_h::unlock(); + + return pItem; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_current_list_position_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int list_position) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetCurrentListPosition(list_position); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_window_h::kodi_gui_window_get_current_list_position_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return -1; + } + + CHdl_kodi_gui_general_h::lock(); + int listPos = pAddonWindow->GetCurrentListPosition(); + CHdl_kodi_gui_general_h::unlock(); + + return listPos; + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_window_h::kodi_gui_window_get_list_size_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return -1; + } + + CHdl_kodi_gui_general_h::lock(); + int listSize = pAddonWindow->GetListSize(); + CHdl_kodi_gui_general_h::unlock(); + + return listSize; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_container_property_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetContainerProperty(key, value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_set_container_content_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->SetContainerContent(value); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +int CHdl_kodi_gui_window_h::kodi_gui_window_get_current_container_id_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return -1; + } + + CHdl_kodi_gui_general_h::lock(); + int id = pAddonWindow->GetCurrentContainerControlId(); + CHdl_kodi_gui_general_h::unlock(); + + return id; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_gui_window_h::kodi_gui_window_mark_dirty_region_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return; + } + + CHdl_kodi_gui_general_h::lock(); + pAddonWindow->MarkDirtyRegion(); + CHdl_kodi_gui_general_h::unlock(); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_button_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_BUTTON, + "button"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_edit_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_EDIT, "edit"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_fade_label_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_FADELABEL, + "fade label"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_image_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_IMAGE, + "image"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_label_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_LABEL, + "label"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_progress_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_PROGRESS, + "progress"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_radio_button_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_RADIO, + "radio button"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_render_addon_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + return nullptr; +#warning Function "CHdl_kodi_gui_window_h::kodi_gui_window_get_control_render_addon" must be set by hand. Alternatively add /*---AUTO_GEN_PARSE---*/ on back of target function in header to find on scan. + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_settings_slider_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // Code below must be set manually by hand to make work to Kodi + + return GetControl(thisClass, handle, control_id, __func__, + CGUIControl::GUICONTROL_SETTINGS_SLIDER, "settings slider"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_slider_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_SLIDER, + "slider"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_spin_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_SPINEX, + "spin"); + + /*---AUTO_GEN_PARSE---*/ +} + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::kodi_gui_window_get_control_text_box_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + return GetControl(thisClass, handle, control_id, __func__, CGUIControl::GUICONTROL_TEXTBOX, + "textbox"); + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +KODI_GUI_CONTROL_HANDLE CHdl_kodi_gui_window_h::GetControl(CHdl_kodi_gui_window_h* thisClass, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* function, + CGUIControl::GUICONTROLTYPES type, + const std::string& typeName) +{ + CGUIAddonWindow* pAddonWindow = static_cast(handle); + if (!pAddonWindow) + { + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - invalid handler data (handle='{}') on " + "addon '{}'", + __func__, handle, thisClass->m_process->GetAddonID()); + return nullptr; + } + + return pAddonWindow->GetAddonControl(control_id, type, typeName); +} + +int CHdl_kodi_gui_window_h::GetNextAvailableWindowId() +{ + CHdl_kodi_gui_general_h::lock(); + + // if window WINDOW_ADDON_END is in use it means addon can't create more windows + if (CServiceBroker::GetGUI()->GetWindowManager().GetWindow(WINDOW_ADDON_END)) + { + CHdl_kodi_gui_general_h::unlock(); + CLog::Log(LOGERROR, + "CHdl_kodi_gui_window_h::{} - Maximum number of windows for binary addons reached", + __func__); + return -1; + } + + // window id's WINDOW_ADDON_START - WINDOW_ADDON_END are reserved for addons + // get first window id that is not in use + int id = WINDOW_ADDON_START; + while (id < WINDOW_ADDON_END && + CServiceBroker::GetGUI()->GetWindowManager().GetWindow(id) != nullptr) + id++; + + CHdl_kodi_gui_general_h::unlock(); + return id; +} + +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/gui/window.h b/xbmc/addons/interface/api/gui/window.h new file mode 100644 index 0000000000000..df9c296a5dfdf --- /dev/null +++ b/xbmc/addons/interface/api/gui/window.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/window.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +#include "windows/GUIMediaWindow.h" + +namespace ADDON +{ +class IAddon; +} + +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_window_h; +struct directFuncToKodi_gui_window_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +class CGUIAddonWindow : public CGUIMediaWindow +{ + friend class CHdl_kodi_gui_window_h; + +public: + CGUIAddonWindow(int id, + const std::string& strXML, + std::shared_ptr addon, + bool isMedia); + ~CGUIAddonWindow() override = default; + + bool OnMessage(CGUIMessage& message) override; + bool OnAction(const CAction& action) override; + void AllocResources(bool forceLoad = false) override; + void Render() override; + bool IsMediaWindow() const override { return m_isMedia; } + + /* Addon to Kodi call functions */ + void PulseActionEvent(); + void AddItem(CFileItemPtr* fileItem, int itemPosition); + void RemoveItem(int itemPosition); + void RemoveItem(CFileItemPtr* fileItem); + void ClearList(); + CFileItemPtr* GetListItem(int position); + int GetListSize(); + int GetCurrentListPosition(); + void SetCurrentListPosition(int item); + void SetContainerProperty(const std::string& key, const std::string& value); + void SetContainerContent(const std::string& value); + int GetCurrentContainerControlId(); + CGUIControl* GetAddonControl(int controlId, + CGUIControl::GUICONTROLTYPES type, + const std::string& typeName); + + const int m_windowId; + int m_oldWindowId; + +protected: + void GetContextButtons(int itemNumber, CContextButtons& buttons) override; + bool OnContextButton(int itemNumber, CONTEXT_BUTTON button) override; + void SetupShares() override; + + /* kodi to addon callback function addresses */ + KODI_GUI_CLIENT_HANDLE m_clientHandle{nullptr}; + bool (*CBOnInit)(KODI_GUI_CLIENT_HANDLE cbhdl){nullptr}; + bool (*CBOnFocus)(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId){nullptr}; + bool (*CBOnClick)(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId){nullptr}; + bool (*CBOnAction)(KODI_GUI_CLIENT_HANDLE cbhdl, ADDON_ACTION actionId){nullptr}; + void (*CBGetContextButtons)(KODI_GUI_CLIENT_HANDLE cbhdl, + int itemNumber, + gui_context_menu_pair* buttons, + unsigned int* size){nullptr}; + bool (*CBOnContextButton)(KODI_GUI_CLIENT_HANDLE cbhdl, int itemNumber, unsigned int button){ + nullptr}; + +private: + void WaitForActionEvent(unsigned int timeout); + + CEvent m_actionEvent{true}; + std::shared_ptr m_addon; + std::string m_mediaDir; + bool m_isMedia; +}; + +class CGUIAddonWindowDialog : public CGUIAddonWindow +{ +public: + CGUIAddonWindowDialog(int id, const std::string& strXML, std::shared_ptr addon); + + bool IsDialogRunning() const override { return m_bRunning; } + bool IsDialog() const override { return true; } + bool IsModalDialog() const override { return true; } + + void Show(bool show = true, bool modal = true); + void Show_Internal(bool show = true); + +private: + bool m_bRunning; +}; + +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_gui_window_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_window_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_gui_window_h* ifcToKodi, + directFuncToAddon_gui_window_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + static KODI_GUI_CONTROL_HANDLE GetControl(CHdl_kodi_gui_window_h* thisClass, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* function, + CGUIControl::GUICONTROLTYPES type, + const std::string& typeName); + static int GetNextAvailableWindowId(); + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static KODI_GUI_WINDOW_HANDLE kodi_gui_window_create_v1(void* thisClassHdl, + KODI_HANDLE kodiBase, + const char* xml_filename, + const char* default_skin, + bool as_dialog, + bool is_media); // Added with API 1 + + static void kodi_gui_window_destroy_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static bool kodi_gui_window_show_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static bool kodi_gui_window_close_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static bool kodi_gui_window_do_modal_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static bool kodi_gui_window_set_focus_id_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id); // Added with API 1 + + static int kodi_gui_window_get_focus_id_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static void kodi_gui_window_set_control_label_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* label); // Added with API 1 + + static void kodi_gui_window_set_control_visible_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool visible); // Added with API 1 + + static void kodi_gui_window_set_control_selected_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool selected); // Added with API 1 + + static void kodi_gui_window_set_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value); // Added with API 1 + + static void kodi_gui_window_set_property_int_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + int value); // Added with API 1 + + static void kodi_gui_window_set_property_bool_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + bool value); // Added with API 1 + + static void kodi_gui_window_set_property_double_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + double value); // Added with API 1 + + static char* kodi_gui_window_get_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key); // Added with API 1 + + static int kodi_gui_window_get_property_int_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key); // Added with API 1 + + static bool kodi_gui_window_get_property_bool_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key); // Added with API 1 + + static double kodi_gui_window_get_property_double_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key); // Added with API 1 + + static void kodi_gui_window_clear_properties_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static void kodi_gui_window_clear_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key); // Added with API 1 + + static void kodi_gui_window_clear_item_list_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static void kodi_gui_window_add_list_item_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item, + int list_position); // Added with API 1 + + static void kodi_gui_window_remove_list_item_from_position_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int list_position); // Added with API 1 + + static void kodi_gui_window_remove_list_item_v1( + void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item); // Added with API 1 + + static KODI_GUI_LISTITEM_HANDLE kodi_gui_window_get_list_item_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int list_position); // Added with API 1 + + static void kodi_gui_window_set_current_list_position_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + int list_position); // Added with API 1 + + static int kodi_gui_window_get_current_list_position_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static int kodi_gui_window_get_list_size_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static void kodi_gui_window_set_container_property_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value); // Added with API 1 + + static void kodi_gui_window_set_container_content_v1(void* thisClassHdl, + KODI_GUI_WINDOW_HANDLE handle, + const char* value); // Added with API 1 + + static int kodi_gui_window_get_current_container_id_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static void kodi_gui_window_mark_dirty_region_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_button_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_edit_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_fade_label_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_image_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_label_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_progress_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_radio_button_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_render_addon_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_settings_slider_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_slider_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_spin_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + static KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_text_box_v1( + void* thisClassHdl, KODI_GUI_WINDOW_HANDLE handle, int control_id); // Added with API 1 + + + directFuncToAddon_gui_window_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/monitor.cpp b/xbmc/addons/interface/api/monitor.cpp new file mode 100644 index 0000000000000..9e4963583b8a7 --- /dev/null +++ b/xbmc/addons/interface/api/monitor.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "monitor.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/monitor.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_monitor_h::InitDirect(directFuncToKodi_monitor_h* ifcToKodi, + directFuncToAddon_monitor_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + // Unused "kodi_monitor_wait_for_abort", done only in addon lib + // Unused "kodi_monitor_abort_requested", done only in addon lib +} + +bool CHdl_kodi_monitor_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_monitor_h) + return false; + + switch (func) + { + default: + CLog::Log(LOGERROR, + "CHdl_kodi_monitor_h::{}: addon called with unknown function id '{}' on group " + "'monitor_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi +/* NOTE: unused (no callbacks here) */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/monitor.h b/xbmc/addons/interface/api/monitor.h new file mode 100644 index 0000000000000..ec153343d58b5 --- /dev/null +++ b/xbmc/addons/interface/api/monitor.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/monitor.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_monitor_h; +struct directFuncToKodi_monitor_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_monitor_h : public IMsgHdl +{ +public: + CHdl_kodi_monitor_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_monitor_h* ifcToKodi, directFuncToAddon_monitor_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + + directFuncToAddon_monitor_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/network.cpp b/xbmc/addons/interface/api/network.cpp new file mode 100644 index 0000000000000..ae87811070dc0 --- /dev/null +++ b/xbmc/addons/interface/api/network.cpp @@ -0,0 +1,324 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "network.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/network.h" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +#include "ServiceBroker.h" +#include "URL.h" +#include "network/DNSNameCache.h" +#include "network/Network.h" +#include "utils/SystemInfo.h" +#include "utils/URIUtils.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_network_h::InitDirect(directFuncToKodi_network_h* ifcToKodi, + directFuncToAddon_network_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_network_wake_on_lan_v1 = kodi_network_wake_on_lan_v1; + ifcToKodi->kodi_network_get_ip_address_v1 = kodi_network_get_ip_address_v1; + ifcToKodi->kodi_network_dns_lookup_v1 = kodi_network_dns_lookup_v1; + ifcToKodi->kodi_network_url_encode_v1 = kodi_network_url_encode_v1; + ifcToKodi->kodi_network_get_hostname_v1 = kodi_network_get_hostname_v1; + ifcToKodi->kodi_network_is_local_host_v1 = kodi_network_is_local_host_v1; + ifcToKodi->kodi_network_is_host_on_lan_v1 = kodi_network_is_host_on_lan_v1; + ifcToKodi->kodi_network_get_user_agent_v1 = kodi_network_get_user_agent_v1; +} + +bool CHdl_kodi_network_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_network_h) + return false; + + switch (func) + { + case funcParent_kodi_network_wake_on_lan_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_network_wake_on_lan(const char* mac) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_wake_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_wake_on_lan_v1; /* Autogenerated */ + msgParent__IN_kodi_network_wake_on_lan_v1 t = in.get().as(); + const std::string& mac = std::get<0>(t); + bool auto_gen_ret = kodi_network_wake_on_lan_v1(this, mac.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_network_wake_on_lan_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_network_get_ip_address_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_ip_address() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_ip_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_ip_address_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_network_get_ip_address_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_network_get_ip_address_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_network_dns_lookup_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_network_dns_lookup(const char* url, bool* ret) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_dns_lookup_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_dns_lookup_v1; /* Autogenerated */ + msgParent__IN_kodi_network_dns_lookup_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + bool ret = std::get<1>(t); + char* auto_gen_ret = kodi_network_dns_lookup_v1(this, url.c_str(), &ret); + msgpack::pack( + out, msgParent_OUT_kodi_network_dns_lookup_v1(auto_gen_ret ? auto_gen_ret : "", ret)); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_network_url_encode_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_network_url_encode(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_url_encode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_url_encode_v1; /* Autogenerated */ + msgParent__IN_kodi_network_url_encode_v1 t = in.get().as(); + const std::string& url = std::get<0>(t); + char* auto_gen_ret = kodi_network_url_encode_v1(this, url.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_network_url_encode_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_network_get_hostname_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_hostname() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_hostname_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_hostname_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_network_get_hostname_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_network_get_hostname_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_network_is_local_host_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_network_is_local_host(const char* hostname) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_is_local_host_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_is_local_host_v1; /* Autogenerated */ + msgParent__IN_kodi_network_is_local_host_v1 t = in.get().as(); + const std::string& hostname = std::get<0>(t); + bool auto_gen_ret = kodi_network_is_local_host_v1(this, hostname.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_network_is_local_host_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_network_is_host_on_lan_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_network_is_host_on_lan(const char* hostname, bool offLineCheck) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_is_host_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_is_host_on_lan_v1; /* Autogenerated */ + msgParent__IN_kodi_network_is_host_on_lan_v1 t = in.get().as(); + const std::string& hostname = std::get<0>(t); + bool offLineCheck = std::get<1>(t); + bool auto_gen_ret = kodi_network_is_host_on_lan_v1(this, hostname.c_str(), offLineCheck); + msgpack::pack(out, msgParent_OUT_kodi_network_is_host_on_lan_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_network_get_user_agent_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_user_agent() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_user_agent_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_user_agent_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_network_get_user_agent_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_network_get_user_agent_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_network_h::{}: addon called with unknown function id '{}' on group " + "'network_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +/* NOTE: unused (no functions here) */ + +// Callbacks from addon to Kodi + +bool CHdl_kodi_network_h::kodi_network_wake_on_lan_v1(void* thisClassHdl, const char* mac) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CServiceBroker::GetNetwork().WakeOnLan(mac); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_network_h::kodi_network_get_ip_address_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string titleIP; + CNetworkInterface* iface = CServiceBroker::GetNetwork().GetFirstConnectedInterface(); + if (iface) + titleIP = iface->GetCurrentIPAddress(); + else + titleIP = "127.0.0.1"; + + char* buffer = nullptr; + if (!titleIP.empty()) + buffer = strdup(titleIP.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_network_h::kodi_network_dns_lookup_v1(void* thisClassHdl, + const char* url, + bool* ret) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string; + *ret = CDNSNameCache::Lookup(url, string); + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_network_h::kodi_network_url_encode_v1(void* thisClassHdl, const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = CURL::Encode(url); + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_network_h::kodi_network_get_hostname_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string hostname; + if (!CServiceBroker::GetNetwork().GetHostName(hostname)) + return nullptr; + + char* buffer = nullptr; + if (!hostname.empty()) + buffer = strdup(hostname.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_network_h::kodi_network_is_local_host_v1(void* thisClassHdl, const char* hostname) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return CServiceBroker::GetNetwork().IsLocalHost(hostname); + + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_network_h::kodi_network_is_host_on_lan_v1(void* thisClassHdl, + const char* hostname, + bool offLineCheck) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + + return URIUtils::IsHostOnLAN(hostname, offLineCheck); + + /*---AUTO_GEN_PARSE---*/ +} + +char* CHdl_kodi_network_h::kodi_network_get_user_agent_v1(void* thisClassHdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + + std::string string = CSysInfo::GetUserAgent(); + char* buffer = nullptr; + if (!string.empty()) + buffer = strdup(string.c_str()); + return buffer; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/api/network.h b/xbmc/addons/interface/api/network.h new file mode 100644 index 0000000000000..71482b2bbb343 --- /dev/null +++ b/xbmc/addons/interface/api/network.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include "addons/kodi-dev-kit/include/kodi/c-api/network.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_network_h; +struct directFuncToKodi_network_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_network_h : public IMsgHdl +{ +public: + CHdl_kodi_network_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_network_h* ifcToKodi, directFuncToAddon_network_h* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi + static bool kodi_network_wake_on_lan_v1(void* thisClassHdl, const char* mac); // Added with API 1 + + static char* kodi_network_get_ip_address_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_network_dns_lookup_v1(void* thisClassHdl, + const char* url, + bool* ret); // Added with API 1 + + static char* kodi_network_url_encode_v1(void* thisClassHdl, const char* url); // Added with API 1 + + static char* kodi_network_get_hostname_v1(void* thisClassHdl); // Added with API 1 + + static bool kodi_network_is_local_host_v1(void* thisClassHdl, + const char* hostname); // Added with API 1 + + static bool kodi_network_is_host_on_lan_v1(void* thisClassHdl, + const char* hostname, + bool offLineCheck); // Added with API 1 + + static char* kodi_network_get_user_agent_v1(void* thisClassHdl); // Added with API 1 + + + directFuncToAddon_network_h* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/launcher/CMakeLists.txt b/xbmc/addons/interface/launcher/CMakeLists.txt new file mode 100644 index 0000000000000..84762bfd4bbdd --- /dev/null +++ b/xbmc/addons/interface/launcher/CMakeLists.txt @@ -0,0 +1,25 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + LauncherDirectDll.cpp + $<$:LauncherPosix.cpp> + $<$:LauncherPosix.cpp> + $<$:LauncherPosix.cpp> + $<$:LauncherPosix.cpp> + $<$:LauncherPosix.cpp> +) + +set(HEADERS + ILauncher.h + LauncherDirectDll.h + $<$:LauncherPosix.h> + $<$:LauncherPosix.h> + $<$:LauncherPosix.h> + $<$:LauncherPosix.h> + $<$:LauncherPosix.h> +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_launcher) +endif() diff --git a/xbmc/addons/interface/launcher/ILauncher.h b/xbmc/addons/interface/launcher/ILauncher.h new file mode 100644 index 0000000000000..3a597fa95c314 --- /dev/null +++ b/xbmc/addons/interface/launcher/ILauncher.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include +#include +#include +#include + +namespace ADDON +{ + class IAddon; +} + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +enum class ChildStatus +{ + Running, + NotStarted, + ExitedNormal, + StoppedBySignal, + StoppedByUnknown, + KilledFromOutside, + SeqmentionFault, +}; + +class ILauncher +{ +public: + ILauncher(std::shared_ptr addonInfo, const std::string& uuid) + : m_addonInfo(addonInfo), + m_uuid(uuid) + { + } + virtual ~ILauncher() = default; + + virtual bool Launch(const std::vector& argv, bool waitForExit) = 0; + virtual bool Kill(bool wait = true) = 0; + virtual int64_t GetMainProcessPID() const = 0; + virtual ChildStatus ProcessActive() = 0; + virtual bool SupportNonBlocking() { return false; } + virtual bool SupportNonBlocking(const std::string& path) { return false; } + + int GetExitCode() const { return m_exitCode; } + ChildStatus GetLastChildStatus() const { return m_lastStatus; } + +protected: + const std::shared_ptr m_addonInfo; + const std::string m_uuid; + + int m_exitCode = 0; + std::atomic m_lastStatus{ChildStatus::NotStarted}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/launcher/LauncherDirectDll.cpp b/xbmc/addons/interface/launcher/LauncherDirectDll.cpp new file mode 100644 index 0000000000000..7760fc09d197d --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherDirectDll.cpp @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "LauncherDirectDll.h" + +#include "addons/IAddon.h" +#include "filesystem/File.h" +#include "filesystem/SpecialProtocol.h" +#include "utils/URIUtils.h" +#include "utils/Variant.h" +#include "utils/log.h" + +using namespace std::chrono_literals; + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CLauncherDirectDll::CLauncherDirectDll(std::shared_ptr addon, const std::string& uuid) + : ILauncher(addon, uuid), + CThread(addon->ID().c_str()) +{ +} + +CLauncherDirectDll::~CLauncherDirectDll() +{ + Kill(true); +} + +bool CLauncherDirectDll::Launch(const std::vector& argv, bool waitForExit) +{ + std::string strFileName = argv[0]; + if (strFileName.empty()) + return false; + + m_argv = argv; + + /* Load the Dll */ + if (!m_pDll) + { + m_pDll = new DllAddon; + m_pDll->SetFile(strFileName); + m_pDll->EnableDelayedUnload(false); + if (!m_pDll->Load()) + { + delete m_pDll; + m_pDll = nullptr; + + return false; + } + } + + if (SupportNonBlocking()) + { + int ret = m_pDll->non_blocking_main_start(m_argv.size(), m_argv.data()); + if (ret != 0) + return false; + } + else if (waitForExit) + { + int ret = m_pDll->main(m_argv.size(), m_argv.data()); + if (ret != 0) + return false; + fprintf(stderr, "%s 5\n", __PRETTY_FUNCTION__); + } + else + { + CThread::Create(); + while (!m_startDone) + { + CThread::Sleep(1ms); + } + CThread::Sleep(10ms); + fprintf(stderr, "%s 6\n", __PRETTY_FUNCTION__); + } + + return true; +} + +bool CLauncherDirectDll::Kill(bool wait) +{ + if (!m_pDll) + return true; + + if (SupportNonBlocking()) + { + m_pDll->non_blocking_main_stop(); + } + else + { + CThread::StopThread(); + } + + /* Unload library file */ + if (m_pDll) + { + m_pDll->Unload(); + delete m_pDll; + m_pDll = nullptr; + } + + return true; +} + +ChildStatus CLauncherDirectDll::ProcessActive() +{ + return m_pDll ? ChildStatus::Running : ChildStatus::ExitedNormal; +} + +std::string CLauncherDirectDll::GetDllPath(const std::string &libPath) +{ + std::string strFileName = libPath; + std::string strLibName = URIUtils::GetFileName(strFileName); + + if (strLibName.empty()) + return ""; + + /* Check if lib being loaded exists, else check in XBMC binary location */ +#if defined(TARGET_ANDROID) + if (XFILE::CFile::Exists(strFileName)) + { + bool doCopy = true; + std::string dstfile = URIUtils::AddFileToFolder(CSpecialProtocol::TranslatePath("special://xbmcaltbinaddons/"), strLibName); + + struct __stat64 dstFileStat; + if (XFILE::CFile::Stat(dstfile, &dstFileStat) == 0) + { + struct __stat64 srcFileStat; + if (XFILE::CFile::Stat(strFileName, &srcFileStat) == 0) + { + if (dstFileStat.st_size == srcFileStat.st_size && dstFileStat.st_mtime > srcFileStat.st_mtime) + doCopy = false; + } + } + + if (doCopy) + { + CLog::Log(LOGDEBUG, "ADDON: caching {} to {}", strFileName, dstfile); + XFILE::CFile::Copy(strFileName, dstfile); + } + + strFileName = dstfile; + } + if (!XFILE::CFile::Exists(strFileName)) + { + std::string tempbin = getenv("KODI_ANDROID_LIBS"); + strFileName = tempbin + "/" + strLibName; + } +#endif + + if (!XFILE::CFile::Exists(strFileName)) + { + std::string strAltFileName; + + std::string altbin = CSpecialProtocol::TranslatePath("special://xbmcaltbinaddons/"); + if (!altbin.empty()) + { + strAltFileName = altbin + strLibName; + if (!XFILE::CFile::Exists(strAltFileName)) + { + std::string temp = CSpecialProtocol::TranslatePath("special://xbmc/addons/"); + strAltFileName = strFileName; + strAltFileName.erase(0, temp.size()); + strAltFileName = altbin + strAltFileName; + } + CLog::Log(LOGDEBUG, "ADDON: Trying to load {}", strAltFileName); + } + + if (XFILE::CFile::Exists(strAltFileName)) + strFileName = strAltFileName; + else + { + std::string temp = CSpecialProtocol::TranslatePath("special://xbmc/"); + std::string tempbin = CSpecialProtocol::TranslatePath("special://xbmcbin/"); + strFileName.erase(0, temp.size()); + strFileName = tempbin + strFileName; + if (!XFILE::CFile::Exists(strFileName)) + { + CLog::Log(LOGERROR, "ADDON: Could not locate {}", strLibName); + strFileName.clear(); + } + } + } + + return strFileName; +} + +void CLauncherDirectDll::Process() +{ + m_startDone = true; + m_pDll->main(m_argv.size(), m_argv.data()); +} + +bool CLauncherDirectDll::SupportNonBlocking() +{ + return m_pDll->non_blocking_main_start_available(); +} + +bool CLauncherDirectDll::SupportNonBlocking(const std::string& path) +{ + /* Load the Dll */ + if (!m_pDll) + { + m_pDll = new DllAddon; + m_pDll->SetFile(path); + m_pDll->EnableDelayedUnload(false); + if (!m_pDll->Load()) + { + delete m_pDll; + m_pDll = nullptr; + + return false; + } + } + + return SupportNonBlocking(); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/launcher/LauncherDirectDll.h b/xbmc/addons/interface/launcher/LauncherDirectDll.h new file mode 100644 index 0000000000000..b0bbfb43c99df --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherDirectDll.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "ILauncher.h" +#include "threads/Thread.h" + +#include "DynamicDll.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class DllAddonInterface +{ +public: + virtual ~DllAddonInterface() = default; + virtual int main(int argc, char* argv[]) = 0; + virtual int non_blocking_main_start(int argc, char* argv[]) = 0; + virtual void non_blocking_main_stop() = 0; +}; + +class DllAddon : public DllDynamic, public DllAddonInterface +{ +public: + DECLARE_DLL_WRAPPER_TEMPLATE(DllAddon) + DEFINE_METHOD2(int, main, (int p1, char* p2[])) + DEFINE_METHOD2(int, non_blocking_main_start, (int p1, char* p2[])) + DEFINE_METHOD0(void, non_blocking_main_stop) + bool main_available() { return m_main != nullptr; } + bool non_blocking_main_start_available() { return m_non_blocking_main_start != nullptr; } + BEGIN_METHOD_RESOLVE() + RESOLVE_METHOD_RENAME_OPTIONAL(main, main) + RESOLVE_METHOD_RENAME_OPTIONAL(non_blocking_main_start, non_blocking_main_start) + RESOLVE_METHOD_RENAME_OPTIONAL(non_blocking_main_stop, non_blocking_main_stop) + END_METHOD_RESOLVE() +}; + +class CLauncherDirectDll : public ILauncher, private CThread +{ +public: + CLauncherDirectDll(std::shared_ptr addon, const std::string& uuid); + ~CLauncherDirectDll(); + + bool Launch(const std::vector& argv, bool waitForExit) override; + bool Kill(bool wait) override; + int64_t GetMainProcessPID() const override { return static_cast(m_pid); } + ChildStatus ProcessActive() override; + bool SupportNonBlocking() override; + bool SupportNonBlocking(const std::string& path) override; + +private: + std::string GetDllPath(const std::string &libPath); + + void Process() override; + + std::atomic_bool m_startDone{false}; + std::vector m_argv; + DllAddon* m_pDll = nullptr; + pid_t m_pid = -1; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/launcher/LauncherPosix.cpp b/xbmc/addons/interface/launcher/LauncherPosix.cpp new file mode 100644 index 0000000000000..93870bcd8f869 --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherPosix.cpp @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux,freebsd,android,osx,darwin_embedded>---*/ + +#include "LauncherPosix.h" + +#include "../../utils/log.h" + +#include +#include +#include +#include + +#if defined(TARGET_LINUX) +#include +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +// Set the calling thread's signal mask to new_sigmask and return +// the previous signal mask. +sigset_t SetSignalMask(const sigset_t& new_sigmask) +{ + sigset_t old_sigmask; +#if defined(OS_ANDROID) + // POSIX says pthread_sigmask() must be used in multi-threaded processes, + // but Android's pthread_sigmask() was broken until 4.1: + // https://code.google.com/p/android/issues/detail?id=15337 + // http://stackoverflow.com/questions/13777109/pthread-sigmask-on-android-not-working + RAW_CHECK(sigprocmask(SIG_SETMASK, &new_sigmask, &old_sigmask) == 0); +#else + RAW_CHECK(pthread_sigmask(SIG_SETMASK, &new_sigmask, &old_sigmask) == 0); +#endif + return old_sigmask; +} + +void ResetChildSignalHandlersToDefaults() +{ + // The previous signal handlers are likely to be meaningless in the child's + // context so we reset them to the defaults for now. http://crbug.com/44953 + // These signal handlers are set up at least in browser_main_posix.cc: + // BrowserMainPartsPosix::PreEarlyInitialization and stack_trace_posix.cc: + // EnableInProcessStackDumping. + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGILL, SIG_DFL); + signal(SIGABRT, SIG_DFL); + signal(SIGFPE, SIG_DFL); + signal(SIGBUS, SIG_DFL); + signal(SIGSEGV, SIG_DFL); + signal(SIGSYS, SIG_DFL); + signal(SIGTERM, SIG_DFL); +} + +CLauncherPosix::CLauncherPosix(std::shared_ptr addon, const std::string& uuid) + : ILauncher(addon, uuid) +{ +} + +bool CLauncherPosix::Launch(const std::vector& argv, bool waitForExit) +{ + using namespace std::chrono; + + sigset_t full_sigset; + sigfillset(&full_sigset); + const sigset_t orig_sigmask = SetSignalMask(full_sigset); + + const auto before_fork = high_resolution_clock::now(); + pid_t pid = fork(); + + // Always restore the original signal mask in the parent. + if (pid != 0) + { + const auto after_fork = high_resolution_clock::now(); + SetSignalMask(orig_sigmask); + + duration fork_time = duration_cast>(after_fork - before_fork); + CLog::Log(LOGDEBUG, "CChildLauncherPosix::{}: Child fork time {}", + __func__, fork_time.count()); + } + + if (pid == -1) + { + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Failed to create child process", __func__); + return false; + } + + if (pid == 0) + { + ResetChildSignalHandlersToDefaults(); + SetSignalMask(orig_sigmask); + +#if defined(TARGET_LINUX) + if (prctl(PR_SET_PDEATHSIG, SIGKILL) != 0) + { + fprintf(stderr, "prctl(PR_SET_PDEATHSIG) failed"); + _exit(127); + } +#endif + + execvp(argv[0], argv.data()); + + _exit(0); + } + + CLog::Log(LOGINFO, + "CChildLauncherPosix::{}: Started child process for webbrowser addon (pid {}) in wait {}", + __func__, pid, waitForExit ? "yes" : "no"); + m_pid = pid; + + if (waitForExit) + { + int status = 0; + pid_t ret = HANDLE_EINTR(waitpid(pid, &status, 0)); + if (ret <= 0) + { + ProcessStatus(status); + m_pid = pid; + } + } + + return true; +} + +bool CLauncherPosix::Kill(bool wait) +{ + fprintf(stderr, "KILL\n"); + if (m_pid) + { + if (m_lastStatus == ChildStatus::Running) + { + int cnt = 10; + while (cnt-- > 0) + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + if (ProcessActive() != ChildStatus::Running) + { + CLog::Log(LOGDEBUG, "CChildLauncherPosix::{}: Child correctly stopped itself (pid {})", + __func__, m_pid); + return true; + } + } + + CLog::Log(LOGDEBUG, "CChildLauncherPosix::{}: Forcing stop of child (pid {})", + __func__, m_pid); + + bool did_terminate = kill(m_pid, SIGTERM) == 0; + + if (wait && did_terminate) + { + cnt = 50; + pid_t ret_pid = 0; + while (ret_pid <= 0 && cnt-- > 0) + { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + ret_pid = HANDLE_EINTR(waitpid(m_pid, nullptr, WNOHANG)); + } + if (ret_pid > 0) + return true; + + did_terminate = kill(m_pid, SIGKILL) == 0; + if (did_terminate) + { + ret_pid = HANDLE_EINTR(waitpid(m_pid, nullptr, 0)); + if (ret_pid > 0) + return true; + } + } + + if (!did_terminate) + { + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Unable to terminate process {}", + __func__, m_pid); + return false; + } + } + } + + return true; +} + +ChildStatus CLauncherPosix::ProcessActive() +{ + int status = 0; + pid_t ret = waitpid(m_pid, &status, WNOHANG | WUNTRACED | WCONTINUED); + if (ret == 0) + { + m_lastStatus = ChildStatus::Running; + } + else if (ret == -1) + { + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Asked sandbox process pid {} no more present", + __func__, m_pid); + if (m_lastStatus == ChildStatus::Running) + m_lastStatus = ChildStatus::StoppedByUnknown; + return m_lastStatus; + } + else + { + ProcessStatus(status); + } + + return m_lastStatus; +} + +void CLauncherPosix::ProcessStatus(int status) +{ + if (WIFEXITED(status)) + { + m_exitCode = WEXITSTATUS(status); + m_lastStatus = ChildStatus::ExitedNormal; + CLog::Log(LOGDEBUG, + "CChildLauncherPosix::{}: Sandbox process pid {}, stopped normal with exit code {}", + __func__, m_pid, m_exitCode); + } + else if (WIFSIGNALED(status)) + { + m_exitCode = WTERMSIG(status); + fprintf(stderr, "<<<<<<<<<<<<< %i %i %i %i %i %i\n", WSTOPSIG(status), WTERMSIG(status), WCOREDUMP(status), WIFSIGNALED(status), WIFSTOPPED(status), WIFEXITED(status)); + if (m_exitCode == SIGSEGV) + { + m_lastStatus = ChildStatus::SeqmentionFault; + CLog::Log(LOGFATAL, "CChildLauncherPosix::{}: Sandbox process pid {} with seqmention fault", + __func__, m_pid, m_exitCode); + } + else + { + m_lastStatus = ChildStatus::StoppedBySignal; + CLog::Log(LOGFATAL, "CChildLauncherPosix::{}: Sandbox process pid {} signaled with {}", + __func__, m_pid, m_exitCode); + } + } + else if (WIFSTOPPED(status)) + { + m_exitCode = WSTOPSIG(status); + m_lastStatus = ChildStatus::StoppedBySignal; + CLog::Log(LOGFATAL, + "CChildLauncherPosix::{}: Sandbox process pid {} stopped from outside with {}", __func__, + m_pid, m_exitCode); + } + else + { + m_lastStatus = ChildStatus::StoppedByUnknown; + CLog::Log(LOGFATAL, + "CChildLauncherPosix::{}: Sandbox process pid {} stopped with unknown status {}", __func__, + m_pid, status); + } +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/launcher/LauncherPosix.h b/xbmc/addons/interface/launcher/LauncherPosix.h new file mode 100644 index 0000000000000..bd3143401151d --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherPosix.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux,freebsd,android,osx,darwin_embedded>---*/ + +#pragma once + +#include "ILauncher.h" + +#define HANDLE_EINTR(x) ({ \ + decltype(x) eintr_wrapper_result; \ + do { \ + eintr_wrapper_result = (x); \ + } while (eintr_wrapper_result == -1 && errno == EINTR); \ + eintr_wrapper_result; \ +}) + +#define RAW_CHECK(condition) \ + do \ + { \ + if (!(condition)) \ + CLog::Log(LOGERROR, "Check failed: " #condition); \ + } while (0) + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CLauncherPosix : public ILauncher +{ +public: + CLauncherPosix(std::shared_ptr addon, const std::string& uuid); + ~CLauncherPosix() = default; + + bool Launch(const std::vector& argv, bool waitForExit) override; + bool Kill(bool wait) override; + int64_t GetMainProcessPID() const override { return static_cast(m_pid); } + ChildStatus ProcessActive() override; + +private: + void ProcessStatus(int status); + + pid_t m_pid = -1; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/CMakeLists.txt b/xbmc/addons/interface/processinfo/CMakeLists.txt new file mode 100644 index 0000000000000..a43abd41a2416 --- /dev/null +++ b/xbmc/addons/interface/processinfo/CMakeLists.txt @@ -0,0 +1,27 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + $<$:ProcessInfoAndroid.cpp> + $<$:ProcessInfoDarwinEmbedded.cpp> + $<$:ProcessInfoFreeBSD.cpp> + $<$:ProcessInfoLinux.cpp> + $<$:ProcessInfoOSX.cpp> + $<$:ProcessInfoWindows.cpp> + $<$:ProcessInfoWindowsStore.cpp> +) + +set(HEADERS + ProcessInfo.h + $<$:ProcessInfoAndroid.h> + $<$:ProcessInfoDarwinEmbedded.h> + $<$:ProcessInfoFreeBSD.h> + $<$:ProcessInfoLinux.h> + $<$:ProcessInfoOSX.h> + $<$:ProcessInfoWindows.h> + $<$:ProcessInfoWindowsStore.h> +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_processinfo) +endif() diff --git a/xbmc/addons/interface/processinfo/ProcessInfo.h b/xbmc/addons/interface/processinfo/ProcessInfo.h new file mode 100644 index 0000000000000..6b685765411c3 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfo.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include + +namespace ADDON +{ + class IAddon; +} + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct ProcessInfoData +{ + std::shared_ptr m_addon; + int64_t m_pid{-1}; + int m_usedThreadsAmount{-1}; + int m_usedCPUPercentage{0}; + uint64_t m_usedPhysicalMemoryAmount{0}; + uint64_t m_usedVirtualMemoryAmount{0}; + uint64_t m_usedSharedMemoryAmount{0}; +}; + +class CProcessInfo +{ +public: + CProcessInfo(std::shared_ptr addon, int64_t pid) + : m_addon(addon), + m_pid(pid) + { + } + virtual ~CProcessInfo() = default; + + virtual ProcessInfoData Calculate() = 0; + +protected: + std::shared_ptr m_addon; + int64_t m_pid; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoAndroid.cpp b/xbmc/addons/interface/processinfo/ProcessInfoAndroid.cpp new file mode 100644 index 0000000000000..b481492d91340 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoAndroid.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:android>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoAndroid.h b/xbmc/addons/interface/processinfo/ProcessInfoAndroid.h new file mode 100644 index 0000000000000..eaf9a5dd206f6 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoAndroid.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:android>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.cpp b/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.cpp new file mode 100644 index 0000000000000..0be8eccc1c322 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:darwin_embedded>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.h b/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.h new file mode 100644 index 0000000000000..32cdcdfb5024d --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:darwin_embedded>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.cpp b/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.cpp new file mode 100644 index 0000000000000..1e44a2160986d --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:freebsd>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.h b/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.h new file mode 100644 index 0000000000000..cbda706313ad7 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:freebsd>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoLinux.cpp b/xbmc/addons/interface/processinfo/ProcessInfoLinux.cpp new file mode 100644 index 0000000000000..7e6a6d946ec77 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoLinux.cpp @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux>---*/ + +#include "ProcessInfoLinux.h" +#include "utils/StringUtils.h" +#include "utils/TimeUtils.h" + +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +#define m_lastTotalUser CProcessInfo::m_value1; +#define m_lastTotalUserLow CProcessInfo::m_value2; +#define m_lastTotalSys CProcessInfo::m_value3; +#define m_lastTotalIdle CProcessInfo::m_value4; + +CProcessInfoLinux::CProcessInfoLinux(std::shared_ptr addon, int64_t used_pid) + : CProcessInfo(addon, used_pid) +{ + m_currentInfo.m_addon = m_addon; + + std::ifstream procstat_stream("/proc/stat", std::ios_base::in); + std::string line; + std::getline(procstat_stream, line); + + uint64_t user; + uint64_t nice2; + uint64_t system; + uint64_t idle; + sscanf(line.c_str(), "%*s %lu %lu %lu %lu", &user, &nice2, &system, &idle); + m_lastTotalCPU = user + nice2 + system + idle; + + char buf[128]; + snprintf(buf, sizeof(buf), "/proc/%ld/stat", m_pid); + std::ifstream stat_stream(buf, std::ios_base::in); + + int64_t pid; + std::string comm; + char state[1]; + int ppid; + int pgrp; + int session; + int tty_nr; + int tpgid; + unsigned int flags; + uint32_t minflt; + uint32_t cminflt; + uint32_t majflt; + uint32_t cmajflt; + uint32_t utime; + uint32_t stime; + int32_t cutime; + int32_t cstime; + int32_t priority; + int32_t nice; + int32_t num_threads; + int32_t itrealvalue; + uint64_t starttime; + uint32_t vsize; + uint32_t rss; + + stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr + >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt + >> utime >> stime >> cutime >> cstime >> priority >> nice + >> num_threads >> itrealvalue >> starttime >> vsize >> rss; + + stat_stream.close(); + + m_lastProcessCPU = utime + stime; + + std::ifstream cpuinfo_stream("/proc/cpuinfo", std::ios_base::in); + for (std::string line; std::getline(cpuinfo_stream, line); ) + { + if (StringUtils::StartsWith(line, "processor")) + { + ++m_numProcessors; + } + } +} + +ProcessInfoData CProcessInfoLinux::Calculate() +{ + if (CTimeUtils::GetFrameTime() - m_lastInfoTime < UPDATE_INTERVAL) + return m_currentInfo; + + m_lastInfoTime = CTimeUtils::GetFrameTime(); + + char buf[128]; + snprintf(buf, sizeof(buf), "/proc/%ld/stat", m_pid); + std::ifstream stat_stream(buf, std::ios_base::in); + + int64_t pid; + std::string comm; + char state[1]; + int ppid; + int pgrp; + int session; + int tty_nr; + int tpgid; + unsigned int flags; + uint32_t minflt; + uint32_t cminflt; + uint32_t majflt; + uint32_t cmajflt; + uint64_t utime; + uint64_t stime; + uint64_t cutime; + uint64_t cstime; + int32_t priority; + int32_t nice; + int32_t num_threads; + int32_t itrealvalue; + uint64_t starttime; + uint32_t vsize; + uint32_t rss; + + stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr + >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt + >> utime >> stime >> cutime >> cstime >> priority >> nice + >> num_threads >> itrealvalue >> starttime >> vsize >> rss; + + stat_stream.close(); + + m_currentInfo.m_pid = pid; + + snprintf(buf, sizeof(buf), "/proc/%ld/status", m_pid); + std::ifstream status_stream(buf, std::ios_base::in); + for (std::string line; std::getline(status_stream, line); ) + { + StringUtils::RemoveDuplicatedSpacesAndTabs(line); + if (StringUtils::StartsWith(line, "RssShmem:")) + { + m_currentInfo.m_usedSharedMemoryAmount = atoll(line.c_str() + sizeof("RssShmem:")) * 1024; + } + else if (StringUtils::StartsWith(line, "VmSize:")) + { + m_currentInfo.m_usedVirtualMemoryAmount = atoll(line.c_str() + sizeof("VmSize:")) * 1024; + } + else if (StringUtils::StartsWith(line, "VmRSS:")) + { + m_currentInfo.m_usedPhysicalMemoryAmount = atoll(line.c_str() + sizeof("VmRSS:")) * 1024; + } + else if (StringUtils::StartsWith(line, "Threads:")) + { + m_currentInfo.m_usedThreadsAmount = atoll(line.c_str() + sizeof("Threads:")); + } + } + + std::ifstream procstat_stream("/proc/stat", std::ios_base::in); + std::string line; + std::getline(procstat_stream, line); + + uint64_t user; + uint64_t nice2; + uint64_t system; + uint64_t idle; + sscanf(line.c_str(), "%*s %lu %lu %lu %lu", &user, &nice2, &system, &idle); + uint64_t currentTotalCPU = user + nice2 + system + idle; + uint64_t currentProcessCPU = utime + stime; + + m_currentInfo.m_usedCPUPercentage = m_numProcessors * (currentProcessCPU - m_lastProcessCPU) * 100 / (float) (currentTotalCPU - m_lastTotalCPU); + + m_lastTotalCPU = currentTotalCPU; + m_lastProcessCPU = currentProcessCPU; + + return m_currentInfo; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoLinux.h b/xbmc/addons/interface/processinfo/ProcessInfoLinux.h new file mode 100644 index 0000000000000..24335711d1bd0 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoLinux.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CProcessInfoLinux : public CProcessInfo +{ +public: + CProcessInfoLinux(std::shared_ptr addon, int64_t pid); + + ProcessInfoData Calculate() override; + +private: + static const int UPDATE_INTERVAL = 500; + mutable unsigned int m_lastInfoTime{static_cast(-UPDATE_INTERVAL)}; + + uint64_t m_lastTotalCPU; + uint64_t m_lastProcessCPU; + int m_numProcessors{0}; + ProcessInfoData m_currentInfo; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoOSX.cpp b/xbmc/addons/interface/processinfo/ProcessInfoOSX.cpp new file mode 100644 index 0000000000000..c79f9ef7abff0 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoOSX.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:osx>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoOSX.h b/xbmc/addons/interface/processinfo/ProcessInfoOSX.h new file mode 100644 index 0000000000000..833d637bca920 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoOSX.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:osx>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoWindows.cpp b/xbmc/addons/interface/processinfo/ProcessInfoWindows.cpp new file mode 100644 index 0000000000000..9985e76ab0b4a --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoWindows.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:windows>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoWindows.h b/xbmc/addons/interface/processinfo/ProcessInfoWindows.h new file mode 100644 index 0000000000000..b83b3ca700350 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoWindows.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:windows>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.cpp b/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.cpp new file mode 100644 index 0000000000000..31a49181375e2 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:windowsstore>---*/ + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.h b/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.h new file mode 100644 index 0000000000000..9112b3fc0869d --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:windowsstore>---*/ + +#pragma once + +#include "ProcessInfo.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/tools/CMakeLists.txt b/xbmc/addons/interface/tools/CMakeLists.txt new file mode 100644 index 0000000000000..e88ea3486fd47 --- /dev/null +++ b/xbmc/addons/interface/tools/CMakeLists.txt @@ -0,0 +1,14 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + GUITranslator.cpp +) + +set(HEADERS + GUITranslator.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_tools) +endif() diff --git a/xbmc/addons/interfaces/gui/GUITranslator.cpp b/xbmc/addons/interface/tools/GUITranslator.cpp similarity index 99% rename from xbmc/addons/interfaces/gui/GUITranslator.cpp rename to xbmc/addons/interface/tools/GUITranslator.cpp index 2db26011ac9d9..058c0df6ff377 100644 --- a/xbmc/addons/interfaces/gui/GUITranslator.cpp +++ b/xbmc/addons/interface/tools/GUITranslator.cpp @@ -10,7 +10,7 @@ #include "input/actions/ActionIDs.h" -using namespace ADDON; +using namespace KODI::ADDONS::INTERFACE; ADDON_ACTION CAddonGUITranslator::TranslateActionIdToAddon(int kodiId) { diff --git a/xbmc/addons/interfaces/gui/GUITranslator.h b/xbmc/addons/interface/tools/GUITranslator.h similarity index 87% rename from xbmc/addons/interfaces/gui/GUITranslator.h rename to xbmc/addons/interface/tools/GUITranslator.h index 8bd6b5c1ef4a3..42dddede2f5fc 100644 --- a/xbmc/addons/interfaces/gui/GUITranslator.h +++ b/xbmc/addons/interface/tools/GUITranslator.h @@ -10,7 +10,11 @@ #include "addons/kodi-dev-kit/include/kodi/c-api/gui/input/action_ids.h" -namespace ADDON +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE { /*! @@ -38,4 +42,6 @@ class CAddonGUITranslator static int TranslateActionIdToKodi(ADDON_ACTION addonId); }; -} /* namespace ADDON */ +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interfaces/AddonBase.cpp b/xbmc/addons/interfaces/AddonBase.cpp deleted file mode 100644 index f22e26aaf63ba..0000000000000 --- a/xbmc/addons/interfaces/AddonBase.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "AddonBase.h" - -#include "GUIUserMessages.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/gui/GUIDialogAddonSettings.h" -#include "addons/settings/AddonSettings.h" -#include "filesystem/SpecialProtocol.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -// "C" interface addon callback handle classes -#include "AudioEngine.h" -#include "Filesystem.h" -#include "General.h" -#include "Network.h" -#include "gui/General.h" - -namespace ADDON -{ - -std::vector Interface_Base::s_registeredInterfaces; - -bool Interface_Base::InitInterface(CAddonDll* addon, - AddonGlobalInterface& addonInterface, - KODI_HANDLE firstKodiInstance) -{ - addonInterface = {}; - - addonInterface.libBasePath = - strdup(CSpecialProtocol::TranslatePath("special://xbmcbinaddons").c_str()); - addonInterface.kodi_base_api_version = strdup(kodi::addon::GetTypeVersion(ADDON_GLOBAL_MAIN)); - addonInterface.addonBase = nullptr; - addonInterface.globalSingleInstance = nullptr; - addonInterface.firstKodiInstance = firstKodiInstance; - - // Create function list from kodi to addon, generated with malloc to have - // compatible with other versions - addonInterface.toKodi = new AddonToKodiFuncTable_Addon(); - addonInterface.toKodi->kodiBase = addon; - addonInterface.toKodi->get_type_version = get_type_version; - addonInterface.toKodi->get_addon_path = get_addon_path; - addonInterface.toKodi->get_base_user_path = get_base_user_path; - addonInterface.toKodi->addon_log_msg = addon_log_msg; - addonInterface.toKodi->is_setting_using_default = is_setting_using_default; - addonInterface.toKodi->get_setting_bool = get_setting_bool; - addonInterface.toKodi->get_setting_int = get_setting_int; - addonInterface.toKodi->get_setting_float = get_setting_float; - addonInterface.toKodi->get_setting_string = get_setting_string; - addonInterface.toKodi->set_setting_bool = set_setting_bool; - addonInterface.toKodi->set_setting_int = set_setting_int; - addonInterface.toKodi->set_setting_float = set_setting_float; - addonInterface.toKodi->set_setting_string = set_setting_string; - addonInterface.toKodi->free_string = free_string; - addonInterface.toKodi->free_string_array = free_string_array; - addonInterface.toKodi->get_interface = get_interface; - - // Related parts becomes set from addon headers, make here to nullptr to allow - // checks for right set of them - addonInterface.toAddon = new KodiToAddonFuncTable_Addon(); - - // Init the other interfaces - Interface_General::Init(&addonInterface); - Interface_AudioEngine::Init(&addonInterface); - Interface_Filesystem::Init(&addonInterface); - Interface_Network::Init(&addonInterface); - Interface_GUIGeneral::Init(&addonInterface); - - return true; -} - -void Interface_Base::DeInitInterface(AddonGlobalInterface& addonInterface) -{ - Interface_GUIGeneral::DeInit(&addonInterface); - Interface_Network::DeInit(&addonInterface); - Interface_Filesystem::DeInit(&addonInterface); - Interface_AudioEngine::DeInit(&addonInterface); - Interface_General::DeInit(&addonInterface); - - if (addonInterface.libBasePath) - free(const_cast(addonInterface.libBasePath)); - if (addonInterface.kodi_base_api_version) - free(const_cast(addonInterface.kodi_base_api_version)); - - delete addonInterface.toKodi; - delete addonInterface.toAddon; - addonInterface = {}; -} - -void Interface_Base::RegisterInterface(ADDON_GET_INTERFACE_FN fn) -{ - s_registeredInterfaces.push_back(fn); -} - -bool Interface_Base::UpdateSettingInActiveDialog(CAddonDll* addon, - const char* id, - const std::string& value) -{ - if (!CServiceBroker::GetGUI()->GetWindowManager().IsWindowActive(WINDOW_DIALOG_ADDON_SETTINGS)) - return false; - - CGUIDialogAddonSettings* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_ADDON_SETTINGS); - if (dialog->GetCurrentAddonID() != addon->ID()) - return false; - - CGUIMessage message(GUI_MSG_SETTING_UPDATED, 0, 0); - std::vector params; - params.emplace_back(id); - params.push_back(value); - message.SetStringParams(params); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(message, - WINDOW_DIALOG_ADDON_SETTINGS); - - return true; -} - -/*! - * @brief Addon to Kodi basic callbacks below - * - * The amount of functions here are hold so minimal as possible. Only parts - * where needed on nearly every add-on (e.g. addon_log_msg) are to add there. - * - * More specific parts like e.g. to open files should be added to a separate - * part. - */ -//@{ - -char* Interface_Base::get_type_version(void* kodiBase, int type) -{ - return strdup(kodi::addon::GetTypeVersion(type)); -} - -char* Interface_Base::get_addon_path(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "get_addon_path(...) called with empty kodi instance pointer"); - return nullptr; - } - - return strdup(CSpecialProtocol::TranslatePath(addon->Path()).c_str()); -} - -char* Interface_Base::get_base_user_path(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "get_base_user_path(...) called with empty kodi instance pointer"); - return nullptr; - } - - return strdup(CSpecialProtocol::TranslatePath(addon->Profile()).c_str()); -} - -void Interface_Base::addon_log_msg(void* kodiBase, const int addonLogLevel, const char* strMessage) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "addon_log_msg(...) called with empty kodi instance pointer"); - return; - } - - int logLevel = LOGNONE; - switch (addonLogLevel) - { - case ADDON_LOG_DEBUG: - logLevel = LOGDEBUG; - break; - case ADDON_LOG_INFO: - logLevel = LOGINFO; - break; - case ADDON_LOG_WARNING: - logLevel = LOGWARNING; - break; - case ADDON_LOG_ERROR: - logLevel = LOGERROR; - break; - case ADDON_LOG_FATAL: - logLevel = LOGFATAL; - break; - default: - logLevel = LOGDEBUG; - break; - } - - CLog::Log(logLevel, "AddOnLog: {}: {}", addon->ID(), strMessage); -} - -bool Interface_Base::is_setting_using_default(void* kodiBase, const char* id) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, - kodiBase, static_cast(id)); - - return false; - } - - if (!addon->HasSettings()) - { - CLog::Log(LOGERROR, "Interface_Base::{} - couldn't get settings for add-on '{}'", __func__, - addon->Name()); - return false; - } - - auto setting = addon->GetSettings()->GetSetting(id); - if (setting == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - can't find setting '{}' in '{}'", __func__, id, - addon->Name()); - return false; - } - - return setting->IsDefault(); -} - -bool Interface_Base::get_setting_bool(void* kodiBase, const char* id, bool* value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, kodiBase, static_cast(id), static_cast(value)); - - return false; - } - - if (!addon->HasSettings()) - { - CLog::Log(LOGERROR, "Interface_Base::{} - couldn't get settings for add-on '{}'", __func__, - addon->Name()); - return false; - } - - auto setting = addon->GetSettings()->GetSetting(id); - if (setting == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - can't find setting '{}' in '{}'", __func__, id, - addon->Name()); - return false; - } - - if (setting->GetType() != SettingType::Boolean) - { - CLog::Log(LOGERROR, "Interface_Base::{} - setting '{}' is not a boolean in '{}'", __func__, id, - addon->Name()); - return false; - } - - *value = std::static_pointer_cast(setting)->GetValue(); - return true; -} - -bool Interface_Base::get_setting_int(void* kodiBase, const char* id, int* value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, kodiBase, static_cast(id), static_cast(value)); - - return false; - } - - if (!addon->HasSettings()) - { - CLog::Log(LOGERROR, "Interface_Base::{} - couldn't get settings for add-on '{}'", __func__, - addon->Name()); - return false; - } - - auto setting = addon->GetSettings()->GetSetting(id); - if (setting == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - can't find setting '{}' in '{}'", __func__, id, - addon->Name()); - return false; - } - - if (setting->GetType() != SettingType::Integer && setting->GetType() != SettingType::Number) - { - CLog::Log(LOGERROR, "Interface_Base::{} - setting '{}' is not a integer in '{}'", __func__, id, - addon->Name()); - return false; - } - - if (setting->GetType() == SettingType::Integer) - *value = std::static_pointer_cast(setting)->GetValue(); - else - *value = static_cast(std::static_pointer_cast(setting)->GetValue()); - return true; -} - -bool Interface_Base::get_setting_float(void* kodiBase, const char* id, float* value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, kodiBase, static_cast(id), static_cast(value)); - - return false; - } - - if (!addon->HasSettings()) - { - CLog::Log(LOGERROR, "Interface_Base::{} - couldn't get settings for add-on '{}'", __func__, - addon->Name()); - return false; - } - - auto setting = addon->GetSettings()->GetSetting(id); - if (setting == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - can't find setting '{}' in '{}'", __func__, id, - addon->Name()); - return false; - } - - if (setting->GetType() != SettingType::Number) - { - CLog::Log(LOGERROR, "Interface_Base::{} - setting '{}' is not a number in '{}'", __func__, id, - addon->Name()); - return false; - } - - *value = static_cast(std::static_pointer_cast(setting)->GetValue()); - return true; -} - -bool Interface_Base::get_setting_string(void* kodiBase, const char* id, char** value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, kodiBase, static_cast(id), static_cast(value)); - - return false; - } - - if (!addon->HasSettings()) - { - CLog::Log(LOGERROR, "Interface_Base::{} - couldn't get settings for add-on '{}'", __func__, - addon->Name()); - return false; - } - - auto setting = addon->GetSettings()->GetSetting(id); - if (setting == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - can't find setting '{}' in '{}'", __func__, id, - addon->Name()); - return false; - } - - if (setting->GetType() != SettingType::String) - { - CLog::Log(LOGERROR, "Interface_Base::{} - setting '{}' is not a string in '{}'", __func__, id, - addon->Name()); - return false; - } - - *value = strdup(std::static_pointer_cast(setting)->GetValue().c_str()); - return true; -} - -bool Interface_Base::set_setting_bool(void* kodiBase, const char* id, bool value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, - kodiBase, static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, id, value ? "true" : "false")) - return true; - - if (!addon->UpdateSettingBool(id, value)) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid setting type", __func__); - return false; - } - - addon->SaveSettings(); - - return true; -} - -bool Interface_Base::set_setting_int(void* kodiBase, const char* id, int value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, - kodiBase, static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, id, std::to_string(value))) - return true; - - if (!addon->UpdateSettingInt(id, value)) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid setting type", __func__); - return false; - } - - addon->SaveSettings(); - - return true; -} - -bool Interface_Base::set_setting_float(void* kodiBase, const char* id, float value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, - kodiBase, static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, id, StringUtils::Format("{:f}", value))) - return true; - - if (!addon->UpdateSettingNumber(id, static_cast(value))) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid setting type", __func__); - return false; - } - - addon->SaveSettings(); - - return true; -} - -bool Interface_Base::set_setting_string(void* kodiBase, const char* id, const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, kodiBase, static_cast(id), static_cast(value)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, id, value)) - return true; - - if (!addon->UpdateSettingString(id, value)) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid setting type", __func__); - return false; - } - - addon->SaveSettings(); - - return true; -} - -void Interface_Base::free_string(void* kodiBase, char* str) -{ - if (str) - free(str); -} - -void Interface_Base::free_string_array(void* kodiBase, char** arr, int numElements) -{ - if (arr) - { - for (int i = 0; i < numElements; ++i) - { - free(arr[i]); - } - free(arr); - } -} - -void* Interface_Base::get_interface(void* kodiBase, const char* name, const char* version) -{ - if (!name || !version) - return nullptr; - - void* retval(nullptr); - - for (auto fn : s_registeredInterfaces) - if ((retval = fn(name, version))) - break; - - return retval; -} - -//@} - -} // namespace ADDON diff --git a/xbmc/addons/interfaces/AddonBase.h b/xbmc/addons/interfaces/AddonBase.h deleted file mode 100644 index 551866bc43a58..0000000000000 --- a/xbmc/addons/interfaces/AddonBase.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" - -extern "C" -{ -namespace ADDON -{ - -typedef void* (*ADDON_GET_INTERFACE_FN)(const std::string& name, const std::string& version); - -class CAddonDll; - -/*! - * @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-dev-kit/include/kodi/General.h" - */ -struct Interface_Base -{ - static bool InitInterface(CAddonDll* addon, - AddonGlobalInterface& addonInterface, - KODI_HANDLE firstKodiInstance); - static void DeInitInterface(AddonGlobalInterface& addonInterface); - static void RegisterInterface(ADDON_GET_INTERFACE_FN fn); - static bool UpdateSettingInActiveDialog(CAddonDll* addon, - const char* id, - const std::string& value); - - static std::vector s_registeredInterfaces; - - /*! - * @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 char* get_type_version(void* kodiBase, int type); - static char* get_addon_path(void* kodiBase); - static char* get_base_user_path(void* kodiBase); - static void addon_log_msg(void* kodiBase, const int addonLogLevel, const char* strMessage); - static bool is_setting_using_default(void* kodiBase, const char* id); - static bool get_setting_bool(void* kodiBase, const char* id, bool* value); - static bool get_setting_int(void* kodiBase, const char* id, int* value); - static bool get_setting_float(void* kodiBase, const char* id, float* value); - static bool get_setting_string(void* kodiBase, const char* id, char** value); - static bool set_setting_bool(void* kodiBase, const char* id, bool value); - static bool set_setting_int(void* kodiBase, const char* id, int value); - static bool set_setting_float(void* kodiBase, const char* id, float value); - static bool set_setting_string(void* kodiBase, const char* id, const char* value); - static void free_string(void* kodiBase, char* str); - static void free_string_array(void* kodiBase, char** arr, int numElements); - static void* get_interface(void* kodiBase, const char* name, const char* version); - //@} -}; - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/AudioEngine.cpp b/xbmc/addons/interfaces/AudioEngine.cpp deleted file mode 100644 index 6a5e8fc4d659c..0000000000000 --- a/xbmc/addons/interfaces/AudioEngine.cpp +++ /dev/null @@ -1,761 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "AudioEngine.h" - -#include "ServiceBroker.h" -#include "addons/kodi-dev-kit/include/kodi/AddonBase.h" -#include "cores/AudioEngine/Interfaces/AE.h" -#include "cores/AudioEngine/Interfaces/AEStream.h" -#include "cores/AudioEngine/Utils/AEStreamData.h" -#include "utils/log.h" - -using namespace kodi; // addon-dev-kit namespace -using namespace kodi::audioengine; // addon-dev-kit namespace - -namespace ADDON -{ - -void Interface_AudioEngine::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_audioengine = new AddonToKodiFuncTable_kodi_audioengine(); - - // write KODI audio DSP specific add-on function addresses to callback table - addonInterface->toKodi->kodi_audioengine->make_stream = audioengine_make_stream; - addonInterface->toKodi->kodi_audioengine->free_stream = audioengine_free_stream; - addonInterface->toKodi->kodi_audioengine->get_current_sink_format = get_current_sink_format; - - // AEStream add-on function callback table - addonInterface->toKodi->kodi_audioengine->aestream_get_space = aestream_get_space; - addonInterface->toKodi->kodi_audioengine->aestream_add_data = aestream_add_data; - addonInterface->toKodi->kodi_audioengine->aestream_get_delay = aestream_get_delay; - addonInterface->toKodi->kodi_audioengine->aestream_is_buffering = aestream_is_buffering; - addonInterface->toKodi->kodi_audioengine->aestream_get_cache_time = aestream_get_cache_time; - addonInterface->toKodi->kodi_audioengine->aestream_get_cache_total = aestream_get_cache_total; - addonInterface->toKodi->kodi_audioengine->aestream_pause = aestream_pause; - addonInterface->toKodi->kodi_audioengine->aestream_resume = aestream_resume; - addonInterface->toKodi->kodi_audioengine->aestream_drain = aestream_drain; - addonInterface->toKodi->kodi_audioengine->aestream_is_draining = aestream_is_draining; - addonInterface->toKodi->kodi_audioengine->aestream_is_drained = aestream_is_drained; - addonInterface->toKodi->kodi_audioengine->aestream_flush = aestream_flush; - addonInterface->toKodi->kodi_audioengine->aestream_get_volume = aestream_get_volume; - addonInterface->toKodi->kodi_audioengine->aestream_set_volume = aestream_set_volume; - addonInterface->toKodi->kodi_audioengine->aestream_get_amplification = aestream_get_amplification; - addonInterface->toKodi->kodi_audioengine->aestream_set_amplification = aestream_set_amplification; - addonInterface->toKodi->kodi_audioengine->aestream_get_frame_size = aestream_get_frame_size; - addonInterface->toKodi->kodi_audioengine->aestream_get_channel_count = aestream_get_channel_count; - addonInterface->toKodi->kodi_audioengine->aestream_get_sample_rate = aestream_get_sample_rate; - addonInterface->toKodi->kodi_audioengine->aestream_get_data_format = aestream_get_data_format; - addonInterface->toKodi->kodi_audioengine->aestream_get_resample_ratio = - aestream_get_resample_ratio; - addonInterface->toKodi->kodi_audioengine->aestream_set_resample_ratio = - aestream_set_resample_ratio; -} - -void Interface_AudioEngine::DeInit(AddonGlobalInterface* addonInterface) -{ - if (addonInterface->toKodi) /* <-- Safe check, needed so long old addon way is present */ - { - delete addonInterface->toKodi->kodi_audioengine; - addonInterface->toKodi->kodi_audioengine = nullptr; - } -} - -AEChannel Interface_AudioEngine::TranslateAEChannelToKodi(AudioEngineChannel channel) -{ - switch (channel) - { - case AUDIOENGINE_CH_RAW: - return AE_CH_RAW; - case AUDIOENGINE_CH_FL: - return AE_CH_FL; - case AUDIOENGINE_CH_FR: - return AE_CH_FR; - case AUDIOENGINE_CH_FC: - return AE_CH_FC; - case AUDIOENGINE_CH_LFE: - return AE_CH_LFE; - case AUDIOENGINE_CH_BL: - return AE_CH_BL; - case AUDIOENGINE_CH_BR: - return AE_CH_BR; - case AUDIOENGINE_CH_FLOC: - return AE_CH_FLOC; - case AUDIOENGINE_CH_FROC: - return AE_CH_FROC; - case AUDIOENGINE_CH_BC: - return AE_CH_BC; - case AUDIOENGINE_CH_SL: - return AE_CH_SL; - case AUDIOENGINE_CH_SR: - return AE_CH_SR; - case AUDIOENGINE_CH_TFL: - return AE_CH_TFL; - case AUDIOENGINE_CH_TFR: - return AE_CH_TFR; - case AUDIOENGINE_CH_TFC: - return AE_CH_TFC; - case AUDIOENGINE_CH_TC: - return AE_CH_TC; - case AUDIOENGINE_CH_TBL: - return AE_CH_TBL; - case AUDIOENGINE_CH_TBR: - return AE_CH_TBR; - case AUDIOENGINE_CH_TBC: - return AE_CH_TBC; - case AUDIOENGINE_CH_BLOC: - return AE_CH_BLOC; - case AUDIOENGINE_CH_BROC: - return AE_CH_BROC; - case AUDIOENGINE_CH_MAX: - return AE_CH_MAX; - case AUDIOENGINE_CH_NULL: - default: - return AE_CH_NULL; - } -} - -AudioEngineChannel Interface_AudioEngine::TranslateAEChannelToAddon(AEChannel channel) -{ - switch (channel) - { - case AE_CH_RAW: - return AUDIOENGINE_CH_RAW; - case AE_CH_FL: - return AUDIOENGINE_CH_FL; - case AE_CH_FR: - return AUDIOENGINE_CH_FR; - case AE_CH_FC: - return AUDIOENGINE_CH_FC; - case AE_CH_LFE: - return AUDIOENGINE_CH_LFE; - case AE_CH_BL: - return AUDIOENGINE_CH_BL; - case AE_CH_BR: - return AUDIOENGINE_CH_BR; - case AE_CH_FLOC: - return AUDIOENGINE_CH_FLOC; - case AE_CH_FROC: - return AUDIOENGINE_CH_FROC; - case AE_CH_BC: - return AUDIOENGINE_CH_BC; - case AE_CH_SL: - return AUDIOENGINE_CH_SL; - case AE_CH_SR: - return AUDIOENGINE_CH_SR; - case AE_CH_TFL: - return AUDIOENGINE_CH_TFL; - case AE_CH_TFR: - return AUDIOENGINE_CH_TFR; - case AE_CH_TFC: - return AUDIOENGINE_CH_TFC; - case AE_CH_TC: - return AUDIOENGINE_CH_TC; - case AE_CH_TBL: - return AUDIOENGINE_CH_TBL; - case AE_CH_TBR: - return AUDIOENGINE_CH_TBR; - case AE_CH_TBC: - return AUDIOENGINE_CH_TBC; - case AE_CH_BLOC: - return AUDIOENGINE_CH_BLOC; - case AE_CH_BROC: - return AUDIOENGINE_CH_BROC; - case AE_CH_MAX: - return AUDIOENGINE_CH_MAX; - case AE_CH_NULL: - default: - return AUDIOENGINE_CH_NULL; - } -} - -AEDataFormat Interface_AudioEngine::TranslateAEFormatToKodi(AudioEngineDataFormat format) -{ - switch (format) - { - case AUDIOENGINE_FMT_U8: - return AE_FMT_U8; - case AUDIOENGINE_FMT_S16BE: - return AE_FMT_S16BE; - case AUDIOENGINE_FMT_S16LE: - return AE_FMT_S16LE; - case AUDIOENGINE_FMT_S16NE: - return AE_FMT_S16NE; - case AUDIOENGINE_FMT_S32BE: - return AE_FMT_S32BE; - case AUDIOENGINE_FMT_S32LE: - return AE_FMT_S32LE; - case AUDIOENGINE_FMT_S32NE: - return AE_FMT_S32NE; - case AUDIOENGINE_FMT_S24BE4: - return AE_FMT_S24BE4; - case AUDIOENGINE_FMT_S24LE4: - return AE_FMT_S24LE4; - case AUDIOENGINE_FMT_S24NE4: - return AE_FMT_S24NE4; - case AUDIOENGINE_FMT_S24NE4MSB: - return AE_FMT_S24NE4MSB; - case AUDIOENGINE_FMT_S24BE3: - return AE_FMT_S24BE3; - case AUDIOENGINE_FMT_S24LE3: - return AE_FMT_S24LE3; - case AUDIOENGINE_FMT_S24NE3: - return AE_FMT_S24NE3; - case AUDIOENGINE_FMT_DOUBLE: - return AE_FMT_DOUBLE; - case AUDIOENGINE_FMT_FLOAT: - return AE_FMT_FLOAT; - case AUDIOENGINE_FMT_RAW: - return AE_FMT_RAW; - case AUDIOENGINE_FMT_U8P: - return AE_FMT_U8P; - case AUDIOENGINE_FMT_S16NEP: - return AE_FMT_S16NEP; - case AUDIOENGINE_FMT_S32NEP: - return AE_FMT_S32NEP; - case AUDIOENGINE_FMT_S24NE4P: - return AE_FMT_S24NE4P; - case AUDIOENGINE_FMT_S24NE4MSBP: - return AE_FMT_S24NE4MSBP; - case AUDIOENGINE_FMT_S24NE3P: - return AE_FMT_S24NE3P; - case AUDIOENGINE_FMT_DOUBLEP: - return AE_FMT_DOUBLEP; - case AUDIOENGINE_FMT_FLOATP: - return AE_FMT_FLOATP; - case AUDIOENGINE_FMT_MAX: - return AE_FMT_MAX; - case AUDIOENGINE_FMT_INVALID: - default: - return AE_FMT_INVALID; - } -} - -AudioEngineDataFormat Interface_AudioEngine::TranslateAEFormatToAddon(AEDataFormat format) -{ - switch (format) - { - case AE_FMT_U8: - return AUDIOENGINE_FMT_U8; - case AE_FMT_S16BE: - return AUDIOENGINE_FMT_S16BE; - case AE_FMT_S16LE: - return AUDIOENGINE_FMT_S16LE; - case AE_FMT_S16NE: - return AUDIOENGINE_FMT_S16NE; - case AE_FMT_S32BE: - return AUDIOENGINE_FMT_S32BE; - case AE_FMT_S32LE: - return AUDIOENGINE_FMT_S32LE; - case AE_FMT_S32NE: - return AUDIOENGINE_FMT_S32NE; - case AE_FMT_S24BE4: - return AUDIOENGINE_FMT_S24BE4; - case AE_FMT_S24LE4: - return AUDIOENGINE_FMT_S24LE4; - case AE_FMT_S24NE4: - return AUDIOENGINE_FMT_S24NE4; - case AE_FMT_S24NE4MSB: - return AUDIOENGINE_FMT_S24NE4MSB; - case AE_FMT_S24BE3: - return AUDIOENGINE_FMT_S24BE3; - case AE_FMT_S24LE3: - return AUDIOENGINE_FMT_S24LE3; - case AE_FMT_S24NE3: - return AUDIOENGINE_FMT_S24NE3; - case AE_FMT_DOUBLE: - return AUDIOENGINE_FMT_DOUBLE; - case AE_FMT_FLOAT: - return AUDIOENGINE_FMT_FLOAT; - case AE_FMT_RAW: - return AUDIOENGINE_FMT_RAW; - case AE_FMT_U8P: - return AUDIOENGINE_FMT_U8P; - case AE_FMT_S16NEP: - return AUDIOENGINE_FMT_S16NEP; - case AE_FMT_S32NEP: - return AUDIOENGINE_FMT_S32NEP; - case AE_FMT_S24NE4P: - return AUDIOENGINE_FMT_S24NE4P; - case AE_FMT_S24NE4MSBP: - return AUDIOENGINE_FMT_S24NE4MSBP; - case AE_FMT_S24NE3P: - return AUDIOENGINE_FMT_S24NE3P; - case AE_FMT_DOUBLEP: - return AUDIOENGINE_FMT_DOUBLEP; - case AE_FMT_FLOATP: - return AUDIOENGINE_FMT_FLOATP; - case AE_FMT_MAX: - return AUDIOENGINE_FMT_MAX; - case AE_FMT_INVALID: - default: - return AUDIOENGINE_FMT_INVALID; - } -} - -AEStreamHandle* Interface_AudioEngine::audioengine_make_stream(void* kodiBase, - AUDIO_ENGINE_FORMAT* streamFormat, - unsigned int options) -{ - if (!kodiBase || !streamFormat) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamFormat='{}')", - __FUNCTION__, kodiBase, static_cast(streamFormat)); - return nullptr; - } - - IAE* engine = CServiceBroker::GetActiveAE(); - if (!engine) - return nullptr; - - CAEChannelInfo layout; - for (unsigned int ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) - { - if (streamFormat->m_channels[ch] == AUDIOENGINE_CH_NULL) - break; - layout += TranslateAEChannelToKodi(streamFormat->m_channels[ch]); - } - - AEAudioFormat format; - format.m_channelLayout = layout; - format.m_dataFormat = TranslateAEFormatToKodi(streamFormat->m_dataFormat); - format.m_sampleRate = streamFormat->m_sampleRate; - - /* Translate addon options to kodi's options */ - int kodiOption = 0; - if (options & AUDIO_STREAM_FORCE_RESAMPLE) - kodiOption |= AESTREAM_FORCE_RESAMPLE; - if (options & AUDIO_STREAM_PAUSED) - kodiOption |= AESTREAM_PAUSED; - if (options & AUDIO_STREAM_AUTOSTART) - kodiOption |= AESTREAM_AUTOSTART; - - return engine->MakeStream(format, kodiOption); -} - -void Interface_AudioEngine::audioengine_free_stream(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - IAE* engine = CServiceBroker::GetActiveAE(); - if (engine) - engine->FreeStream(static_cast(streamHandle), true); -} - -bool Interface_AudioEngine::get_current_sink_format(void* kodiBase, AUDIO_ENGINE_FORMAT* format) -{ - if (!kodiBase || !format) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', format='{}')", - __FUNCTION__, kodiBase, static_cast(format)); - return false; - } - - IAE* engine = CServiceBroker::GetActiveAE(); - if (!engine) - return false; - - AEAudioFormat sinkFormat; - if (!engine->GetCurrentSinkFormat(sinkFormat)) - { - CLog::Log(LOGERROR, "Interface_AudioEngine::{} - failed to get current sink format from AE!", - __FUNCTION__); - return false; - } - - format->m_dataFormat = TranslateAEFormatToAddon(sinkFormat.m_dataFormat); - format->m_sampleRate = sinkFormat.m_sampleRate; - format->m_frames = sinkFormat.m_frames; - format->m_frameSize = sinkFormat.m_frameSize; - format->m_channelCount = sinkFormat.m_channelLayout.Count(); - for (unsigned int ch = 0; ch < format->m_channelCount && ch < AUDIOENGINE_CH_MAX; ++ch) - { - format->m_channels[ch] = TranslateAEChannelToAddon(sinkFormat.m_channelLayout[ch]); - } - - return true; -} - -unsigned int Interface_AudioEngine::aestream_get_space(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return 0; - } - - return static_cast(streamHandle)->GetSpace(); -} - -unsigned int Interface_AudioEngine::aestream_add_data(void* kodiBase, - AEStreamHandle* streamHandle, - uint8_t* const* data, - unsigned int offset, - unsigned int frames, - double pts, - bool hasDownmix, - double centerMixLevel) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return 0; - } - - if (!CServiceBroker::GetActiveAE()) - return 0; - - IAEStream::ExtData extData; - extData.pts = pts; - extData.hasDownmix = hasDownmix; - extData.centerMixLevel = centerMixLevel; - return static_cast(streamHandle)->AddData(data, offset, frames, &extData); -} - -double Interface_AudioEngine::aestream_get_delay(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0; - - return static_cast(streamHandle)->GetDelay(); -} - -bool Interface_AudioEngine::aestream_is_buffering(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return false; - } - - if (!CServiceBroker::GetActiveAE()) - return false; - - return static_cast(streamHandle)->IsBuffering(); -} - -double Interface_AudioEngine::aestream_get_cache_time(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0; - - return static_cast(streamHandle)->GetCacheTime(); -} - -double Interface_AudioEngine::aestream_get_cache_total(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0; - - return static_cast(streamHandle)->GetCacheTotal(); -} - -void Interface_AudioEngine::aestream_pause(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->Pause(); -} - -void Interface_AudioEngine::aestream_resume(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - static_cast(streamHandle)->Resume(); -} - -void Interface_AudioEngine::aestream_drain(void* kodiBase, AEStreamHandle* streamHandle, bool wait) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->Drain(wait); -} - -bool Interface_AudioEngine::aestream_is_draining(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return false; - } - - if (!CServiceBroker::GetActiveAE()) - return false; - - return static_cast(streamHandle)->IsDraining(); -} - -bool Interface_AudioEngine::aestream_is_drained(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return false; - } - - if (!CServiceBroker::GetActiveAE()) - return false; - - return static_cast(streamHandle)->IsDrained(); -} - -void Interface_AudioEngine::aestream_flush(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->Flush(); -} - -float Interface_AudioEngine::aestream_get_volume(void* kodiBase, AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0f; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0f; - - return static_cast(streamHandle)->GetVolume(); -} - -void Interface_AudioEngine::aestream_set_volume(void* kodiBase, - AEStreamHandle* streamHandle, - float volume) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->SetVolume(volume); -} - -float Interface_AudioEngine::aestream_get_amplification(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0f; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0f; - - return static_cast(streamHandle)->GetAmplification(); -} - -void Interface_AudioEngine::aestream_set_amplification(void* kodiBase, - AEStreamHandle* streamHandle, - float amplify) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->SetAmplification(amplify); -} - -unsigned int Interface_AudioEngine::aestream_get_frame_size(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return 0; - } - - if (!CServiceBroker::GetActiveAE()) - return 0; - - return static_cast(streamHandle)->GetFrameSize(); -} - -unsigned int Interface_AudioEngine::aestream_get_channel_count(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return 0; - } - - if (!CServiceBroker::GetActiveAE()) - return 0; - - return static_cast(streamHandle)->GetChannelCount(); -} - -unsigned int Interface_AudioEngine::aestream_get_sample_rate(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return 0; - } - - if (!CServiceBroker::GetActiveAE()) - return 0; - - return static_cast(streamHandle)->GetSampleRate(); -} - -AudioEngineDataFormat Interface_AudioEngine::aestream_get_data_format(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return AUDIOENGINE_FMT_INVALID; - } - - if (!CServiceBroker::GetActiveAE()) - return AUDIOENGINE_FMT_INVALID; - - return TranslateAEFormatToAddon(static_cast(streamHandle)->GetDataFormat()); -} - -double Interface_AudioEngine::aestream_get_resample_ratio(void* kodiBase, - AEStreamHandle* streamHandle) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return -1.0; - } - - if (!CServiceBroker::GetActiveAE()) - return -1.0; - - return static_cast(streamHandle)->GetResampleRatio(); -} - -void Interface_AudioEngine::aestream_set_resample_ratio(void* kodiBase, - AEStreamHandle* streamHandle, - double ratio) -{ - if (!kodiBase || !streamHandle) - { - CLog::Log(LOGERROR, - "Interface_AudioEngine::{} - invalid stream data (kodiBase='{}', streamHandle='{}')", - __FUNCTION__, kodiBase, static_cast(streamHandle)); - return; - } - - if (!CServiceBroker::GetActiveAE()) - return; - - static_cast(streamHandle)->SetResampleRatio(ratio); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/AudioEngine.h b/xbmc/addons/interfaces/AudioEngine.h deleted file mode 100644 index c8e29d8593167..0000000000000 --- a/xbmc/addons/interfaces/AudioEngine.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/AudioEngine.h" -#include "cores/AudioEngine/Utils/AEChannelData.h" - -extern "C" -{ -namespace ADDON -{ - -struct Interface_AudioEngine -{ - static void Init(AddonGlobalInterface* addonInterface); - static void DeInit(AddonGlobalInterface* addonInterface); - - /** - * @brief Translation functions to separate Kodi and addons - * - * This thought to make it more safe for cases as something changed inside - * Kodi, addons overseen and breaks API, further to have on addons a better - * documentation about this parts. - */ - //@{ - static AEChannel TranslateAEChannelToKodi(AudioEngineChannel channel); - static AudioEngineChannel TranslateAEChannelToAddon(AEChannel channel); - static AEDataFormat TranslateAEFormatToKodi(AudioEngineDataFormat format); - static AudioEngineDataFormat TranslateAEFormatToAddon(AEDataFormat format); - //@} - - /** - * Creates and returns a new handle to an IAEStream in the format specified, this function should never fail - * @param[in] streamFormat Format to use for stream - * @param[in] options A bit field of stream options (see: enum AEStreamOptions) - * @return a new Handle to an IAEStream that will accept data in the requested format - */ - static AEStreamHandle* audioengine_make_stream(void* kodiBase, - AUDIO_ENGINE_FORMAT* streamFormat, - unsigned int options); - - /** - * This method will remove the specifyed stream from the engine. - * For OSX/IOS this is essential to reconfigure the audio output. - * @param[in] streamHandle The stream to be altered - */ - static void audioengine_free_stream(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Get the current sink data format - * - * @param[in] sinkFormat sink data format. For more details see AUDIO_ENGINE_FORMAT. - * @return Returns true on success, else false. - */ - static bool get_current_sink_format(void* kodiBase, AUDIO_ENGINE_FORMAT* sinkFormat); - - /** - * Returns the amount of space available in the stream - * @return The number of bytes AddData will consume - */ - static unsigned int aestream_get_space(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Add planar or interleaved PCM data to the stream - * @param[in] data array of pointers to the planes - * @param[in] offset to frame in frames - * @param[in] frames number of frames - * @return The number of frames consumed - */ - static unsigned int aestream_add_data(void* kodiBase, - AEStreamHandle* streamHandle, - uint8_t* const* data, - unsigned int offset, - unsigned int frames, - double pts, - bool hasDownmix, - double centerMixLevel); - - /** - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @return seconds - */ - static double aestream_get_delay(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns if the stream is buffering - * @return True if the stream is buffering - */ - static bool aestream_is_buffering(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns the time in seconds that it will take - * to underrun the cache if no sample is added. - * @return seconds - */ - static double aestream_get_cache_time(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns the total time in seconds of the cache - * @return seconds - */ - static double aestream_get_cache_total(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Pauses the stream playback - */ - static void aestream_pause(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Resumes the stream after pausing - */ - static void aestream_resume(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Start draining the stream - * @note Once called AddData will not consume more data. - */ - static void aestream_drain(void* kodiBase, AEStreamHandle* streamHandle, bool wait); - - /** - * Returns true if the is stream draining - */ - static bool aestream_is_draining(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns true if the is stream has finished draining - */ - static bool aestream_is_drained(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Flush all buffers dropping the audio data - */ - static void aestream_flush(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Return the stream's current volume level - * @return The volume level between 0.0 and 1.0 - */ - static float aestream_get_volume(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Set the stream's volume level - * @param volume The new volume level between 0.0 and 1.0 - */ - static void aestream_set_volume(void* kodiBase, AEStreamHandle* streamHandle, float volume); - - /** - * Gets the stream's volume amplification in linear units. - * @return The volume amplification factor between 1.0 and 1000.0 - */ - static float aestream_get_amplification(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Sets the stream's volume amplification in linear units. - * @param amplify The volume amplification factor between 1.0 and 1000.0 - */ - static void aestream_set_amplification(void* kodiBase, - AEStreamHandle* streamHandle, - float amplify); - - /** - * Returns the size of one audio frame in bytes (channelCount * resolution) - * @return The size in bytes of one frame - */ - static unsigned int aestream_get_frame_size(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns the number of channels the stream is configured to accept - * @return The channel count - */ - static unsigned int aestream_get_channel_count(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Returns the stream's sample rate, if the stream is using a dynamic sample - * rate, this value will NOT reflect any changes made by calls to SetResampleRatio() - * @return The stream's sample rate (eg, 48000) - */ - static unsigned int aestream_get_sample_rate(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Return the data format the stream has been configured with - * @return The stream's data format (eg, AE_FMT_S16LE) - */ - static AudioEngineDataFormat aestream_get_data_format(void* kodiBase, - AEStreamHandle* streamHandle); - - /** - * Return the resample ratio - * @note This will return an undefined value if the stream is not resampling - * @return the current resample ratio or undefined if the stream is not resampling - */ - static double aestream_get_resample_ratio(void* kodiBase, AEStreamHandle* streamHandle); - - /** - * Sets the resample ratio - * @note This function may return false if the stream is not resampling, if you wish to use this be sure to set the AESTREAM_FORCE_RESAMPLE option - * @param[in] ratio the new sample rate ratio, calculated by ((double)desiredRate / (double)GetSampleRate()) - */ - static void aestream_set_resample_ratio(void* kodiBase, - AEStreamHandle* streamHandle, - double ratio); -}; - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/CMakeLists.txt b/xbmc/addons/interfaces/CMakeLists.txt deleted file mode 100644 index 8e58bb6cf9698..0000000000000 --- a/xbmc/addons/interfaces/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -set(SOURCES AddonBase.cpp - AudioEngine.cpp - General.cpp - Filesystem.cpp - Network.cpp) - -set(HEADERS AddonBase.h - AudioEngine.h - General.h - Filesystem.h - Network.h) - -if(CORE_SYSTEM_NAME STREQUAL android) - list(APPEND SOURCES platform/android/System.cpp) - list(APPEND HEADERS platform/android/System.h) -endif() - -core_add_library(addons_interfaces) diff --git a/xbmc/addons/interfaces/Filesystem.cpp b/xbmc/addons/interfaces/Filesystem.cpp deleted file mode 100644 index 9f5a693817b79..0000000000000 --- a/xbmc/addons/interfaces/Filesystem.cpp +++ /dev/null @@ -1,1183 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Filesystem.h" - -#include "Util.h" -#include "addons/binary-addons/AddonDll.h" -#include "filesystem/CurlFile.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "filesystem/SpecialProtocol.h" -#include "platform/Filesystem.h" -#include "utils/Crc32.h" -#include "utils/HttpHeader.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/log.h" - -#include - -#if defined(TARGET_WINDOWS) -#ifndef S_IFLNK -#define S_IFLNK 0120000 -#endif -#ifndef S_ISBLK -#define S_ISBLK(m) (0) -#endif -#ifndef S_ISSOCK -#define S_ISSOCK(m) (0) -#endif -#ifndef S_ISLNK -#define S_ISLNK(m) ((m & S_IFLNK) != 0) -#endif -#ifndef S_ISCHR -#define S_ISCHR(m) ((m & _S_IFCHR) != 0) -#endif -#ifndef S_ISDIR -#define S_ISDIR(m) ((m & _S_IFDIR) != 0) -#endif -#ifndef S_ISFIFO -#define S_ISFIFO(m) ((m & _S_IFIFO) != 0) -#endif -#ifndef S_ISREG -#define S_ISREG(m) ((m & _S_IFREG) != 0) -#endif -#endif - -using namespace kodi; // addon-dev-kit namespace -using namespace XFILE; - -extern "C" -{ -namespace ADDON -{ - -void Interface_Filesystem::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_filesystem = new AddonToKodiFuncTable_kodi_filesystem(); - - addonInterface->toKodi->kodi_filesystem->can_open_directory = can_open_directory; - addonInterface->toKodi->kodi_filesystem->create_directory = create_directory; - addonInterface->toKodi->kodi_filesystem->directory_exists = directory_exists; - addonInterface->toKodi->kodi_filesystem->remove_directory = remove_directory; - addonInterface->toKodi->kodi_filesystem->remove_directory_recursive = remove_directory_recursive; - addonInterface->toKodi->kodi_filesystem->get_directory = get_directory; - addonInterface->toKodi->kodi_filesystem->free_directory = free_directory; - - addonInterface->toKodi->kodi_filesystem->file_exists = file_exists; - addonInterface->toKodi->kodi_filesystem->stat_file = stat_file; - addonInterface->toKodi->kodi_filesystem->delete_file = delete_file; - addonInterface->toKodi->kodi_filesystem->rename_file = rename_file; - addonInterface->toKodi->kodi_filesystem->copy_file = copy_file; - addonInterface->toKodi->kodi_filesystem->get_file_md5 = get_file_md5; - addonInterface->toKodi->kodi_filesystem->get_cache_thumb_name = get_cache_thumb_name; - addonInterface->toKodi->kodi_filesystem->make_legal_filename = make_legal_filename; - addonInterface->toKodi->kodi_filesystem->make_legal_path = make_legal_path; - addonInterface->toKodi->kodi_filesystem->translate_special_protocol = translate_special_protocol; - addonInterface->toKodi->kodi_filesystem->get_disk_space = get_disk_space; - addonInterface->toKodi->kodi_filesystem->is_internet_stream = is_internet_stream; - addonInterface->toKodi->kodi_filesystem->is_on_lan = is_on_lan; - addonInterface->toKodi->kodi_filesystem->is_remote = is_remote; - addonInterface->toKodi->kodi_filesystem->is_local = is_local; - addonInterface->toKodi->kodi_filesystem->is_url = is_url; - addonInterface->toKodi->kodi_filesystem->get_http_header = get_http_header; - addonInterface->toKodi->kodi_filesystem->get_mime_type = get_mime_type; - addonInterface->toKodi->kodi_filesystem->get_content_type = get_content_type; - addonInterface->toKodi->kodi_filesystem->get_cookies = get_cookies; - - addonInterface->toKodi->kodi_filesystem->http_header_create = http_header_create; - addonInterface->toKodi->kodi_filesystem->http_header_free = http_header_free; - - addonInterface->toKodi->kodi_filesystem->open_file = open_file; - addonInterface->toKodi->kodi_filesystem->open_file_for_write = open_file_for_write; - addonInterface->toKodi->kodi_filesystem->read_file = read_file; - addonInterface->toKodi->kodi_filesystem->read_file_string = read_file_string; - addonInterface->toKodi->kodi_filesystem->write_file = write_file; - addonInterface->toKodi->kodi_filesystem->flush_file = flush_file; - addonInterface->toKodi->kodi_filesystem->seek_file = seek_file; - addonInterface->toKodi->kodi_filesystem->truncate_file = truncate_file; - addonInterface->toKodi->kodi_filesystem->get_file_position = get_file_position; - addonInterface->toKodi->kodi_filesystem->get_file_length = get_file_length; - addonInterface->toKodi->kodi_filesystem->get_file_download_speed = get_file_download_speed; - addonInterface->toKodi->kodi_filesystem->close_file = close_file; - addonInterface->toKodi->kodi_filesystem->get_file_chunk_size = get_file_chunk_size; - addonInterface->toKodi->kodi_filesystem->io_control_get_seek_possible = - io_control_get_seek_possible; - addonInterface->toKodi->kodi_filesystem->io_control_get_cache_status = - io_control_get_cache_status; - addonInterface->toKodi->kodi_filesystem->io_control_set_cache_rate = io_control_set_cache_rate; - addonInterface->toKodi->kodi_filesystem->io_control_set_retry = io_control_set_retry; - addonInterface->toKodi->kodi_filesystem->get_property_values = get_property_values; - - addonInterface->toKodi->kodi_filesystem->curl_create = curl_create; - addonInterface->toKodi->kodi_filesystem->curl_add_option = curl_add_option; - addonInterface->toKodi->kodi_filesystem->curl_open = curl_open; -} - -void Interface_Filesystem::DeInit(AddonGlobalInterface* addonInterface) -{ - if (addonInterface->toKodi) /* <-- Safe check, needed so long old addon way is present */ - { - delete addonInterface->toKodi->kodi_filesystem; - addonInterface->toKodi->kodi_filesystem = nullptr; - } -} - -unsigned int Interface_Filesystem::TranslateFileReadBitsToKodi(unsigned int addonFlags) -{ - unsigned int kodiFlags = 0; - - if (addonFlags & ADDON_READ_TRUNCATED) - kodiFlags |= READ_TRUNCATED; - if (addonFlags & ADDON_READ_CHUNKED) - kodiFlags |= READ_CHUNKED; - if (addonFlags & ADDON_READ_CACHED) - kodiFlags |= READ_CACHED; - if (addonFlags & ADDON_READ_NO_CACHE) - kodiFlags |= READ_NO_CACHE; - if (addonFlags & ADDON_READ_BITRATE) - kodiFlags |= READ_BITRATE; - if (addonFlags & ADDON_READ_MULTI_STREAM) - kodiFlags |= READ_MULTI_STREAM; - if (addonFlags & ADDON_READ_AUDIO_VIDEO) - kodiFlags |= READ_AUDIO_VIDEO; - if (addonFlags & ADDON_READ_AFTER_WRITE) - kodiFlags |= READ_AFTER_WRITE; - if (addonFlags & READ_REOPEN) - kodiFlags |= READ_REOPEN; - - return kodiFlags; -} - -bool Interface_Filesystem::can_open_directory(void* kodiBase, const char* url) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', url='{}')", - __FUNCTION__, kodiBase, static_cast(url)); - return false; - } - - CFileItemList items; - return CDirectory::GetDirectory(url, items, "", DIR_FLAG_DEFAULTS); -} - -bool Interface_Filesystem::create_directory(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{}')", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return CDirectory::Create(path); -} - -bool Interface_Filesystem::directory_exists(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{}')", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return CDirectory::Exists(path); -} - -bool Interface_Filesystem::remove_directory(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{}')", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - // Empty directory - CFileItemList fileItems; - CDirectory::GetDirectory(path, fileItems, "", DIR_FLAG_DEFAULTS); - for (int i = 0; i < fileItems.Size(); ++i) - CFile::Delete(fileItems.Get(i)->GetPath()); - - return CDirectory::Remove(path); -} - -bool Interface_Filesystem::remove_directory_recursive(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{}')", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return CDirectory::RemoveRecursive(path); -} - -static void CFileItemListToVFSDirEntries(VFSDirEntry* entries, const CFileItemList& items) -{ - for (unsigned int i = 0; i < static_cast(items.Size()); ++i) - { - entries[i].label = strdup(items[i]->GetLabel().c_str()); - entries[i].path = strdup(items[i]->GetPath().c_str()); - entries[i].size = items[i]->m_dwSize; - entries[i].folder = items[i]->m_bIsFolder; - items[i]->m_dateTime.GetAsTime(entries[i].date_time); - } -} - -bool Interface_Filesystem::get_directory(void* kodiBase, - const char* path, - const char* mask, - struct VFSDirEntry** items, - unsigned int* num_items) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr || mask == nullptr || items == nullptr || - num_items == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', path='{}', mask='{}', " - "items='{}', num_items='{}'", - __FUNCTION__, kodiBase, static_cast(path), - static_cast(mask), static_cast(items), - static_cast(num_items)); - return false; - } - - CFileItemList fileItems; - if (!CDirectory::GetDirectory(path, fileItems, mask, DIR_FLAG_NO_FILE_DIRS)) - return false; - - if (fileItems.Size() > 0) - { - *num_items = static_cast(fileItems.Size()); - *items = new VFSDirEntry[fileItems.Size()]; - CFileItemListToVFSDirEntries(*items, fileItems); - } - else - { - *num_items = 0; - *items = nullptr; - } - - return true; -} - -void Interface_Filesystem::free_directory(void* kodiBase, - struct VFSDirEntry* items, - unsigned int num_items) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || items == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', items='{}')", - __FUNCTION__, kodiBase, static_cast(items)); - return; - } - - for (unsigned int i = 0; i < num_items; ++i) - { - free(items[i].label); - free(items[i].path); - } - delete[] items; -} - -//------------------------------------------------------------------------------ - -bool Interface_Filesystem::file_exists(void* kodiBase, const char* filename, bool useCache) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}')", - __FUNCTION__, kodiBase, static_cast(filename)); - return false; - } - - return CFile::Exists(filename, useCache); -} - -bool Interface_Filesystem::stat_file(void* kodiBase, - const char* filename, - struct STAT_STRUCTURE* buffer) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr || buffer == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}', buffer='{}')", - __FUNCTION__, kodiBase, static_cast(filename), - static_cast(buffer)); - return false; - } - - struct __stat64 statBuffer; - if (CFile::Stat(filename, &statBuffer) != 0) - return false; - - buffer->deviceId = statBuffer.st_dev; - buffer->fileSerialNumber = statBuffer.st_ino; - buffer->size = statBuffer.st_size; - buffer->accessTime = statBuffer.st_atime; - buffer->modificationTime = statBuffer.st_mtime; - buffer->statusTime = statBuffer.st_ctime; - buffer->isDirectory = S_ISDIR(statBuffer.st_mode); - buffer->isSymLink = S_ISLNK(statBuffer.st_mode); - buffer->isBlock = S_ISBLK(statBuffer.st_mode); - buffer->isCharacter = S_ISCHR(statBuffer.st_mode); - buffer->isFifo = S_ISFIFO(statBuffer.st_mode); - buffer->isRegular = S_ISREG(statBuffer.st_mode); - buffer->isSocket = S_ISSOCK(statBuffer.st_mode); - - return true; -} - -bool Interface_Filesystem::delete_file(void* kodiBase, const char* filename) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}')", - __FUNCTION__, kodiBase, static_cast(filename)); - return false; - } - - return CFile::Delete(filename); -} - -bool Interface_Filesystem::rename_file(void* kodiBase, - const char* filename, - const char* newFileName) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr || newFileName == nullptr) - { - CLog::Log( - LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}', newFileName='{}')", - __FUNCTION__, kodiBase, static_cast(filename), - static_cast(newFileName)); - return false; - } - - return CFile::Rename(filename, newFileName); -} - -bool Interface_Filesystem::copy_file(void* kodiBase, const char* filename, const char* dest) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr || dest == nullptr) - { - CLog::Log( - LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}', dest='{}')", - __FUNCTION__, kodiBase, static_cast(filename), static_cast(dest)); - return false; - } - - return CFile::Copy(filename, dest); -} - -char* Interface_Filesystem::get_file_md5(void* kodiBase, const char* filename) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{})", - __FUNCTION__, kodiBase, static_cast(filename)); - return nullptr; - } - - std::string string = CUtil::GetFileDigest(filename, KODI::UTILITY::CDigest::Type::MD5); - char* buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::get_cache_thumb_name(void* kodiBase, const char* filename) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{})", - __FUNCTION__, kodiBase, static_cast(filename)); - return nullptr; - } - - const auto crc = Crc32::ComputeFromLowerCase(filename); - const auto hex = StringUtils::Format("{:08x}.tbn", crc); - char* buffer = strdup(hex.c_str()); - return buffer; -} - -char* Interface_Filesystem::make_legal_filename(void* kodiBase, const char* filename) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{})", - __FUNCTION__, kodiBase, static_cast(filename)); - return nullptr; - } - - std::string string = CUtil::MakeLegalFileName(filename); - char* buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::make_legal_path(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return nullptr; - } - - std::string string = CUtil::MakeLegalPath(path); - char* buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::translate_special_protocol(void* kodiBase, const char* strSource) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || strSource == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', strSource='{})", - __FUNCTION__, kodiBase, static_cast(strSource)); - return nullptr; - } - - return strdup(CSpecialProtocol::TranslatePath(strSource).c_str()); -} - -bool Interface_Filesystem::get_disk_space( - void* kodiBase, const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) -{ - using namespace KODI::PLATFORM::FILESYSTEM; - - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr || capacity == nullptr || free == nullptr || - available == nullptr) - { - CLog::Log( - LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', path='{}, capacity='{}, free='{}, " - "available='{})", - __FUNCTION__, kodiBase, static_cast(path), static_cast(capacity), - static_cast(free), static_cast(available)); - return false; - } - - std::error_code ec; - auto freeSpace = space(CSpecialProtocol::TranslatePath(path), ec); - if (ec.value() != 0) - return false; - - *capacity = freeSpace.capacity; - *free = freeSpace.free; - *available = freeSpace.available; - return true; -} - -bool Interface_Filesystem::is_internet_stream(void* kodiBase, const char* path, bool strictCheck) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return URIUtils::IsInternetStream(path, strictCheck); -} - -bool Interface_Filesystem::is_on_lan(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return URIUtils::IsOnLAN(path); -} - -bool Interface_Filesystem::is_remote(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return URIUtils::IsRemote(path); -} - -bool Interface_Filesystem::is_local(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return CURL(path).IsLocal(); -} - -bool Interface_Filesystem::is_url(void* kodiBase, const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || path == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', path='{})", - __FUNCTION__, kodiBase, static_cast(path)); - return false; - } - - return URIUtils::IsURL(path); -} - -bool Interface_Filesystem::get_mime_type(void* kodiBase, - const char* url, - char** content, - const char* useragent) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr || content == nullptr || useragent == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', url='{}', content='{}', " - "useragent='{}')", - __FUNCTION__, kodiBase, static_cast(url), - static_cast(content), static_cast(useragent)); - return false; - } - - std::string kodiContent; - bool ret = XFILE::CCurlFile::GetMimeType(CURL(url), kodiContent, useragent); - if (ret && !kodiContent.empty()) - { - *content = strdup(kodiContent.c_str()); - } - return ret; -} - -bool Interface_Filesystem::get_content_type(void* kodiBase, - const char* url, - char** content, - const char* useragent) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr || content == nullptr || useragent == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', url='{}', content='{}', " - "useragent='{}')", - __FUNCTION__, kodiBase, static_cast(url), - static_cast(content), static_cast(useragent)); - return false; - } - - std::string kodiContent; - bool ret = XFILE::CCurlFile::GetContentType(CURL(url), kodiContent, useragent); - if (ret && !kodiContent.empty()) - { - *content = strdup(kodiContent.c_str()); - } - return ret; -} - -bool Interface_Filesystem::get_cookies(void* kodiBase, const char* url, char** cookies) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr || cookies == nullptr) - { - CLog::Log( - LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', url='{}', cookies='{}')", - __FUNCTION__, kodiBase, static_cast(url), static_cast(cookies)); - return false; - } - - std::string kodiCookies; - bool ret = XFILE::CCurlFile::GetCookies(CURL(url), kodiCookies); - if (ret && !kodiCookies.empty()) - { - *cookies = strdup(kodiCookies.c_str()); - } - return ret; -} - -bool Interface_Filesystem::get_http_header(void* kodiBase, - const char* url, - struct KODI_HTTP_HEADER* headers) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr || headers == nullptr || headers->handle == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', url='{}', headers='{}', " - "headers->handle='{}')", - __FUNCTION__, kodiBase, static_cast(url), - static_cast(headers), headers->handle); - return false; - } - - CHttpHeader* httpHeader = static_cast(headers->handle); - return XFILE::CCurlFile::GetHttpHeader(CURL(url), *httpHeader); -} - -//------------------------------------------------------------------------------ - -bool Interface_Filesystem::http_header_create(void* kodiBase, struct KODI_HTTP_HEADER* headers) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || headers == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', headers='{}')", - __FUNCTION__, kodiBase, static_cast(headers)); - return false; - } - - headers->handle = new CHttpHeader; - headers->get_value = http_header_get_value; - headers->get_values = http_header_get_values; - headers->get_header = http_header_get_header; - headers->get_mime_type = http_header_get_mime_type; - headers->get_charset = http_header_get_charset; - headers->get_proto_line = http_header_get_proto_line; - - return true; -} - -void Interface_Filesystem::http_header_free(void* kodiBase, struct KODI_HTTP_HEADER* headers) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || headers == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', headers='{}')", - __FUNCTION__, kodiBase, static_cast(headers)); - return; - } - - delete static_cast(headers->handle); - headers->handle = nullptr; -} - -char* Interface_Filesystem::http_header_get_value(void* kodiBase, void* handle, const char* param) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr || param == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}', param='{}')", - __FUNCTION__, kodiBase, handle, static_cast(param)); - return nullptr; - } - - std::string string = static_cast(handle)->GetValue(param); - - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -char** Interface_Filesystem::http_header_get_values(void* kodiBase, - void* handle, - const char* param, - int* length) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr || param == nullptr || length == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}', param='{}', " - "length='{}')", - __FUNCTION__, kodiBase, handle, static_cast(param), - static_cast(length)); - return nullptr; - } - - - std::vector values = static_cast(handle)->GetValues(param); - *length = values.size(); - char** ret = static_cast(malloc(sizeof(char*) * values.size())); - for (int i = 0; i < *length; ++i) - { - ret[i] = strdup(values[i].c_str()); - } - return ret; -} - -char* Interface_Filesystem::http_header_get_header(void* kodiBase, void* handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}')", - __FUNCTION__, kodiBase, handle); - return nullptr; - } - - std::string string = static_cast(handle)->GetHeader(); - - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::http_header_get_mime_type(void* kodiBase, void* handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}')", - __FUNCTION__, kodiBase, handle); - return nullptr; - } - - std::string string = static_cast(handle)->GetMimeType(); - - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::http_header_get_charset(void* kodiBase, void* handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}')", - __FUNCTION__, kodiBase, handle); - return nullptr; - } - - std::string string = static_cast(handle)->GetCharset(); - - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Filesystem::http_header_get_proto_line(void* kodiBase, void* handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || handle == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', handle='{}')", - __FUNCTION__, kodiBase, handle); - return nullptr; - } - - std::string string = static_cast(handle)->GetProtoLine(); - - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -//------------------------------------------------------------------------------ - -void* Interface_Filesystem::open_file(void* kodiBase, const char* filename, unsigned int flags) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}')", - __FUNCTION__, kodiBase, static_cast(filename)); - return nullptr; - } - - CFile* file = new CFile; - if (file->Open(filename, TranslateFileReadBitsToKodi(flags))) - return static_cast(file); - - delete file; - return nullptr; -} - -void* Interface_Filesystem::open_file_for_write(void* kodiBase, - const char* filename, - bool overwrite) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || filename == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', filename='{}')", - __FUNCTION__, kodiBase, static_cast(filename)); - return nullptr; - } - - CFile* file = new CFile; - if (file->OpenForWrite(filename, overwrite)) - return static_cast(file); - - delete file; - return nullptr; -} - -ssize_t Interface_Filesystem::read_file(void* kodiBase, void* file, void* ptr, size_t size) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || ptr == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}', ptr='{}')", - __FUNCTION__, kodiBase, file, ptr); - return -1; - } - - return static_cast(file)->Read(ptr, size); -} - -bool Interface_Filesystem::read_file_string(void* kodiBase, - void* file, - char* szLine, - int lineLength) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || szLine == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', file='{}', szLine=='{}')", - __FUNCTION__, kodiBase, file, static_cast(szLine)); - return false; - } - - return static_cast(file)->ReadString(szLine, lineLength); -} - -ssize_t Interface_Filesystem::write_file(void* kodiBase, void* file, const void* ptr, size_t size) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || ptr == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}', ptr='{}')", - __FUNCTION__, kodiBase, file, ptr); - return -1; - } - - return static_cast(file)->Write(ptr, size); -} - -void Interface_Filesystem::flush_file(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return; - } - - static_cast(file)->Flush(); -} - -int64_t Interface_Filesystem::seek_file(void* kodiBase, void* file, int64_t position, int whence) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return -1; - } - - return static_cast(file)->Seek(position, whence); -} - -int Interface_Filesystem::truncate_file(void* kodiBase, void* file, int64_t size) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return -1; - } - - return static_cast(file)->Truncate(size); -} - -int64_t Interface_Filesystem::get_file_position(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return -1; - } - - return static_cast(file)->GetPosition(); -} - -int64_t Interface_Filesystem::get_file_length(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return -1; - } - - return static_cast(file)->GetLength(); -} - -double Interface_Filesystem::get_file_download_speed(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return 0.0; - } - - return static_cast(file)->GetDownloadSpeed(); -} - -void Interface_Filesystem::close_file(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return; - } - - static_cast(file)->Close(); - delete static_cast(file); -} - -int Interface_Filesystem::get_file_chunk_size(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, - kodiBase, file); - return -1; - } - - return static_cast(file)->GetChunkSize(); -} - -bool Interface_Filesystem::io_control_get_seek_possible(void* kodiBase, void* file) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, - kodiBase, file); - return false; - } - - return static_cast(file)->IoControl(EIoControl::IOCTRL_SEEK_POSSIBLE, nullptr) != 0 - ? true - : false; -} - -bool Interface_Filesystem::io_control_get_cache_status(void* kodiBase, - void* file, - struct VFS_CACHE_STATUS_DATA* status) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || status == nullptr) - { - CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}, status='{}')", - __FUNCTION__, kodiBase, file, static_cast(status)); - return false; - } - - SCacheStatus data = {}; - int ret = static_cast(file)->IoControl(EIoControl::IOCTRL_CACHE_STATUS, &data); - if (ret >= 0) - { - status->forward = data.forward; - status->maxrate = data.maxrate; - status->currate = data.currate; - status->lowspeed = data.lowspeed; - return true; - } - return false; -} - -bool Interface_Filesystem::io_control_set_cache_rate(void* kodiBase, void* file, unsigned int rate) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, - kodiBase, file); - return false; - } - - return static_cast(file)->IoControl(EIoControl::IOCTRL_CACHE_SETRATE, &rate) >= 0 ? true - : false; -} - -bool Interface_Filesystem::io_control_set_retry(void* kodiBase, void* file, bool retry) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, - kodiBase, file); - return false; - } - - return static_cast(file)->IoControl(EIoControl::IOCTRL_SET_RETRY, &retry) >= 0 ? true - : false; -} - -char** Interface_Filesystem::get_property_values( - void* kodiBase, void* file, int type, const char* name, int* numValues) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || name == nullptr || numValues == nullptr) - { - CLog::Log(LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', file='{}', name='{}', " - "numValues='{}')", - __FUNCTION__, kodiBase, file, static_cast(name), - static_cast(numValues)); - return nullptr; - } - - XFILE::FileProperty internalType; - switch (type) - { - case ADDON_FILE_PROPERTY_RESPONSE_PROTOCOL: - internalType = XFILE::FILE_PROPERTY_RESPONSE_PROTOCOL; - break; - case ADDON_FILE_PROPERTY_RESPONSE_HEADER: - internalType = XFILE::FILE_PROPERTY_RESPONSE_HEADER; - break; - case ADDON_FILE_PROPERTY_CONTENT_TYPE: - internalType = XFILE::FILE_PROPERTY_CONTENT_TYPE; - break; - case ADDON_FILE_PROPERTY_CONTENT_CHARSET: - internalType = XFILE::FILE_PROPERTY_CONTENT_CHARSET; - break; - case ADDON_FILE_PROPERTY_MIME_TYPE: - internalType = XFILE::FILE_PROPERTY_MIME_TYPE; - break; - case ADDON_FILE_PROPERTY_EFFECTIVE_URL: - internalType = XFILE::FILE_PROPERTY_EFFECTIVE_URL; - break; - default: - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return nullptr; - }; - std::vector values = - static_cast(file)->GetPropertyValues(internalType, name); - *numValues = values.size(); - char** ret = static_cast(malloc(sizeof(char*) * values.size())); - for (int i = 0; i < *numValues; ++i) - { - ret[i] = strdup(values[i].c_str()); - } - return ret; -} - -void* Interface_Filesystem::curl_create(void* kodiBase, const char* url) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', url='{}')", - __FUNCTION__, kodiBase, static_cast(url)); - return nullptr; - } - - CFile* file = new CFile; - if (file->CURLCreate(url)) - return static_cast(file); - - delete file; - return nullptr; -} - -bool Interface_Filesystem::curl_add_option( - void* kodiBase, void* file, int type, const char* name, const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr || name == nullptr || value == nullptr) - { - CLog::Log( - LOGERROR, - "Interface_Filesystem::{} - invalid data (addon='{}', file='{}', name='{}', value='{}')", - __FUNCTION__, kodiBase, file, static_cast(name), - static_cast(value)); - return false; - } - - XFILE::CURLOPTIONTYPE internalType; - switch (type) - { - case ADDON_CURL_OPTION_OPTION: - internalType = XFILE::CURL_OPTION_OPTION; - break; - case ADDON_CURL_OPTION_PROTOCOL: - internalType = XFILE::CURL_OPTION_PROTOCOL; - break; - case ADDON_CURL_OPTION_CREDENTIALS: - internalType = XFILE::CURL_OPTION_CREDENTIALS; - break; - case ADDON_CURL_OPTION_HEADER: - internalType = XFILE::CURL_OPTION_HEADER; - break; - default: - throw std::logic_error("Interface_Filesystem::curl_add_option - invalid curl option type"); - return false; - }; - - return static_cast(file)->CURLAddOption(internalType, name, value); -} - -bool Interface_Filesystem::curl_open(void* kodiBase, void* file, unsigned int flags) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || file == nullptr) - { - CLog::Log(LOGERROR, "Interface_Filesystem::{} - invalid data (addon='{}', file='{}')", - __FUNCTION__, kodiBase, file); - return false; - } - - return static_cast(file)->CURLOpen(TranslateFileReadBitsToKodi(flags)); -} - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/Filesystem.h b/xbmc/addons/interfaces/Filesystem.h deleted file mode 100644 index be2d0246b93c8..0000000000000 --- a/xbmc/addons/interfaces/Filesystem.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/Filesystem.h" - -extern "C" -{ - -struct VFSDirEntry; -struct AddonGlobalInterface; - -namespace ADDON -{ - -struct Interface_Filesystem -{ - static void Init(AddonGlobalInterface* addonInterface); - static void DeInit(AddonGlobalInterface* addonInterface); - - static unsigned int TranslateFileReadBitsToKodi(unsigned int addonFlags); - - /*! - * @brief callback functions from add-on to kodi - * - * @note For add of new functions use the "_" style to identify direct a - * add-on callback function. Everything with CamelCase is only for the - * usage in Kodi only. - * - * The parameter `kodiBase` is used to become the pointer for a `CAddonDll` - * class. - */ - ///@{ - static bool can_open_directory(void* kodiBase, const char* url); - static bool create_directory(void* kodiBase, const char* path); - static bool directory_exists(void* kodiBase, const char* path); - static bool remove_directory(void* kodiBase, const char* path); - static bool remove_directory_recursive(void* kodiBase, const char* path); - static bool get_directory(void* kodiBase, - const char* path, - const char* mask, - struct VFSDirEntry** items, - unsigned int* num_items); - static void free_directory(void* kodiBase, struct VFSDirEntry* items, unsigned int num_items); - - static bool file_exists(void* kodiBase, const char* filename, bool useCache); - static bool stat_file(void* kodiBase, const char* filename, struct STAT_STRUCTURE* buffer); - static bool delete_file(void* kodiBase, const char* filename); - static bool rename_file(void* kodiBase, const char* filename, const char* newFileName); - static bool copy_file(void* kodiBase, const char* filename, const char* dest); - static char* get_file_md5(void* kodiBase, const char* filename); - static char* get_cache_thumb_name(void* kodiBase, const char* filename); - static char* make_legal_filename(void* kodiBase, const char* filename); - static char* make_legal_path(void* kodiBase, const char* path); - static char* translate_special_protocol(void* kodiBase, const char* strSource); - static bool get_disk_space( - void* kodiBase, const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available); - static bool is_internet_stream(void* kodiBase, const char* path, bool strictCheck); - static bool is_on_lan(void* kodiBase, const char* path); - static bool is_remote(void* kodiBase, const char* path); - static bool is_local(void* kodiBase, const char* path); - static bool is_url(void* kodiBase, const char* path); - - static bool get_http_header(void* kodiBase, const char* url, struct KODI_HTTP_HEADER* headers); - static bool get_mime_type(void* kodiBase, const char* url, char** content, const char* useragent); - static bool get_content_type(void* kodiBase, - const char* url, - char** content, - const char* useragent); - static bool get_cookies(void* kodiBase, const char* url, char** cookies); - - /*! - * @brief Callback functions addon class kodi::vfs::CFile - */ - ///@{ - static bool http_header_create(void* kodiBase, struct KODI_HTTP_HEADER* headers); - static void http_header_free(void* kodiBase, struct KODI_HTTP_HEADER* headers); - - static char* http_header_get_value(void* kodiBase, void* handle, const char* param); - static char** http_header_get_values(void* kodiBase, - void* handle, - const char* param, - int* length); - static char* http_header_get_header(void* kodiBase, void* handle); - static char* http_header_get_mime_type(void* kodiBase, void* handle); - static char* http_header_get_charset(void* kodiBase, void* handle); - static char* http_header_get_proto_line(void* kodiBase, void* handle); - ///@} - - /*! - * @brief Callback functions addon class kodi::vfs::CFile - */ - ///@{ - static void* open_file(void* kodiBase, const char* filename, unsigned int flags); - static void* open_file_for_write(void* kodiBase, const char* filename, bool overwrite); - static ssize_t read_file(void* kodiBase, void* file, void* ptr, size_t size); - static bool read_file_string(void* kodiBase, void* file, char* szLine, int lineLength); - static ssize_t write_file(void* kodiBase, void* file, const void* ptr, size_t size); - static void flush_file(void* kodiBase, void* file); - static int64_t seek_file(void* kodiBase, void* file, int64_t position, int whence); - static int truncate_file(void* kodiBase, void* file, int64_t size); - static int64_t get_file_position(void* kodiBase, void* file); - static int64_t get_file_length(void* kodiBase, void* file); - static double get_file_download_speed(void* kodiBase, void* file); - static void close_file(void* kodiBase, void* file); - static int get_file_chunk_size(void* kodiBase, void* file); - static bool io_control_get_seek_possible(void* kodiBase, void* file); - static bool io_control_get_cache_status(void* kodiBase, - void* file, - struct VFS_CACHE_STATUS_DATA* status); - static bool io_control_set_cache_rate(void* kodiBase, void* file, unsigned int rate); - static bool io_control_set_retry(void* kodiBase, void* file, bool retry); - static char** get_property_values( - void* kodiBase, void* file, int type, const char* name, int* numValues); - - static void* curl_create(void* kodiBase, const char* url); - static bool curl_add_option( - void* kodiBase, void* file, int type, const char* name, const char* value); - static bool curl_open(void* kodiBase, void* file, unsigned int flags); - ///@} - ///@} -}; - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/General.cpp b/xbmc/addons/interfaces/General.cpp deleted file mode 100644 index f014e07806c41..0000000000000 --- a/xbmc/addons/interfaces/General.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "General.h" - -#include "Application.h" -#include "CompileInfo.h" -#include "LangInfo.h" -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/gui/GUIDialogAddonSettings.h" -#include "addons/kodi-dev-kit/include/kodi/General.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "filesystem/Directory.h" -#include "filesystem/SpecialProtocol.h" -#include "guilib/LocalizeStrings.h" -#include "input/KeyboardLayout.h" -#include "input/KeyboardLayoutManager.h" -#include "settings/Settings.h" -#include "settings/SettingsComponent.h" -#include "utils/CharsetConverter.h" -#include "utils/Digest.h" -#include "utils/LangCodeExpander.h" -#include "utils/MemUtils.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/log.h" - -#include - -using namespace kodi; // addon-dev-kit namespace -using KODI::UTILITY::CDigest; - -namespace ADDON -{ - -void Interface_General::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi = static_cast(malloc(sizeof(AddonToKodiFuncTable_kodi))); - - addonInterface->toKodi->kodi->get_addon_info = get_addon_info; - 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; - addonInterface->toKodi->kodi->get_md5 = get_md5; - addonInterface->toKodi->kodi->get_temp_path = get_temp_path; - addonInterface->toKodi->kodi->get_region = get_region; - addonInterface->toKodi->kodi->get_free_mem = get_free_mem; - addonInterface->toKodi->kodi->get_global_idle_time = get_global_idle_time; - addonInterface->toKodi->kodi->is_addon_avilable = is_addon_avilable; - addonInterface->toKodi->kodi->kodi_version = kodi_version; - addonInterface->toKodi->kodi->get_current_skin_id = get_current_skin_id; - addonInterface->toKodi->kodi->get_keyboard_layout = get_keyboard_layout; - addonInterface->toKodi->kodi->change_keyboard_layout = change_keyboard_layout; -} - -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; - } -} - -char* Interface_General::get_addon_info(void* kodiBase, const char* id) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', id='{}')", __FUNCTION__, - kodiBase, static_cast(id)); - return nullptr; - } - - std::string str; - if (StringUtils::CompareNoCase(id, "author") == 0) - str = addon->Author(); - else if (StringUtils::CompareNoCase(id, "changelog") == 0) - str = addon->ChangeLog(); - else if (StringUtils::CompareNoCase(id, "description") == 0) - str = addon->Description(); - else if (StringUtils::CompareNoCase(id, "disclaimer") == 0) - str = addon->Disclaimer(); - else if (StringUtils::CompareNoCase(id, "fanart") == 0) - str = addon->FanArt(); - else if (StringUtils::CompareNoCase(id, "icon") == 0) - str = addon->Icon(); - else if (StringUtils::CompareNoCase(id, "id") == 0) - str = addon->ID(); - else if (StringUtils::CompareNoCase(id, "name") == 0) - str = addon->Name(); - else if (StringUtils::CompareNoCase(id, "path") == 0) - str = addon->Path(); - else if (StringUtils::CompareNoCase(id, "profile") == 0) - str = addon->Profile(); - else if (StringUtils::CompareNoCase(id, "summary") == 0) - str = addon->Summary(); - else if (StringUtils::CompareNoCase(id, "type") == 0) - str = ADDON::CAddonInfo::TranslateType(addon->Type()); - else if (StringUtils::CompareNoCase(id, "version") == 0) - str = addon->Version().asString(); - else - { - CLog::Log(LOGERROR, "Interface_General::{} - add-on '{}' requests invalid id '{}'", - __FUNCTION__, addon->Name(), id); - return nullptr; - } - - char* buffer = strdup(str.c_str()); - return buffer; -} - -bool Interface_General::open_settings_dialog(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return false; - } - - // show settings dialog - AddonPtr addonInfo; - if (!CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), addonInfo, ADDON_UNKNOWN, - OnlyEnabled::YES)) - { - CLog::Log(LOGERROR, "Interface_General::{} - Could not get addon information for '{}'", - __FUNCTION__, addon->ID()); - return false; - } - - return CGUIDialogAddonSettings::ShowForAddon(addonInfo); -} - -char* Interface_General::get_localized_string(void* kodiBase, long label_id) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return nullptr; - } - - if (g_application.m_bStop) - return nullptr; - - std::string label = g_localizeStrings.GetAddonString(addon->ID(), label_id); - if (label.empty()) - label = g_localizeStrings.Get(label_id); - char* buffer = strdup(label.c_str()); - return buffer; -} - -char* Interface_General::unknown_to_utf8(void* kodiBase, const char* source, bool* ret, bool failOnBadChar) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon || !source || !ret) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', source='{}', ret='{}')", - __FUNCTION__, kodiBase, static_cast(source), static_cast(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(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - 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.ConvertToISO6392B(string, langCode); - string = langCode; - if (region) - { - std::string region3Code; - g_LangCodeExpander.ConvertToISO6392B(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(kodiBase); - if (addon == nullptr || message == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', message='{}')", - __FUNCTION__, kodiBase, static_cast(message)); - return false; - } - - std::string usedHeader; - if (header && strlen(header) > 0) - usedHeader = header; - else - usedHeader = addon->Name(); - - QueueMsg qtype = static_cast(type); - - if (qtype != QUEUE_OWN_STYLE) - { - CGUIDialogKaiToast::eMessageType usedType; - switch (qtype) - { - case QueueMsg::QUEUE_WARNING: - usedType = CGUIDialogKaiToast::Warning; - withSound = true; - CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Warning Message: '{}'", __FUNCTION__, - addon->Name(), message); - break; - case QueueMsg::QUEUE_ERROR: - usedType = CGUIDialogKaiToast::Error; - withSound = true; - CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Error Message : '{}'", __FUNCTION__, - addon->Name(), message); - break; - case QueueMsg::QUEUE_INFO: - default: - usedType = CGUIDialogKaiToast::Info; - withSound = false; - CLog::Log(LOGDEBUG, "Interface_General::{} - {} - Info Message : '{}'", __FUNCTION__, - addon->Name(), message); - break; - } - - if (imageFile && strlen(imageFile) > 0) - { - CLog::Log(LOGERROR, - "Interface_General::{} - To use given image file '{}' 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; -} - -void Interface_General::get_md5(void* kodiBase, const char* text, char* md5) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || text == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', text='{}')", - __FUNCTION__, kodiBase, static_cast(text)); - return; - } - - std::string md5Int = CDigest::Calculate(CDigest::Type::MD5, std::string(text)); - strncpy(md5, md5Int.c_str(), 40); -} - -char* Interface_General::get_temp_path(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - called with empty kodi instance pointer", - __FUNCTION__); - return nullptr; - } - - std::string tempPath = - URIUtils::AddFileToFolder(CServiceBroker::GetAddonMgr().GetTempAddonBasePath(), addon->ID()); - tempPath += "-temp"; - XFILE::CDirectory::Create(tempPath); - - return strdup(CSpecialProtocol::TranslatePath(tempPath).c_str()); -} - -char* Interface_General::get_region(void* kodiBase, const char* id) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', id='{}')", __FUNCTION__, - kodiBase, static_cast(id)); - return nullptr; - } - - std::string result; - if (StringUtils::CompareNoCase(id, "datelong") == 0) - { - result = g_langInfo.GetDateFormat(true); - StringUtils::Replace(result, "DDDD", "%A"); - StringUtils::Replace(result, "MMMM", "%B"); - StringUtils::Replace(result, "D", "%d"); - StringUtils::Replace(result, "YYYY", "%Y"); - } - else if (StringUtils::CompareNoCase(id, "dateshort") == 0) - { - result = g_langInfo.GetDateFormat(false); - StringUtils::Replace(result, "MM", "%m"); - StringUtils::Replace(result, "DD", "%d"); -#ifdef TARGET_WINDOWS - StringUtils::Replace(result, "M", "%#m"); - StringUtils::Replace(result, "D", "%#d"); -#else - StringUtils::Replace(result, "M", "%-m"); - StringUtils::Replace(result, "D", "%-d"); -#endif - StringUtils::Replace(result, "YYYY", "%Y"); - } - else if (StringUtils::CompareNoCase(id, "tempunit") == 0) - result = g_langInfo.GetTemperatureUnitString(); - else if (StringUtils::CompareNoCase(id, "speedunit") == 0) - result = g_langInfo.GetSpeedUnitString(); - else if (StringUtils::CompareNoCase(id, "time") == 0) - { - result = g_langInfo.GetTimeFormat(); - StringUtils::Replace(result, "H", "%H"); - StringUtils::Replace(result, "h", "%I"); - StringUtils::Replace(result, "mm", "%M"); - StringUtils::Replace(result, "ss", "%S"); - StringUtils::Replace(result, "xx", "%p"); - } - else if (StringUtils::CompareNoCase(id, "meridiem") == 0) - result = StringUtils::Format("{}/{}", g_langInfo.GetMeridiemSymbol(MeridiemSymbolAM), - g_langInfo.GetMeridiemSymbol(MeridiemSymbolPM)); - else - { - CLog::Log(LOGERROR, "Interface_General::{} - add-on '{}' requests invalid id '{}'", - __FUNCTION__, addon->Name(), id); - return nullptr; - } - - char* buffer = strdup(result.c_str()); - return buffer; -} - -void Interface_General::get_free_mem(void* kodiBase, long* free, long* total, bool as_bytes) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || free == nullptr || total == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', free='{}', total='{}')", - __FUNCTION__, kodiBase, static_cast(free), static_cast(total)); - return; - } - - KODI::MEMORY::MemoryStatus stat; - KODI::MEMORY::GetMemoryStatus(&stat); - *free = static_cast(stat.availPhys); - *total = static_cast(stat.totalPhys); - if (!as_bytes) - { - *free = *free / ( 1024 * 1024 ); - *total = *total / ( 1024 * 1024 ); - } -} - -int Interface_General::get_global_idle_time(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return -1; - } - - return g_application.GlobalIdleTime(); -} - -bool Interface_General::is_addon_avilable(void* kodiBase, - const char* id, - char** version, - bool* enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || id == nullptr || version == nullptr || enabled == nullptr) - { - CLog::Log( - LOGERROR, - "Interface_General::{} - invalid data (addon='{}', id='{}', version='{}', enabled='{}')", - __FUNCTION__, kodiBase, static_cast(id), static_cast(version), - static_cast(enabled)); - return false; - } - - AddonPtr addonInfo; - if (!CServiceBroker::GetAddonMgr().GetAddon(id, addonInfo, ADDON_UNKNOWN, OnlyEnabled::NO)) - return false; - - *version = strdup(addonInfo->Version().asString().c_str()); - *enabled = !CServiceBroker::GetAddonMgr().IsAddonDisabled(id); - return true; -} - -void Interface_General::kodi_version(void* kodiBase, char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || compile_name == nullptr || major == nullptr || minor == nullptr || - revision == nullptr || tag == nullptr || tagversion == nullptr) - { - CLog::Log(LOGERROR, - "Interface_General::{} - invalid data (addon='{}', compile_name='{}', major='{}', " - "minor='{}', revision='{}', tag='{}', tagversion='{}')", - __FUNCTION__, kodiBase, static_cast(compile_name), static_cast(major), - static_cast(minor), static_cast(revision), static_cast(tag), - static_cast(tagversion)); - return; - } - - *compile_name = strdup(CCompileInfo::GetAppName()); - *major = CCompileInfo::GetMajor(); - *minor = CCompileInfo::GetMinor(); - *revision = strdup(CCompileInfo::GetSCMID()); - std::string tagStr = CCompileInfo::GetSuffix(); - if (StringUtils::StartsWithNoCase(tagStr, "alpha")) - { - *tag = strdup("alpha"); - *tagversion = strdup(StringUtils::Mid(tagStr, 5).c_str()); - } - else if (StringUtils::StartsWithNoCase(tagStr, "beta")) - { - *tag = strdup("beta"); - *tagversion = strdup(StringUtils::Mid(tagStr, 4).c_str()); - } - else if (StringUtils::StartsWithNoCase(tagStr, "rc")) - { - *tag = strdup("releasecandidate"); - *tagversion = strdup(StringUtils::Mid(tagStr, 2).c_str()); - } - else if (tagStr.empty()) - *tag = strdup("stable"); - else - *tag = strdup("prealpha"); -} - -char* Interface_General::get_current_skin_id(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return nullptr; - } - - return strdup(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOOKANDFEEL_SKIN).c_str()); -} - -bool Interface_General::get_keyboard_layout(void* kodiBase, char** layout_name, int modifier_key, AddonKeyboardKeyTable* c_layout) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || c_layout == nullptr || layout_name == nullptr) - { - CLog::Log(LOGERROR, - "Interface_General::{} - invalid data (addon='{}', c_layout='{}', layout_name='{}')", - __FUNCTION__, kodiBase, static_cast(c_layout), - static_cast(layout_name)); - return false; - } - - std::string activeLayout = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT); - - CKeyboardLayout layout; - if (!CKeyboardLayoutManager::GetInstance().GetLayout(activeLayout, layout)) - return false; - - *layout_name = strdup(layout.GetName().c_str()); - - unsigned int modifiers = CKeyboardLayout::ModifierKeyNone; - if (modifier_key & STD_KB_MODIFIER_KEY_SHIFT) - modifiers |= CKeyboardLayout::ModifierKeyShift; - if (modifier_key & STD_KB_MODIFIER_KEY_SYMBOL) - modifiers |= CKeyboardLayout::ModifierKeySymbol; - - for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) - { - for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) - { - std::string label = layout.GetCharAt(row, column, modifiers); - c_layout->keys[row][column] = strdup(label.c_str()); - } - } - - return true; -} - -bool Interface_General::change_keyboard_layout(void* kodiBase, char** layout_name) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || layout_name == nullptr) - { - CLog::Log(LOGERROR, "Interface_General::{} - invalid data (addon='{}', layout_name='{}')", - __FUNCTION__, kodiBase, static_cast(layout_name)); - return false; - } - - std::vector layouts; - unsigned int currentLayout = 0; - - const KeyboardLayouts& keyboardLayouts = CKeyboardLayoutManager::GetInstance().GetLayouts(); - const std::shared_ptr settings = CServiceBroker::GetSettingsComponent()->GetSettings(); - std::vector layoutNames = settings->GetList(CSettings::SETTING_LOCALE_KEYBOARDLAYOUTS); - std::string activeLayout = settings->GetString(CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT); - - for (const auto& layoutName : layoutNames) - { - const auto keyboardLayout = keyboardLayouts.find(layoutName.asString()); - if (keyboardLayout != keyboardLayouts.end()) - { - layouts.emplace_back(keyboardLayout->second); - if (layoutName.asString() == activeLayout) - currentLayout = layouts.size() - 1; - } - } - - currentLayout++; - if (currentLayout >= layouts.size()) - currentLayout = 0; - CKeyboardLayout layout = layouts.empty() ? CKeyboardLayout() : layouts[currentLayout]; - CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(CSettings::SETTING_LOCALE_ACTIVEKEYBOARDLAYOUT, layout.GetName()); - - *layout_name = strdup(layout.GetName().c_str()); - return true; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/General.h b/xbmc/addons/interfaces/General.h deleted file mode 100644 index 41e9496180778..0000000000000 --- a/xbmc/addons/interfaces/General.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -extern "C" -{ - -struct AddonGlobalInterface; -struct AddonKeyboardKeyTable; - -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-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 char* get_addon_info(void* kodiBase, const char* id); - static bool open_settings_dialog(void* kodiBase); - static char* get_localized_string(void* kodiBase, long label_id); - 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); - static void get_md5(void* kodiBase, const char* text, char* md5); - static char* get_temp_path(void* kodiBase); - static char* get_region(void* kodiBase, const char* id); - static void get_free_mem(void* kodiInstance, long* free, long* total, bool as_bytes); - static int get_global_idle_time(void* kodiBase); - static bool is_addon_avilable(void* kodiBase, const char* id, char** version, bool* enabled); - static void kodi_version(void* kodiBase, - char** compile_name, - int* major, - int* minor, - char** revision, - char** tag, - char** tagversion); - static char* get_current_skin_id(void* kodiBase); - static bool change_keyboard_layout(void* kodiBase, char** layout_name); - static bool get_keyboard_layout(void* kodiBase, - char** layout_name, - int modifier_key, - AddonKeyboardKeyTable* c_layout); - //@} -}; - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/Network.cpp b/xbmc/addons/interfaces/Network.cpp deleted file mode 100644 index 63151f3b78c82..0000000000000 --- a/xbmc/addons/interfaces/Network.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Network.h" - -#include "ServiceBroker.h" -#include "URL.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/Network.h" -#include "network/DNSNameCache.h" -#include "network/Network.h" -#include "utils/SystemInfo.h" -#include "utils/URIUtils.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_Network::Init(AddonGlobalInterface *addonInterface) -{ - addonInterface->toKodi->kodi_network = new AddonToKodiFuncTable_kodi_network(); - - addonInterface->toKodi->kodi_network->wake_on_lan = wake_on_lan; - addonInterface->toKodi->kodi_network->get_ip_address = get_ip_address; - addonInterface->toKodi->kodi_network->get_hostname = get_hostname; - addonInterface->toKodi->kodi_network->get_user_agent = get_user_agent; - addonInterface->toKodi->kodi_network->is_local_host = is_local_host; - addonInterface->toKodi->kodi_network->is_host_on_lan = is_host_on_lan; - addonInterface->toKodi->kodi_network->dns_lookup = dns_lookup; - addonInterface->toKodi->kodi_network->url_encode = url_encode; -} - -void Interface_Network::DeInit(AddonGlobalInterface* addonInterface) -{ - if (addonInterface->toKodi) /* <-- needed as long as the old addon way is used */ - { - delete addonInterface->toKodi->kodi_network; - addonInterface->toKodi->kodi_network = nullptr; - } -} - -bool Interface_Network::wake_on_lan(void* kodiBase, const char* mac) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || mac == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}', mac='{}')", __FUNCTION__, - kodiBase, static_cast(mac)); - return false; - } - - return CServiceBroker::GetNetwork().WakeOnLan(mac); -} - -char* Interface_Network::get_ip_address(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return nullptr; - } - - std::string titleIP; - CNetworkInterface* iface = CServiceBroker::GetNetwork().GetFirstConnectedInterface(); - if (iface) - titleIP = iface->GetCurrentIPAddress(); - else - titleIP = "127.0.0.1"; - - char* buffer = nullptr; - if (!titleIP.empty()) - buffer = strdup(titleIP.c_str()); - return buffer; -} - -char* Interface_Network::get_hostname(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return nullptr; - } - - std::string hostname; - if (!CServiceBroker::GetNetwork().GetHostName(hostname)) - return nullptr; - - char* buffer = nullptr; - if (!hostname.empty()) - buffer = strdup(hostname.c_str()); - return buffer; -} - -char* Interface_Network::get_user_agent(void* kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}')", __FUNCTION__, - kodiBase); - return nullptr; - } - - std::string string = CSysInfo::GetUserAgent(); - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -bool Interface_Network::is_local_host(void* kodiBase, const char* hostname) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || hostname == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}', hostname='{}')", - __FUNCTION__, kodiBase, static_cast(hostname)); - return false; - } - - return CServiceBroker::GetNetwork().IsLocalHost(hostname); -} - -bool Interface_Network::is_host_on_lan(void* kodiBase, const char* hostname, bool offLineCheck) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || hostname == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}', hostname='{}')", - __FUNCTION__, kodiBase, static_cast(hostname)); - return false; - } - - return URIUtils::IsHostOnLAN(hostname, offLineCheck); -} - -char* Interface_Network::dns_lookup(void* kodiBase, const char* url, bool* ret) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr || ret == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}', url='{}', ret='{}')", - __FUNCTION__, kodiBase, static_cast(url), static_cast(ret)); - return nullptr; - } - - std::string string; - *ret = CDNSNameCache::Lookup(url, string); - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -char* Interface_Network::url_encode(void* kodiBase, const char* url) -{ - CAddonDll* addon = static_cast(kodiBase); - if (addon == nullptr || url == nullptr) - { - CLog::Log(LOGERROR, "Interface_Network::{} - invalid data (addon='{}', url='{}')", __FUNCTION__, - kodiBase, static_cast(url)); - return nullptr; - } - - std::string string = CURL::Encode(url); - char* buffer = nullptr; - if (!string.empty()) - buffer = strdup(string.c_str()); - return buffer; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/Network.h b/xbmc/addons/interfaces/Network.h deleted file mode 100644 index b704fb1579c78..0000000000000 --- a/xbmc/addons/interfaces/Network.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -struct AddonGlobalInterface; - -extern "C" -{ -namespace ADDON -{ - -/*! - * @brief Global general Add-on to Kodi callback functions - * - * To hold network functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/Network.h" - */ -struct Interface_Network -{ - 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 wake_on_lan(void* kodiBase, const char* mac); - static char* get_ip_address(void* kodiBase); - static char* get_hostname(void* kodiBase); - static char* get_user_agent(void* kodiBase); - static bool is_local_host(void* kodiBase, const char* hostname); - static bool is_host_on_lan(void* kodiBase, const char* hostname, bool offLineCheck); - static char* dns_lookup(void* kodiBase, const char* url, bool* ret); - static char* url_encode(void* kodiBase, const char* url); - //@} -}; - -} /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/CMakeLists.txt b/xbmc/addons/interfaces/gui/CMakeLists.txt deleted file mode 100644 index 3508b82fa1e62..0000000000000 --- a/xbmc/addons/interfaces/gui/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -set(SOURCES GUITranslator.cpp - General.cpp - ListItem.cpp - Window.cpp) - -set(HEADERS GUITranslator.h - General.h - ListItem.h - Window.h) - -core_add_library(addons_interfaces_gui) diff --git a/xbmc/addons/interfaces/gui/General.cpp b/xbmc/addons/interfaces/gui/General.cpp deleted file mode 100644 index f51b12a11fdfd..0000000000000 --- a/xbmc/addons/interfaces/gui/General.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "General.h" - -#include "ListItem.h" -#include "ServiceBroker.h" -#include "Window.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/General.h" -#include "controls/Button.h" -#include "controls/Edit.h" -#include "controls/FadeLabel.h" -#include "controls/Image.h" -#include "controls/Label.h" -#include "controls/Progress.h" -#include "controls/RadioButton.h" -#include "controls/Rendering.h" -#include "controls/SettingsSlider.h" -#include "controls/Slider.h" -#include "controls/Spin.h" -#include "controls/TextBox.h" -#include "dialogs/ContextMenu.h" -#include "dialogs/ExtendedProgressBar.h" -#include "dialogs/FileBrowser.h" -#include "dialogs/Keyboard.h" -#include "dialogs/Numeric.h" -#include "dialogs/OK.h" -#include "dialogs/Progress.h" -#include "dialogs/Select.h" -#include "dialogs/TextViewer.h" -#include "dialogs/YesNo.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ -int Interface_GUIGeneral::m_iAddonGUILockRef = 0; - -void Interface_GUIGeneral::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui = new AddonToKodiFuncTable_kodi_gui(); - - Interface_GUIControlButton::Init(addonInterface); - Interface_GUIControlEdit::Init(addonInterface); - Interface_GUIControlFadeLabel::Init(addonInterface); - Interface_GUIControlImage::Init(addonInterface); - Interface_GUIControlLabel::Init(addonInterface); - Interface_GUIControlProgress::Init(addonInterface); - Interface_GUIControlRadioButton::Init(addonInterface); - Interface_GUIControlAddonRendering::Init(addonInterface); - Interface_GUIControlSettingsSlider::Init(addonInterface); - Interface_GUIControlSlider::Init(addonInterface); - Interface_GUIControlSpin::Init(addonInterface); - Interface_GUIControlTextBox::Init(addonInterface); - Interface_GUIDialogContextMenu::Init(addonInterface); - Interface_GUIDialogExtendedProgress::Init(addonInterface); - Interface_GUIDialogFileBrowser::Init(addonInterface); - Interface_GUIDialogKeyboard::Init(addonInterface); - Interface_GUIDialogNumeric::Init(addonInterface); - Interface_GUIDialogOK::Init(addonInterface); - Interface_GUIDialogProgress::Init(addonInterface); - Interface_GUIDialogSelect::Init(addonInterface); - Interface_GUIDialogTextViewer::Init(addonInterface); - Interface_GUIDialogYesNo::Init(addonInterface); - Interface_GUIListItem::Init(addonInterface); - Interface_GUIWindow::Init(addonInterface); - - addonInterface->toKodi->kodi_gui->general = new AddonToKodiFuncTable_kodi_gui_general(); - - addonInterface->toKodi->kodi_gui->general->lock = lock; - addonInterface->toKodi->kodi_gui->general->unlock = unlock; - addonInterface->toKodi->kodi_gui->general->get_screen_height = get_screen_height; - addonInterface->toKodi->kodi_gui->general->get_screen_width = get_screen_width; - addonInterface->toKodi->kodi_gui->general->get_video_resolution = get_video_resolution; - addonInterface->toKodi->kodi_gui->general->get_current_window_dialog_id = - get_current_window_dialog_id; - addonInterface->toKodi->kodi_gui->general->get_current_window_id = get_current_window_id; - addonInterface->toKodi->kodi_gui->general->get_hw_context = get_hw_context; -} - -void Interface_GUIGeneral::DeInit(AddonGlobalInterface* addonInterface) -{ - if (addonInterface->toKodi && /* <-- needed as long as the old addon way is used */ - addonInterface->toKodi->kodi_gui) - { - Interface_GUIControlButton::DeInit(addonInterface); - Interface_GUIControlEdit::DeInit(addonInterface); - Interface_GUIControlFadeLabel::DeInit(addonInterface); - Interface_GUIControlImage::DeInit(addonInterface); - Interface_GUIControlLabel::DeInit(addonInterface); - Interface_GUIControlProgress::DeInit(addonInterface); - Interface_GUIControlRadioButton::DeInit(addonInterface); - Interface_GUIControlAddonRendering::DeInit(addonInterface); - Interface_GUIControlSettingsSlider::DeInit(addonInterface); - Interface_GUIControlSlider::DeInit(addonInterface); - Interface_GUIControlSpin::DeInit(addonInterface); - Interface_GUIControlTextBox::DeInit(addonInterface); - Interface_GUIDialogContextMenu::DeInit(addonInterface); - Interface_GUIDialogExtendedProgress::DeInit(addonInterface); - Interface_GUIDialogFileBrowser::DeInit(addonInterface); - Interface_GUIDialogKeyboard::DeInit(addonInterface); - Interface_GUIDialogNumeric::DeInit(addonInterface); - Interface_GUIDialogOK::DeInit(addonInterface); - Interface_GUIDialogProgress::DeInit(addonInterface); - Interface_GUIDialogSelect::DeInit(addonInterface); - Interface_GUIDialogTextViewer::DeInit(addonInterface); - Interface_GUIDialogYesNo::DeInit(addonInterface); - Interface_GUIListItem::DeInit(addonInterface); - Interface_GUIWindow::DeInit(addonInterface); - - delete addonInterface->toKodi->kodi_gui->general; - delete addonInterface->toKodi->kodi_gui; - addonInterface->toKodi->kodi_gui = nullptr; - } -} - -//@{ -void Interface_GUIGeneral::lock() -{ - if (m_iAddonGUILockRef == 0) - CServiceBroker::GetWinSystem()->GetGfxContext().lock(); - ++m_iAddonGUILockRef; -} - -void Interface_GUIGeneral::unlock() -{ - if (m_iAddonGUILockRef > 0) - { - --m_iAddonGUILockRef; - if (m_iAddonGUILockRef == 0) - CServiceBroker::GetWinSystem()->GetGfxContext().unlock(); - } -} -//@} - -//@{ -int Interface_GUIGeneral::get_screen_height(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "kodi::gui::{} - invalid data", __func__); - return -1; - } - - return CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); -} - -int Interface_GUIGeneral::get_screen_width(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "kodi::gui::{} - invalid data", __func__); - return -1; - } - - return CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); -} - -int Interface_GUIGeneral::get_video_resolution(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "kodi::gui::{} - invalid data", __func__); - return -1; - } - - return (int)CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); -} -//@} - -//@{ -int Interface_GUIGeneral::get_current_window_dialog_id(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "kodi::gui::{} - invalid data", __func__); - return -1; - } - - CSingleLock gl(CServiceBroker::GetWinSystem()->GetGfxContext()); - return CServiceBroker::GetGUI()->GetWindowManager().GetTopmostModalDialog(); -} - -int Interface_GUIGeneral::get_current_window_id(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "kodi::gui::{} - invalid data", __func__); - return -1; - } - - CSingleLock gl(CServiceBroker::GetWinSystem()->GetGfxContext()); - return CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); -} - -ADDON_HARDWARE_CONTEXT Interface_GUIGeneral::get_hw_context(KODI_HANDLE kodiBase) -{ - return CServiceBroker::GetWinSystem()->GetHWContext(); -} - -//@} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/General.h b/xbmc/addons/interfaces/gui/General.h deleted file mode 100644 index 4ef9328c38bf2..0000000000000 --- a/xbmc/addons/interfaces/gui/General.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/general.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h" - */ - struct Interface_GUIGeneral - { - static void Init(AddonGlobalInterface* addonInterface); - static void DeInit(AddonGlobalInterface* addonInterface); - - /*! - * @brief callback functions from add-on to kodi - * - * @note For add of new functions use the "_" style to identify direct a - * add-on callback function. Everything with CamelCase is only for the - * usage in Kodi only. - * - * The parameter `kodiBase` is used to become the pointer for a `CAddonDll` - * class. - */ - //@{ - static void lock(); - static void unlock(); - - static int get_screen_height(KODI_HANDLE kodiBase); - static int get_screen_width(KODI_HANDLE kodiBase); - static int get_video_resolution(KODI_HANDLE kodiBase); - static int get_current_window_dialog_id(KODI_HANDLE kodiBase); - static int get_current_window_id(KODI_HANDLE kodiBase); - static ADDON_HARDWARE_CONTEXT get_hw_context(KODI_HANDLE kodiBase); - //@} - - private: - static int m_iAddonGUILockRef; - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/ListItem.cpp b/xbmc/addons/interfaces/gui/ListItem.cpp deleted file mode 100644 index c91e451f489fe..0000000000000 --- a/xbmc/addons/interfaces/gui/ListItem.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "ListItem.h" - -#include "FileItem.h" -#include "General.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/ListItem.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIListItem::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->listItem = new AddonToKodiFuncTable_kodi_gui_listItem(); - - addonInterface->toKodi->kodi_gui->listItem->create = create; - addonInterface->toKodi->kodi_gui->listItem->destroy = destroy; - addonInterface->toKodi->kodi_gui->listItem->get_label = get_label; - addonInterface->toKodi->kodi_gui->listItem->set_label = set_label; - addonInterface->toKodi->kodi_gui->listItem->get_label2 = get_label2; - addonInterface->toKodi->kodi_gui->listItem->set_label2 = set_label2; - addonInterface->toKodi->kodi_gui->listItem->get_art = get_art; - addonInterface->toKodi->kodi_gui->listItem->set_art = set_art; - addonInterface->toKodi->kodi_gui->listItem->get_path = get_path; - addonInterface->toKodi->kodi_gui->listItem->set_path = set_path; - addonInterface->toKodi->kodi_gui->listItem->get_property = get_property; - addonInterface->toKodi->kodi_gui->listItem->set_property = set_property; - addonInterface->toKodi->kodi_gui->listItem->select = select; - addonInterface->toKodi->kodi_gui->listItem->is_selected = is_selected; -} - -void Interface_GUIListItem::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->listItem; -} - -KODI_GUI_LISTITEM_HANDLE Interface_GUIListItem::create(KODI_HANDLE kodiBase, - const char* label, - const char* label2, - const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "ADDON::Interface_GUIListItem::{} - invalid data", __func__); - return nullptr; - } - - CFileItemPtr* item = new CFileItemPtr(new CFileItem()); - if (label) - item->get()->SetLabel(label); - if (label2) - item->get()->SetLabel2(label2); - if (path) - item->get()->SetPath(path); - - return item; -} - -void Interface_GUIListItem::destroy(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "ADDON::Interface_GUIListItem::{} - invalid data", __func__); - return; - } - - CFileItemPtr* item = static_cast(handle); - if (item) - delete item; -} - -char* Interface_GUIListItem::get_label(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return nullptr; - } - - char* ret; - Interface_GUIGeneral::lock(); - ret = strdup(item->get()->GetLabel().c_str()); - Interface_GUIGeneral::unlock(); - return ret; -} - -void Interface_GUIListItem::set_label(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - item->get()->SetLabel(label); - Interface_GUIGeneral::unlock(); -} - -char* Interface_GUIListItem::get_label2(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return nullptr; - } - - char* ret; - Interface_GUIGeneral::lock(); - ret = strdup(item->get()->GetLabel2().c_str()); - Interface_GUIGeneral::unlock(); - return ret; -} - -void Interface_GUIListItem::set_label2(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - item->get()->SetLabel2(label); - Interface_GUIGeneral::unlock(); -} - -char* Interface_GUIListItem::get_art(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* type) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !type) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', type='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(type), - addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return nullptr; - } - - char* ret; - Interface_GUIGeneral::lock(); - ret = strdup(item->get()->GetArt(type).c_str()); - Interface_GUIGeneral::unlock(); - return ret; -} - -void Interface_GUIListItem::set_art(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* type, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !type || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}', type= " - "'{}', label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(type), - static_cast(label), addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - item->get()->SetArt(type, label); - Interface_GUIGeneral::unlock(); -} - -char* Interface_GUIListItem::get_path(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return nullptr; - } - - char* ret; - Interface_GUIGeneral::lock(); - ret = strdup(item->get()->GetPath().c_str()); - Interface_GUIGeneral::unlock(); - return ret; -} - - -void Interface_GUIListItem::set_path(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* path) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !path) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', path='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(path), - addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - item->get()->SetPath(path); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIListItem::set_property(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* key, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !key || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}', value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - static_cast(value), addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - item->get()->SetProperty(lowerKey, CVariant(value)); - Interface_GUIGeneral::unlock(); -} - -char* Interface_GUIListItem::get_property(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return nullptr; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - char* ret = strdup(item->get()->GetProperty(lowerKey).asString().c_str()); - Interface_GUIGeneral::unlock(); - - return ret; -} - -void Interface_GUIListItem::select(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - bool select) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - item->get()->Select(select); - Interface_GUIGeneral::unlock(); -} - -bool Interface_GUIListItem::is_selected(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CFileItemPtr* item = static_cast(handle); - if (!addon || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIListItem::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return false; - } - - if (item->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIListItem::{} - empty list item called on addon '{}'", - __func__, addon->ID()); - return false; - } - - Interface_GUIGeneral::lock(); - bool ret = item->get()->IsSelected(); - Interface_GUIGeneral::unlock(); - - return ret; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/ListItem.h b/xbmc/addons/interfaces/gui/ListItem.h deleted file mode 100644 index 70e5c6a95e878..0000000000000 --- a/xbmc/addons/interfaces/gui/ListItem.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h" - */ - struct Interface_GUIListItem - { - 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 KODI_GUI_LISTITEM_HANDLE create(KODI_HANDLE kodiBase, - const char* label, - const char* label2, - const char* path); - static void destroy(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - static void set_label(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* label); - static char* get_label2(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - static void set_label2(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* label); - static char* get_art(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* type); - static void set_art(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* type, - const char* image); - static char* get_path(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - static void set_path(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* path); - static char* get_property(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* key); - static void set_property(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* key, - const char* value); - static void select(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, bool select); - static bool is_selected(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/Window.cpp b/xbmc/addons/interfaces/gui/Window.cpp deleted file mode 100644 index 5cd53213ae711..0000000000000 --- a/xbmc/addons/interfaces/gui/Window.cpp +++ /dev/null @@ -1,1499 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "addons/kodi-dev-kit/include/kodi/gui/Window.h" - -#include "Application.h" -#include "FileItem.h" -#include "GUITranslator.h" -#include "General.h" -#include "ServiceBroker.h" -#include "Window.h" -#include "addons/Skin.h" -#include "addons/binary-addons/AddonDll.h" -#include "controls/Rendering.h" -#include "filesystem/File.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIRenderingControl.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/TextureManager.h" -#include "input/Key.h" -#include "messaging/ApplicationMessenger.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" -#include "utils/log.h" - -using namespace ADDON; -using namespace KODI::MESSAGING; - -namespace ADDON -{ - -void Interface_GUIWindow::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->window = new AddonToKodiFuncTable_kodi_gui_window(); - - /* Window creation functions */ - addonInterface->toKodi->kodi_gui->window->create = create; - addonInterface->toKodi->kodi_gui->window->destroy = destroy; - addonInterface->toKodi->kodi_gui->window->set_callbacks = set_callbacks; - addonInterface->toKodi->kodi_gui->window->show = show; - addonInterface->toKodi->kodi_gui->window->close = close; - addonInterface->toKodi->kodi_gui->window->do_modal = do_modal; - - /* Window control functions */ - addonInterface->toKodi->kodi_gui->window->set_focus_id = set_focus_id; - addonInterface->toKodi->kodi_gui->window->get_focus_id = get_focus_id; - addonInterface->toKodi->kodi_gui->window->set_control_label = set_control_label; - addonInterface->toKodi->kodi_gui->window->set_control_visible = set_control_visible; - addonInterface->toKodi->kodi_gui->window->set_control_selected = set_control_selected; - - /* Window property functions */ - addonInterface->toKodi->kodi_gui->window->set_property = set_property; - addonInterface->toKodi->kodi_gui->window->set_property_int = set_property_int; - addonInterface->toKodi->kodi_gui->window->set_property_bool = set_property_bool; - addonInterface->toKodi->kodi_gui->window->set_property_double = set_property_double; - addonInterface->toKodi->kodi_gui->window->get_property = get_property; - addonInterface->toKodi->kodi_gui->window->get_property_int = get_property_int; - addonInterface->toKodi->kodi_gui->window->get_property_bool = get_property_bool; - addonInterface->toKodi->kodi_gui->window->get_property_double = get_property_double; - addonInterface->toKodi->kodi_gui->window->clear_properties = clear_properties; - addonInterface->toKodi->kodi_gui->window->clear_property = clear_property; - - /* List item functions */ - addonInterface->toKodi->kodi_gui->window->clear_item_list = clear_item_list; - addonInterface->toKodi->kodi_gui->window->add_list_item = add_list_item; - addonInterface->toKodi->kodi_gui->window->remove_list_item_from_position = - remove_list_item_from_position; - addonInterface->toKodi->kodi_gui->window->remove_list_item = remove_list_item; - addonInterface->toKodi->kodi_gui->window->get_list_item = get_list_item; - addonInterface->toKodi->kodi_gui->window->set_current_list_position = set_current_list_position; - addonInterface->toKodi->kodi_gui->window->get_current_list_position = get_current_list_position; - addonInterface->toKodi->kodi_gui->window->get_list_size = get_list_size; - addonInterface->toKodi->kodi_gui->window->set_container_property = set_container_property; - addonInterface->toKodi->kodi_gui->window->set_container_content = set_container_content; - addonInterface->toKodi->kodi_gui->window->get_current_container_id = get_current_container_id; - - /* Various functions */ - addonInterface->toKodi->kodi_gui->window->mark_dirty_region = mark_dirty_region; - - /* GUI control access functions */ - addonInterface->toKodi->kodi_gui->window->get_control_button = get_control_button; - addonInterface->toKodi->kodi_gui->window->get_control_edit = get_control_edit; - addonInterface->toKodi->kodi_gui->window->get_control_fade_label = get_control_fade_label; - addonInterface->toKodi->kodi_gui->window->get_control_image = get_control_image; - addonInterface->toKodi->kodi_gui->window->get_control_label = get_control_label; - addonInterface->toKodi->kodi_gui->window->get_control_progress = get_control_progress; - addonInterface->toKodi->kodi_gui->window->get_control_radio_button = get_control_radio_button; - addonInterface->toKodi->kodi_gui->window->get_control_render_addon = get_control_render_addon; - addonInterface->toKodi->kodi_gui->window->get_control_settings_slider = - get_control_settings_slider; - addonInterface->toKodi->kodi_gui->window->get_control_slider = get_control_slider; - addonInterface->toKodi->kodi_gui->window->get_control_spin = get_control_spin; - addonInterface->toKodi->kodi_gui->window->get_control_text_box = get_control_text_box; -} - -void Interface_GUIWindow::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->window; -} - -/*! - * Window creation functions - */ -//@{ -KODI_GUI_WINDOW_HANDLE Interface_GUIWindow::create(KODI_HANDLE kodiBase, - const char* xml_filename, - const char* default_skin, - bool as_dialog, - bool is_media) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon || !xml_filename || !default_skin) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (xml_filename='{}', " - "default_skin='{}') on addon '{}'", - __func__, static_cast(xml_filename), - static_cast(default_skin), addon ? addon->ID() : "unknown"); - return nullptr; - } - - if (as_dialog && is_media) - { - CLog::Log(LOGWARNING, - "Interface_GUIWindow::{}: {}/{} - addon tries to create dialog as media window who " - "not allowed, contact Developer '{}' of this addon", - __func__, CAddonInfo::TranslateType(addon->Type()), addon->Name(), addon->Author()); - } - - RESOLUTION_INFO res; - std::string strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res); - - if (!XFILE::CFile::Exists(strSkinPath)) - { - std::string str("none"); - ADDON::AddonInfoPtr addonInfo = std::make_shared(str, ADDON::ADDON_SKIN); - - // Check for the matching folder for the skin in the fallback skins folder - std::string fallbackPath = URIUtils::AddFileToFolder(addon->Path(), "resources", "skins"); - std::string basePath = URIUtils::AddFileToFolder(fallbackPath, g_SkinInfo->ID()); - - strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res, basePath); - - // Check for the matching folder for the skin in the fallback skins folder (if it exists) - if (XFILE::CFile::Exists(basePath)) - { - addonInfo->SetPath(basePath); - const std::shared_ptr skinInfo = - std::make_shared(addonInfo, res); - skinInfo->Start(); - strSkinPath = skinInfo->GetSkinPath(xml_filename, &res); - } - - if (!XFILE::CFile::Exists(strSkinPath)) - { - // Finally fallback to the DefaultSkin as it didn't exist in either the Kodi Skin folder or the fallback skin folder - addonInfo->SetPath(URIUtils::AddFileToFolder(fallbackPath, default_skin)); - const std::shared_ptr skinInfo = - std::make_shared(addonInfo, res); - - skinInfo->Start(); - strSkinPath = skinInfo->GetSkinPath(xml_filename, &res); - if (!XFILE::CFile::Exists(strSkinPath)) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{}: {}/{} - XML File '{}' for Window is missing, contact " - "Developer '{}' of this addon", - __func__, CAddonInfo::TranslateType(addon->Type()), addon->Name(), strSkinPath, - addon->Author()); - return nullptr; - } - } - } - - int id = GetNextAvailableWindowId(); - if (id < 0) - return nullptr; - - CGUIWindow* window; - if (!as_dialog) - window = new CGUIAddonWindow(id, strSkinPath, addon, is_media); - else - window = new CGUIAddonWindowDialog(id, strSkinPath, addon); - - Interface_GUIGeneral::lock(); - CServiceBroker::GetGUI()->GetWindowManager().Add(window); - Interface_GUIGeneral::unlock(); - - if (!CServiceBroker::GetGUI()->GetWindowManager().GetWindow(id)) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - Requested window id '{}' does not exist for addon '{}'", - __func__, id, addon->ID()); - delete window; - return nullptr; - } - window->SetCoordsRes(res); - return window; -} - -void Interface_GUIWindow::destroy(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - CGUIWindow* pWindow = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow(pAddonWindow->GetID()); - if (pWindow) - { - // first change to an existing window - if (CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == pAddonWindow->GetID() && - !g_application.m_bStop) - { - if (CServiceBroker::GetGUI()->GetWindowManager().GetWindow(pAddonWindow->m_oldWindowId)) - CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->m_oldWindowId); - else // old window does not exist anymore, switch to home - CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_HOME); - } - // Free any window properties - pAddonWindow->ClearProperties(); - // free the window's resources and unload it (free all guicontrols) - pAddonWindow->FreeResources(true); - - CServiceBroker::GetGUI()->GetWindowManager().Remove(pAddonWindow->GetID()); - } - delete pAddonWindow; - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_callbacks( - KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*CBOnInit)(KODI_GUI_CLIENT_HANDLE), - bool (*CBOnFocus)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBOnClick)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBOnAction)(KODI_GUI_CLIENT_HANDLE, ADDON_ACTION), - void (*CBGetContextButtons)(KODI_GUI_CLIENT_HANDLE, int, gui_context_menu_pair*, unsigned int*), - bool (*CBOnContextButton)(KODI_GUI_CLIENT_HANDLE, int, unsigned int)) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !clienthandle) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (handle='{}', clienthandle='{}') " - "on addon '{}'", - __func__, handle, clienthandle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->m_clientHandle = clienthandle; - pAddonWindow->CBOnInit = CBOnInit; - pAddonWindow->CBOnClick = CBOnClick; - pAddonWindow->CBOnFocus = CBOnFocus; - pAddonWindow->CBOnAction = CBOnAction; - pAddonWindow->CBGetContextButtons = CBGetContextButtons; - pAddonWindow->CBOnContextButton = CBOnContextButton; - Interface_GUIGeneral::unlock(); -} - -bool Interface_GUIWindow::show(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon ? addon->ID() : "unknown"); - return false; - } - - if (pAddonWindow->m_oldWindowId != pAddonWindow->m_windowId && - pAddonWindow->m_windowId != CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) - pAddonWindow->m_oldWindowId = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); - - Interface_GUIGeneral::lock(); - if (pAddonWindow->IsDialog()) - dynamic_cast(pAddonWindow)->Show(true, false); - else - CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->GetID()); - Interface_GUIGeneral::unlock(); - - return true; -} - -bool Interface_GUIWindow::close(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon ? addon->ID() : "unknown"); - return false; - } - - pAddonWindow->PulseActionEvent(); - - Interface_GUIGeneral::lock(); - - // if it's a dialog, we have to close it a bit different - if (pAddonWindow->IsDialog()) - dynamic_cast(pAddonWindow)->Show(false); - else - CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->m_oldWindowId); - pAddonWindow->m_oldWindowId = 0; - - Interface_GUIGeneral::unlock(); - - return true; -} - -bool Interface_GUIWindow::do_modal(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon ? addon->ID() : "unknown"); - return false; - } - - if (pAddonWindow->GetID() == CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) - return true; - - if (pAddonWindow->m_oldWindowId != pAddonWindow->m_windowId && - pAddonWindow->m_windowId != CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()) - pAddonWindow->m_oldWindowId = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); - - Interface_GUIGeneral::lock(); - if (pAddonWindow->IsDialog()) - dynamic_cast(pAddonWindow)->Show(true, true); - else - CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(pAddonWindow->GetID()); - Interface_GUIGeneral::unlock(); - - return true; -} -//@} - -/*! - * Window control functions - */ -//@{ -bool Interface_GUIWindow::set_focus_id(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return false; - } - - if (!pAddonWindow->GetControl(control_id)) - { - CLog::Log(LOGERROR, "Interface_GUIWindow - {}: {} - Control does not exist in window", __func__, - addon->Name()); - return false; - } - - Interface_GUIGeneral::lock(); - CGUIMessage msg(GUI_MSG_SETFOCUS, pAddonWindow->m_windowId, control_id); - pAddonWindow->OnMessage(msg); - Interface_GUIGeneral::unlock(); - - return true; -} - -int Interface_GUIWindow::get_focus_id(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - Interface_GUIGeneral::lock(); - int control_id = pAddonWindow->GetFocusedControlID(); - Interface_GUIGeneral::unlock(); - - if (control_id == -1) - CLog::Log(LOGERROR, "Interface_GUIWindow - {}: {} - No control in this window has focus", - __func__, addon->Name()); - - return control_id; -} - -void Interface_GUIWindow::set_control_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - CGUIMessage msg(GUI_MSG_LABEL_SET, pAddonWindow->m_windowId, control_id); - msg.SetLabel(label); - pAddonWindow->OnMessage(msg); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_control_visible(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - CGUIMessage msg(visible ? GUI_MSG_VISIBLE : GUI_MSG_HIDDEN, pAddonWindow->m_windowId, control_id); - pAddonWindow->OnMessage(msg); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_control_selected(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool selected) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - CGUIMessage msg(selected ? GUI_MSG_SET_SELECTED : GUI_MSG_SET_DESELECTED, - pAddonWindow->m_windowId, control_id); - pAddonWindow->OnMessage(msg); - Interface_GUIGeneral::unlock(); -} -//@} - -/*! - * Window property functions - */ -//@{ -void Interface_GUIWindow::set_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}', value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - static_cast(value), addon ? addon->ID() : "unknown"); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - pAddonWindow->SetProperty(lowerKey, value); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_property_int(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - int value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - pAddonWindow->SetProperty(lowerKey, value); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_property_bool(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - bool value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - pAddonWindow->SetProperty(lowerKey, value); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_property_double(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - double value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - pAddonWindow->SetProperty(lowerKey, value); - Interface_GUIGeneral::unlock(); -} - -char* Interface_GUIWindow::get_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return nullptr; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - std::string value = pAddonWindow->GetProperty(lowerKey).asString(); - Interface_GUIGeneral::unlock(); - - return strdup(value.c_str()); -} - -int Interface_GUIWindow::get_property_int(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return -1; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - int value = static_cast(pAddonWindow->GetProperty(lowerKey).asInteger()); - Interface_GUIGeneral::unlock(); - - return value; -} - -bool Interface_GUIWindow::get_property_bool(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return false; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - bool value = pAddonWindow->GetProperty(lowerKey).asBoolean(); - Interface_GUIGeneral::unlock(); - - return value; -} - -double Interface_GUIWindow::get_property_double(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return 0.0; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - double value = pAddonWindow->GetProperty(lowerKey).asDouble(); - Interface_GUIGeneral::unlock(); - - return value; -} - -void Interface_GUIWindow::clear_properties(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->ClearProperties(); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::clear_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - addon ? addon->ID() : "unknown"); - return; - } - - std::string lowerKey = key; - StringUtils::ToLower(lowerKey); - - Interface_GUIGeneral::lock(); - pAddonWindow->SetProperty(lowerKey, ""); - Interface_GUIGeneral::unlock(); -} -//@} - -/*! - * List item functions - */ -//@{ -void Interface_GUIWindow::clear_item_list(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->ClearList(); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::add_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item, - int list_position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "item='{}') on addon '{}'", - __func__, kodiBase, handle, item, addon ? addon->ID() : "unknown"); - return; - } - - CFileItemPtr* pItem(static_cast(item)); - if (pItem->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIWindow::{} - empty list item called on addon '{}'", __func__, - addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->AddItem(pItem, list_position); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::remove_list_item_from_position(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->RemoveItem(list_position); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::remove_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !item) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "item='{}') on addon '{}'", - __func__, kodiBase, handle, item, addon ? addon->ID() : "unknown"); - return; - } - - CFileItemPtr* pItem(static_cast(item)); - if (pItem->get() == nullptr) - { - CLog::Log(LOGERROR, "Interface_GUIWindow::{} - empty list item called on addon '{}'", __func__, - addon->ID()); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->RemoveItem(pItem); - Interface_GUIGeneral::unlock(); -} - -KODI_GUI_LISTITEM_HANDLE Interface_GUIWindow::get_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - Interface_GUIGeneral::lock(); - CFileItemPtr* pItem(pAddonWindow->GetListItem(list_position)); - if (pItem == nullptr || pItem->get() == nullptr) - { - CLog::Log(LOGERROR, "ADDON::Interface_GUIWindow - {}: {} - Index out of range", __func__, - addon->Name()); - - if (pItem) - { - delete pItem; - pItem = nullptr; - } - } - Interface_GUIGeneral::unlock(); - - return pItem; -} - -void Interface_GUIWindow::set_current_list_position(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->SetCurrentListPosition(list_position); - Interface_GUIGeneral::unlock(); -} - -int Interface_GUIWindow::get_current_list_position(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - Interface_GUIGeneral::lock(); - int listPos = pAddonWindow->GetCurrentListPosition(); - Interface_GUIGeneral::unlock(); - - return listPos; -} - -int Interface_GUIWindow::get_list_size(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - Interface_GUIGeneral::lock(); - int listSize = pAddonWindow->GetListSize(); - Interface_GUIGeneral::unlock(); - - return listSize; -} - -void Interface_GUIWindow::set_container_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !key || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "key='{}', value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(key), - static_cast(value), addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->SetContainerProperty(key, value); - Interface_GUIGeneral::unlock(); -} - -void Interface_GUIWindow::set_container_content(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}', " - "value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(value), - addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->SetContainerContent(value); - Interface_GUIGeneral::unlock(); -} - -int Interface_GUIWindow::get_current_container_id(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - Interface_GUIGeneral::lock(); - int id = pAddonWindow->GetCurrentContainerControlId(); - Interface_GUIGeneral::unlock(); - - return id; -} -//@} - -/*! - * Various functions - */ -//@{ -void Interface_GUIWindow::mark_dirty_region(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - pAddonWindow->MarkDirtyRegion(); - Interface_GUIGeneral::unlock(); -} -//@} - -/*! - * GUI control access functions - */ -//@{ -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_button(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_BUTTON, - "button"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_edit(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_EDIT, "edit"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_fade_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_FADELABEL, - "fade label"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_image(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_IMAGE, "image"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_LABEL, "label"); -} -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_progress(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_PROGRESS, - "progress"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_radio_button(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_RADIO, - "radio button"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_render_addon(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - CGUIControl* pGUIControl = static_cast(GetControl( - kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_RENDERADDON, "renderaddon")); - if (!pGUIControl) - return nullptr; - - CGUIAddonRenderingControl* pRenderControl = - new CGUIAddonRenderingControl(dynamic_cast(pGUIControl)); - return pRenderControl; -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_settings_slider( - KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_SETTINGS_SLIDER, - "settings slider"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_slider(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_SLIDER, - "slider"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_spin(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_SPINEX, "spin"); -} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::get_control_text_box(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id) -{ - return GetControl(kodiBase, handle, control_id, __func__, CGUIControl::GUICONTROL_TEXTBOX, - "textbox"); -} -//@} - -KODI_GUI_CONTROL_HANDLE Interface_GUIWindow::GetControl(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - const char* function, - CGUIControl::GUICONTROLTYPES type, - const std::string& typeName) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonWindow* pAddonWindow = static_cast(handle); - if (!addon || !pAddonWindow) - { - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - invalid handler data (kodiBase='{}', handle='{}') on " - "addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return pAddonWindow->GetAddonControl(control_id, type, typeName); -} - -int Interface_GUIWindow::GetNextAvailableWindowId() -{ - Interface_GUIGeneral::lock(); - - // if window WINDOW_ADDON_END is in use it means addon can't create more windows - if (CServiceBroker::GetGUI()->GetWindowManager().GetWindow(WINDOW_ADDON_END)) - { - Interface_GUIGeneral::unlock(); - CLog::Log(LOGERROR, - "Interface_GUIWindow::{} - Maximum number of windows for binary addons reached", - __func__); - return -1; - } - - // window id's WINDOW_ADDON_START - WINDOW_ADDON_END are reserved for addons - // get first window id that is not in use - int id = WINDOW_ADDON_START; - while (id < WINDOW_ADDON_END && - CServiceBroker::GetGUI()->GetWindowManager().GetWindow(id) != nullptr) - id++; - - Interface_GUIGeneral::unlock(); - return id; -} - -CGUIAddonWindow::CGUIAddonWindow(int id, const std::string& strXML, CAddonDll* addon, bool isMedia) - : CGUIMediaWindow(id, strXML.c_str()), - m_clientHandle{nullptr}, - CBOnInit{nullptr}, - CBOnFocus{nullptr}, - CBOnClick{nullptr}, - CBOnAction{nullptr}, - CBGetContextButtons{nullptr}, - CBOnContextButton{nullptr}, - m_windowId(id), - m_oldWindowId(0), - m_actionEvent(true), - m_addon(addon), - m_isMedia(isMedia) -{ - m_loadType = LOAD_ON_GUI_INIT; -} - -CGUIControl* CGUIAddonWindow::GetAddonControl(int controlId, - CGUIControl::GUICONTROLTYPES type, - const std::string& typeName) -{ - // Load window resources, if not already done, to have related xml content - // present and to let control find it - if (!m_windowLoaded) - { - if (!Initialize()) - { - CLog::Log(LOGERROR, - "CGUIAddonGUI_Window::{}: {} - Window initialize failed by control id '{}' request " - "for '{}'", - __func__, m_addon->Name(), controlId, typeName); - return nullptr; - } - } - - CGUIControl* pGUIControl = GetControl(controlId); - if (!pGUIControl) - { - CLog::Log(LOGERROR, - "CGUIAddonGUI_Window::{}: {} - Requested GUI control Id '{}' for '{}' not present!", - __func__, m_addon->Name(), controlId, typeName); - return nullptr; - } - else if (pGUIControl->GetControlType() != type) - { - CLog::Log(LOGERROR, - "CGUIAddonGUI_Window::{}: {} - Requested GUI control Id '{}' not the type '{}'!", - __func__, m_addon->Name(), controlId, typeName); - return nullptr; - } - - return pGUIControl; -} - -bool CGUIAddonWindow::OnAction(const CAction& action) -{ - // Let addon decide whether it wants to handle action first - if (CBOnAction && - CBOnAction(m_clientHandle, CAddonGUITranslator::TranslateActionIdToAddon(action.GetID()))) - return true; - - return CGUIWindow::OnAction(action); -} - -bool CGUIAddonWindow::OnMessage(CGUIMessage& message) -{ - switch (message.GetMessage()) - { - case GUI_MSG_WINDOW_DEINIT: - { - return CGUIMediaWindow::OnMessage(message); - } - break; - - case GUI_MSG_WINDOW_INIT: - { - CGUIMediaWindow::OnMessage(message); - - if (CBOnInit) - CBOnInit(m_clientHandle); - return true; - } - break; - - case GUI_MSG_FOCUSED: - { - if (m_viewControl.HasControl(message.GetControlId()) && - m_viewControl.GetCurrentControl() != message.GetControlId()) - { - m_viewControl.SetFocused(); - return true; - } - // check if our focused control is one of our category buttons - int iControl = message.GetControlId(); - if (CBOnFocus) - CBOnFocus(m_clientHandle, iControl); - } - break; - - case GUI_MSG_NOTIFY_ALL: - { - // most messages from GUI_MSG_NOTIFY_ALL break container content, whitelist working ones. - if (message.GetParam1() == GUI_MSG_PAGE_CHANGE || - message.GetParam1() == GUI_MSG_WINDOW_RESIZE) - return CGUIMediaWindow::OnMessage(message); - return true; - } - - case GUI_MSG_CLICKED: - { - int iControl = message.GetSenderId(); - if (iControl && iControl != this->GetID()) - { - CGUIControl* controlClicked = this->GetControl(iControl); - - // The old python way used to check list AND SELECITEM method or if its a button, checkmark. - // Its done this way for now to allow other controls without a python version like togglebutton to still raise a onAction event - if (controlClicked) // Will get problems if we the id is not on the window and we try to do GetControlType on it. So check to make sure it exists - { - if ((controlClicked->IsContainer() && (message.GetParam1() == ACTION_SELECT_ITEM || - message.GetParam1() == ACTION_MOUSE_LEFT_CLICK)) || - !controlClicked->IsContainer()) - { - if (CBOnClick) - return CBOnClick(m_clientHandle, iControl); - } - else if (controlClicked->IsContainer() && - (message.GetParam1() == ACTION_MOUSE_RIGHT_CLICK || - message.GetParam1() == ACTION_CONTEXT_MENU)) - { - if (CBOnAction) - { - // Check addon want to handle right click for a context menu, if - // not used from addon becomes "GetContextButtons(...)" called. - if (CBOnAction(m_clientHandle, ADDON_ACTION_CONTEXT_MENU)) - return true; - } - } - } - } - } - break; - } - - return CGUIMediaWindow::OnMessage(message); -} - -void CGUIAddonWindow::AllocResources(bool forceLoad /*= false */) -{ - std::string tmpDir = URIUtils::GetDirectory(GetProperty("xmlfile").asString()); - std::string fallbackMediaPath; - URIUtils::GetParentPath(tmpDir, fallbackMediaPath); - URIUtils::RemoveSlashAtEnd(fallbackMediaPath); - m_mediaDir = fallbackMediaPath; - - CServiceBroker::GetGUI()->GetTextureManager().AddTexturePath(m_mediaDir); - CGUIMediaWindow::AllocResources(forceLoad); - CServiceBroker::GetGUI()->GetTextureManager().RemoveTexturePath(m_mediaDir); -} - -void CGUIAddonWindow::Render() -{ - CServiceBroker::GetGUI()->GetTextureManager().AddTexturePath(m_mediaDir); - CGUIMediaWindow::Render(); - CServiceBroker::GetGUI()->GetTextureManager().RemoveTexturePath(m_mediaDir); -} - -void CGUIAddonWindow::AddItem(CFileItemPtr* fileItem, int itemPosition) -{ - if (itemPosition == -1 || itemPosition > m_vecItems->Size()) - { - m_vecItems->Add(*fileItem); - } - else if (itemPosition < -1 && !(itemPosition - 1 < m_vecItems->Size())) - { - m_vecItems->AddFront(*fileItem, 0); - } - else - { - m_vecItems->AddFront(*fileItem, itemPosition); - } - m_viewControl.SetItems(*m_vecItems); - UpdateButtons(); -} - -void CGUIAddonWindow::RemoveItem(int itemPosition) -{ - m_vecItems->Remove(itemPosition); - m_viewControl.SetItems(*m_vecItems); - UpdateButtons(); -} - -void CGUIAddonWindow::RemoveItem(CFileItemPtr* fileItem) -{ - m_vecItems->Remove(fileItem->get()); - m_viewControl.SetItems(*m_vecItems); - UpdateButtons(); -} - -int CGUIAddonWindow::GetCurrentListPosition() -{ - return m_viewControl.GetSelectedItem(); -} - -void CGUIAddonWindow::SetCurrentListPosition(int item) -{ - m_viewControl.SetSelectedItem(item); -} - -int CGUIAddonWindow::GetListSize() -{ - return m_vecItems->Size(); -} - -CFileItemPtr* CGUIAddonWindow::GetListItem(int position) -{ - if (position < 0 || position >= m_vecItems->Size()) - return nullptr; - return new CFileItemPtr(m_vecItems->Get(position)); -} - -void CGUIAddonWindow::ClearList() -{ - ClearFileItems(); - - m_viewControl.SetItems(*m_vecItems); - UpdateButtons(); -} - -void CGUIAddonWindow::SetContainerProperty(const std::string& key, const std::string& value) -{ - m_vecItems->SetProperty(key, value); -} - -void CGUIAddonWindow::SetContainerContent(const std::string& value) -{ - m_vecItems->SetContent(value); -} - -int CGUIAddonWindow::GetCurrentContainerControlId() -{ - return m_viewControl.GetCurrentControl(); -} - -void CGUIAddonWindow::GetContextButtons(int itemNumber, CContextButtons& buttons) -{ - gui_context_menu_pair c_buttons[ADDON_MAX_CONTEXT_ENTRIES] = {}; - unsigned int size = ADDON_MAX_CONTEXT_ENTRIES; - if (CBGetContextButtons) - { - CBGetContextButtons(m_clientHandle, itemNumber, c_buttons, &size); - for (unsigned int i = 0; i < size; ++i) - buttons.push_back(std::pair(c_buttons[i].id, c_buttons[i].name)); - } -} - -bool CGUIAddonWindow::OnContextButton(int itemNumber, CONTEXT_BUTTON button) -{ - if (CBOnContextButton) - return CBOnContextButton(m_clientHandle, itemNumber, static_cast(button)); - return false; -} - -void CGUIAddonWindow::WaitForActionEvent(unsigned int timeout) -{ - m_actionEvent.Wait(std::chrono::milliseconds(timeout)); - m_actionEvent.Reset(); -} - -void CGUIAddonWindow::PulseActionEvent() -{ - m_actionEvent.Set(); -} - -void CGUIAddonWindow::SetupShares() -{ - UpdateButtons(); -} - - -CGUIAddonWindowDialog::CGUIAddonWindowDialog(int id, const std::string& strXML, CAddonDll* addon) - : CGUIAddonWindow(id, strXML, addon, false), m_bRunning(false) -{ -} - -void CGUIAddonWindowDialog::Show(bool show /* = true */, bool modal /* = true*/) -{ - if (modal) - { - unsigned int count = CServiceBroker::GetWinSystem()->GetGfxContext().exit(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, - static_cast(this)); - CServiceBroker::GetWinSystem()->GetGfxContext().restore(count); - } - else - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, - static_cast(this)); -} - -void CGUIAddonWindowDialog::Show_Internal(bool show /* = true */) -{ - if (show) - { - m_bRunning = true; - CServiceBroker::GetGUI()->GetWindowManager().RegisterDialog(this); - - // activate this window... - CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, GetID()); - OnMessage(msg); - - // this dialog is derived from GUIMediaWindow - // make sure it is rendered last - m_renderOrder = RENDER_ORDER_DIALOG; - while (m_bRunning) - { - if (!ProcessRenderLoop(false)) - break; - } - } - else // hide - { - m_bRunning = false; - - CGUIMessage msg(GUI_MSG_WINDOW_DEINIT, 0, 0); - OnMessage(msg); - - CServiceBroker::GetGUI()->GetWindowManager().RemoveDialog(GetID()); - } -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/Window.h b/xbmc/addons/interfaces/gui/Window.h deleted file mode 100644 index dad0737cb7478..0000000000000 --- a/xbmc/addons/interfaces/gui/Window.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/window.h" -#include "threads/Event.h" -#include "windows/GUIMediaWindow.h" - -extern "C" -{ - - struct AddonGlobalInterface; - struct gui_context_menu_pair; - - namespace ADDON - { - class CAddonDll; - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h" - */ - struct Interface_GUIWindow - { - 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. - */ - //@{ - /* Window creation functions */ - static KODI_GUI_WINDOW_HANDLE create(KODI_HANDLE kodiBase, - const char* xml_filename, - const char* default_skin, - bool as_dialog, - bool is_media); - static void destroy(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static void set_callbacks(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*CBInit)(KODI_GUI_CLIENT_HANDLE), - bool (*CBFocus)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBClick)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBOnAction)(KODI_GUI_CLIENT_HANDLE, ADDON_ACTION), - void (*CBGetContextButtons)(KODI_GUI_CLIENT_HANDLE, - int, - gui_context_menu_pair*, - unsigned int*), - bool (*CBOnContextButton)(KODI_GUI_CLIENT_HANDLE, int, unsigned int)); - static bool show(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static bool close(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static bool do_modal(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* Window control functions */ - static bool set_focus_id(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - static int get_focus_id(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static void set_control_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - const char* label); - static void set_control_visible(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool visible); - static void set_control_selected(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool selected); - - /* Window property functions */ - static void set_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value); - static void set_property_int(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - int value); - static void set_property_bool(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - bool value); - static void set_property_double(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - double value); - static char* get_property(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, const char* key); - static int get_property_int(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key); - static bool get_property_bool(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key); - static double get_property_double(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key); - static void clear_properties(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static void clear_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key); - - /* List item functions */ - static void clear_item_list(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static void add_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item, - int list_position); - static void remove_list_item_from_position(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position); - static void remove_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item); - static KODI_GUI_LISTITEM_HANDLE get_list_item(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position); - static void set_current_list_position(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position); - static int get_current_list_position(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static int get_list_size(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - static void set_container_property(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value); - static void set_container_content(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* value); - static int get_current_container_id(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* Various functions */ - static void mark_dirty_region(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* GUI control access functions */ - static KODI_GUI_CONTROL_HANDLE get_control_button(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_edit(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_fade_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_image(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_label(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_radio_button(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_progress(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_render_addon(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_settings_slider(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_slider(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_spin(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - static KODI_GUI_CONTROL_HANDLE get_control_text_box(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id); - //@} - - private: - static KODI_GUI_CONTROL_HANDLE GetControl(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - const char* function, - CGUIControl::GUICONTROLTYPES type, - const std::string& typeName); - static int GetNextAvailableWindowId(); - }; - - class CGUIAddonWindow : public CGUIMediaWindow - { - friend struct Interface_GUIWindow; - - public: - CGUIAddonWindow(int id, const std::string& strXML, ADDON::CAddonDll* addon, bool isMedia); - ~CGUIAddonWindow() override = default; - - bool OnMessage(CGUIMessage& message) override; - bool OnAction(const CAction& action) override; - void AllocResources(bool forceLoad = false) override; - void Render() override; - bool IsMediaWindow() const override { return m_isMedia; } - - /* Addon to Kodi call functions */ - void PulseActionEvent(); - void AddItem(CFileItemPtr* fileItem, int itemPosition); - void RemoveItem(int itemPosition); - void RemoveItem(CFileItemPtr* fileItem); - void ClearList(); - CFileItemPtr* GetListItem(int position); - int GetListSize(); - int GetCurrentListPosition(); - void SetCurrentListPosition(int item); - void SetContainerProperty(const std::string& key, const std::string& value); - void SetContainerContent(const std::string& value); - int GetCurrentContainerControlId(); - CGUIControl* GetAddonControl(int controlId, - CGUIControl::GUICONTROLTYPES type, - const std::string& typeName); - - protected: - void GetContextButtons(int itemNumber, CContextButtons& buttons) override; - bool OnContextButton(int itemNumber, CONTEXT_BUTTON button) override; - void SetupShares() override; - - /* kodi to addon callback function addresses */ - KODI_GUI_CLIENT_HANDLE m_clientHandle; - bool (*CBOnInit)(KODI_GUI_CLIENT_HANDLE cbhdl); - bool (*CBOnFocus)(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId); - bool (*CBOnClick)(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId); - bool (*CBOnAction)(KODI_GUI_CLIENT_HANDLE cbhdl, ADDON_ACTION actionId); - void (*CBGetContextButtons)(KODI_GUI_CLIENT_HANDLE cbhdl, - int itemNumber, - gui_context_menu_pair* buttons, - unsigned int* size); - bool (*CBOnContextButton)(KODI_GUI_CLIENT_HANDLE cbhdl, int itemNumber, unsigned int button); - - const int m_windowId; - int m_oldWindowId; - - private: - void WaitForActionEvent(unsigned int timeout); - - CEvent m_actionEvent; - ADDON::CAddonDll* m_addon; - std::string m_mediaDir; - bool m_isMedia; - }; - - class CGUIAddonWindowDialog : public CGUIAddonWindow - { - public: - CGUIAddonWindowDialog(int id, const std::string& strXML, ADDON::CAddonDll* addon); - - bool IsDialogRunning() const override { return m_bRunning; } - bool IsDialog() const override { return true; } - bool IsModalDialog() const override { return true; } - - void Show(bool show = true, bool modal = true); - void Show_Internal(bool show = true); - - private: - bool m_bRunning; - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Button.cpp b/xbmc/addons/interfaces/gui/controls/Button.cpp deleted file mode 100644 index 24a99946b04fe..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Button.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Button.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Button.h" -#include "guilib/GUIButtonControl.h" -#include "utils/StringUtils.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlButton::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_button = - new AddonToKodiFuncTable_kodi_gui_control_button(); - - addonInterface->toKodi->kodi_gui->control_button->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_button->set_enabled = set_enabled; - - addonInterface->toKodi->kodi_gui->control_button->set_label = set_label; - addonInterface->toKodi->kodi_gui->control_button->get_label = get_label; - - addonInterface->toKodi->kodi_gui->control_button->set_label2 = set_label2; - addonInterface->toKodi->kodi_gui->control_button->get_label2 = get_label2; -} - -void Interface_GUIControlButton::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_button; -} - -void Interface_GUIControlButton::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlButton::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enabled); -} - -void Interface_GUIControlButton::set_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetLabel(label); -} - -char* Interface_GUIControlButton::get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetLabel().c_str()); -} - -void Interface_GUIControlButton::set_label2(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetLabel2(label); -} - -char* Interface_GUIControlButton::get_label2(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlButton::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetLabel2().c_str()); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Button.h b/xbmc/addons/interfaces/gui/controls/Button.h deleted file mode 100644 index 221ae4ea6641a..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Button.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h" - */ - struct Interface_GUIControlButton - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void set_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_label2(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label2(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/CMakeLists.txt b/xbmc/addons/interfaces/gui/controls/CMakeLists.txt deleted file mode 100644 index 0a708c662ee91..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -set(SOURCES Button.cpp - Edit.cpp - FadeLabel.cpp - Image.cpp - Label.cpp - Progress.cpp - RadioButton.cpp - Rendering.cpp - SettingsSlider.cpp - Slider.cpp - Spin.cpp - TextBox.cpp) - -set(HEADERS Button.h - Edit.h - FadeLabel.h - Image.h - Label.h - Progress.h - RadioButton.h - Rendering.h - SettingsSlider.h - Slider.h - Spin.h - TextBox.h) - -core_add_library(addons_interfaces_gui_controls) diff --git a/xbmc/addons/interfaces/gui/controls/Edit.cpp b/xbmc/addons/interfaces/gui/controls/Edit.cpp deleted file mode 100644 index b537279764602..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Edit.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Edit.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h" -#include "guilib/GUIEditControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlEdit::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_edit = new AddonToKodiFuncTable_kodi_gui_control_edit(); - - addonInterface->toKodi->kodi_gui->control_edit->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_edit->set_enabled = set_enabled; - addonInterface->toKodi->kodi_gui->control_edit->set_input_type = set_input_type; - addonInterface->toKodi->kodi_gui->control_edit->set_label = set_label; - addonInterface->toKodi->kodi_gui->control_edit->get_label = get_label; - addonInterface->toKodi->kodi_gui->control_edit->set_text = set_text; - addonInterface->toKodi->kodi_gui->control_edit->get_text = get_text; - addonInterface->toKodi->kodi_gui->control_edit->set_cursor_position = set_cursor_position; - addonInterface->toKodi->kodi_gui->control_edit->get_cursor_position = get_cursor_position; -} - -void Interface_GUIControlEdit::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_edit; -} - -void Interface_GUIControlEdit::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlEdit::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enable) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enable); -} - -void Interface_GUIControlEdit::set_input_type(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int type, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}', " - "heading='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(heading), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIEditControl::INPUT_TYPE kodiType; - switch (static_cast(type)) - { - case ADDON_INPUT_TYPE_TEXT: - kodiType = CGUIEditControl::INPUT_TYPE_TEXT; - break; - case ADDON_INPUT_TYPE_NUMBER: - kodiType = CGUIEditControl::INPUT_TYPE_NUMBER; - break; - case ADDON_INPUT_TYPE_SECONDS: - kodiType = CGUIEditControl::INPUT_TYPE_SECONDS; - break; - case ADDON_INPUT_TYPE_TIME: - kodiType = CGUIEditControl::INPUT_TYPE_TIME; - break; - case ADDON_INPUT_TYPE_DATE: - kodiType = CGUIEditControl::INPUT_TYPE_DATE; - break; - case ADDON_INPUT_TYPE_IPADDRESS: - kodiType = CGUIEditControl::INPUT_TYPE_IPADDRESS; - break; - case ADDON_INPUT_TYPE_PASSWORD: - kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD; - break; - case ADDON_INPUT_TYPE_PASSWORD_MD5: - kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD_MD5; - break; - case ADDON_INPUT_TYPE_SEARCH: - kodiType = CGUIEditControl::INPUT_TYPE_SEARCH; - break; - case ADDON_INPUT_TYPE_FILTER: - kodiType = CGUIEditControl::INPUT_TYPE_FILTER; - break; - case ADDON_INPUT_TYPE_READONLY: - default: - kodiType = CGUIEditControl::INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW; - } - - control->SetInputType(kodiType, heading); -} - -void Interface_GUIControlEdit::set_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetLabel(label); -} - -char* Interface_GUIControlEdit::get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetLabel().c_str()); -} - -void Interface_GUIControlEdit::set_text(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}', " - "text='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(text), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetLabel2(text); -} - -char* Interface_GUIControlEdit::get_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetLabel2().c_str()); -} - -void Interface_GUIControlEdit::set_cursor_position(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - unsigned int position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetCursorPosition(position); -} - -unsigned int Interface_GUIControlEdit::get_cursor_position(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIEditControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlEdit::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0; - } - - return control->GetCursorPosition(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Edit.h b/xbmc/addons/interfaces/gui/controls/Edit.h deleted file mode 100644 index 9dda1e2046681..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Edit.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h" - */ - struct Interface_GUIControlEdit - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void set_input_type(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int type, - const char* heading); - - static void set_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - static char* get_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_cursor_position(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - unsigned int position); - static unsigned int get_cursor_position(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/FadeLabel.cpp b/xbmc/addons/interfaces/gui/controls/FadeLabel.cpp deleted file mode 100644 index 13c560442ce3b..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/FadeLabel.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "FadeLabel.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h" -#include "guilib/GUIFadeLabelControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlFadeLabel::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_fade_label = - new AddonToKodiFuncTable_kodi_gui_control_fade_label(); - - addonInterface->toKodi->kodi_gui->control_fade_label->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_fade_label->add_label = add_label; - addonInterface->toKodi->kodi_gui->control_fade_label->get_label = get_label; - addonInterface->toKodi->kodi_gui->control_fade_label->set_scrolling = set_scrolling; - addonInterface->toKodi->kodi_gui->control_fade_label->reset = reset; -} - -void Interface_GUIControlFadeLabel::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_fade_label; -} - -void Interface_GUIControlFadeLabel::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlFadeLabel::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlFadeLabel::add_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlFadeLabel::{} - invalid handler data (kodiBase='{}', " - "handle='{}', label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_ADD, control->GetParentID(), control->GetID()); - msg.SetLabel(label); - control->OnMessage(msg); -} - -char* Interface_GUIControlFadeLabel::get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlFadeLabel::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - CGUIMessage msg(GUI_MSG_ITEM_SELECTED, control->GetParentID(), control->GetID()); - control->OnMessage(msg); - std::string text = msg.GetLabel(); - return strdup(text.c_str()); -} - -void Interface_GUIControlFadeLabel::set_scrolling(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool scroll) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlFadeLabel::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetScrolling(scroll); -} - -void Interface_GUIControlFadeLabel::reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlFadeLabel::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); - control->OnMessage(msg); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/FadeLabel.h b/xbmc/addons/interfaces/gui/controls/FadeLabel.h deleted file mode 100644 index 2c3cd6803735c..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/FadeLabel.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h" - */ - struct Interface_GUIControlFadeLabel - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - static void set_selected(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool selected); - - static void add_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_scrolling(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool scroll); - static void reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Image.cpp b/xbmc/addons/interfaces/gui/controls/Image.cpp deleted file mode 100644 index 88f368c628a98..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Image.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Image.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Image.h" -#include "guilib/GUIImage.h" -#include "utils/log.h" - -using namespace KODI; - -namespace ADDON -{ - -void Interface_GUIControlImage::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_image = - new AddonToKodiFuncTable_kodi_gui_control_image(); - - addonInterface->toKodi->kodi_gui->control_image->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_image->set_filename = set_filename; - addonInterface->toKodi->kodi_gui->control_image->set_color_diffuse = set_color_diffuse; -} - -void Interface_GUIControlImage::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_image; -} - -void Interface_GUIControlImage::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIImage* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlImage::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlImage::set_filename(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* filename, - bool use_cache) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIImage* control = static_cast(handle); - if (!addon || !control || !filename) - { - CLog::Log(LOGERROR, - "Interface_GUIControlImage::{} - invalid handler data (kodiBase='{}', handle='{}', " - "filename='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(filename), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetFileName(filename, false, use_cache); -} - -void Interface_GUIControlImage::set_color_diffuse(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - uint32_t colorDiffuse) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIImage* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlImage::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetColorDiffuse(GUILIB::GUIINFO::CGUIInfoColor(colorDiffuse)); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Image.h b/xbmc/addons/interfaces/gui/controls/Image.h deleted file mode 100644 index b12becea3056d..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Image.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h" - */ - struct Interface_GUIControlImage - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_filename(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* filename, - bool use_cache); - static void set_color_diffuse(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - uint32_t color_diffuse); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Label.cpp b/xbmc/addons/interfaces/gui/controls/Label.cpp deleted file mode 100644 index 3922e3f81506e..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Label.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Label.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Label.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUILabelControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlLabel::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_label = - new AddonToKodiFuncTable_kodi_gui_control_label(); - - addonInterface->toKodi->kodi_gui->control_label->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_label->set_label = set_label; - addonInterface->toKodi->kodi_gui->control_label->get_label = get_label; -} - -void Interface_GUIControlLabel::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_label; -} - -void Interface_GUIControlLabel::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUILabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlLabel::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlLabel::set_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUILabelControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlLabel::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); - msg.SetLabel(label); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -char* Interface_GUIControlLabel::get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUILabelControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlLabel::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetDescription().c_str()); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Label.h b/xbmc/addons/interfaces/gui/controls/Label.h deleted file mode 100644 index 020c3d5d3ec90..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Label.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h" - */ - struct Interface_GUIControlLabel - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - - static void set_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Progress.cpp b/xbmc/addons/interfaces/gui/controls/Progress.cpp deleted file mode 100644 index 639d079d4e813..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Progress.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Progress.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h" -#include "guilib/GUIProgressControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlProgress::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_progress = - new AddonToKodiFuncTable_kodi_gui_control_progress(); - - addonInterface->toKodi->kodi_gui->control_progress->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_progress->set_percentage = set_percentage; - addonInterface->toKodi->kodi_gui->control_progress->get_percentage = get_percentage; -} - -void Interface_GUIControlProgress::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_progress; -} - -void Interface_GUIControlProgress::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIProgressControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlProgress::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlProgress::set_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float percent) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIProgressControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlProgress::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetPercentage(percent); -} - -float Interface_GUIControlProgress::get_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIProgressControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlProgress::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetPercentage(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Progress.h b/xbmc/addons/interfaces/gui/controls/Progress.h deleted file mode 100644 index c3368fa105fc6..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Progress.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h" - */ - struct Interface_GUIControlProgress - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - - static void set_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - static float get_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/RadioButton.cpp b/xbmc/addons/interfaces/gui/controls/RadioButton.cpp deleted file mode 100644 index 9d3b82619b368..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/RadioButton.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "RadioButton.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h" -#include "guilib/GUIRadioButtonControl.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlRadioButton::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_radio_button = - new AddonToKodiFuncTable_kodi_gui_control_radio_button(); - - addonInterface->toKodi->kodi_gui->control_radio_button->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_radio_button->set_enabled = set_enabled; - - addonInterface->toKodi->kodi_gui->control_radio_button->set_label = set_label; - addonInterface->toKodi->kodi_gui->control_radio_button->get_label = get_label; - - addonInterface->toKodi->kodi_gui->control_radio_button->set_selected = set_selected; - addonInterface->toKodi->kodi_gui->control_radio_button->is_selected = is_selected; -} - -void Interface_GUIControlRadioButton::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_radio_button; -} - -void Interface_GUIControlRadioButton::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlRadioButton::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enabled); -} - -void Interface_GUIControlRadioButton::set_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}', label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetLabel(label); -} - -char* Interface_GUIControlRadioButton::get_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetLabel().c_str()); -} - -void Interface_GUIControlRadioButton::set_selected(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool selected) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetSelected(selected); -} - -bool Interface_GUIControlRadioButton::is_selected(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIRadioButtonControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlRadioButton::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return false; - } - - return control->IsSelected(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/RadioButton.h b/xbmc/addons/interfaces/gui/controls/RadioButton.h deleted file mode 100644 index dd7ed4e9e3aa9..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/RadioButton.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h" - */ - struct Interface_GUIControlRadioButton - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void set_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - static char* get_label(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_selected(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool selected); - static bool is_selected(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Rendering.cpp b/xbmc/addons/interfaces/gui/controls/Rendering.cpp deleted file mode 100644 index a26a27f9c3aeb..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Rendering.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Rendering.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/interfaces/gui/General.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h" -#include "guilib/GUIRenderingControl.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlAddonRendering::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_rendering = - new AddonToKodiFuncTable_kodi_gui_control_rendering(); - - addonInterface->toKodi->kodi_gui->control_rendering->set_callbacks = set_callbacks; - addonInterface->toKodi->kodi_gui->control_rendering->destroy = destroy; -} - -void Interface_GUIControlAddonRendering::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_rendering; -} - -void Interface_GUIControlAddonRendering::set_callbacks( - KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*createCB)(KODI_GUI_CLIENT_HANDLE, int, int, int, int, ADDON_HARDWARE_CONTEXT), - void (*renderCB)(KODI_GUI_CLIENT_HANDLE), - void (*stopCB)(KODI_GUI_CLIENT_HANDLE), - bool (*dirtyCB)(KODI_GUI_CLIENT_HANDLE)) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonRenderingControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlAddonRendering::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - control->m_clientHandle = clienthandle; - control->CBCreate = createCB; - control->CBRender = renderCB; - control->CBStop = stopCB; - control->CBDirty = dirtyCB; - control->m_addon = addon; - Interface_GUIGeneral::unlock(); - - control->m_control->InitCallback(control); -} - -void Interface_GUIControlAddonRendering::destroy(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUIAddonRenderingControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlAddonRendering::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - Interface_GUIGeneral::lock(); - static_cast(handle)->Delete(); - Interface_GUIGeneral::unlock(); -} - - -CGUIAddonRenderingControl::CGUIAddonRenderingControl(CGUIRenderingControl* control) - : CBCreate{nullptr}, - CBRender{nullptr}, - CBStop{nullptr}, - CBDirty{nullptr}, - m_clientHandle{nullptr}, - m_addon{nullptr}, - m_control{control}, - m_refCount{1} -{ -} - -bool CGUIAddonRenderingControl::Create(int x, int y, int w, int h, void* device) -{ - if (CBCreate) - { - if (CBCreate(m_clientHandle, x, y, w, h, device)) - { - ++m_refCount; - return true; - } - } - return false; -} - -void CGUIAddonRenderingControl::Render() -{ - if (CBRender) - { - CBRender(m_clientHandle); - } -} - -void CGUIAddonRenderingControl::Stop() -{ - if (CBStop) - { - CBStop(m_clientHandle); - } - - --m_refCount; - if (m_refCount <= 0) - delete this; -} - -void CGUIAddonRenderingControl::Delete() -{ - --m_refCount; - if (m_refCount <= 0) - delete this; -} - -bool CGUIAddonRenderingControl::IsDirty() -{ - bool ret = true; - if (CBDirty) - { - ret = CBDirty(m_clientHandle); - } - return ret; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Rendering.h b/xbmc/addons/interfaces/gui/controls/Rendering.h deleted file mode 100644 index dbd82d86023b2..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Rendering.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h" -#include "guilib/IRenderingCallback.h" - -class CGUIRenderingControl; - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - class CAddonDll; - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h" - */ - struct Interface_GUIControlAddonRendering - { - 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 void set_callbacks( - KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*createCB)(KODI_GUI_CLIENT_HANDLE, int, int, int, int, ADDON_HARDWARE_CONTEXT), - void (*renderCB)(KODI_GUI_CLIENT_HANDLE), - void (*stopCB)(KODI_GUI_CLIENT_HANDLE), - bool (*dirtyCB)(KODI_GUI_CLIENT_HANDLE)); - static void destroy(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - //@} - }; - - class CGUIAddonRenderingControl : public IRenderingCallback - { - friend struct Interface_GUIControlAddonRendering; - - public: - explicit CGUIAddonRenderingControl(CGUIRenderingControl* pControl); - ~CGUIAddonRenderingControl() override = default; - - bool Create(int x, int y, int w, int h, void* device) override; - void Render() override; - void Stop() override; - bool IsDirty() override; - virtual void Delete(); - - protected: - bool (*CBCreate)(KODI_GUI_CLIENT_HANDLE cbhdl, int x, int y, int w, int h, void* device); - void (*CBRender)(KODI_GUI_CLIENT_HANDLE cbhdl); - void (*CBStop)(KODI_GUI_CLIENT_HANDLE cbhdl); - bool (*CBDirty)(KODI_GUI_CLIENT_HANDLE cbhdl); - - KODI_GUI_CLIENT_HANDLE m_clientHandle; - CAddonDll* m_addon; - CGUIRenderingControl* m_control; - int m_refCount; - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/SettingsSlider.cpp b/xbmc/addons/interfaces/gui/controls/SettingsSlider.cpp deleted file mode 100644 index c847a642dd94b..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/SettingsSlider.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "SettingsSlider.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUISettingsSliderControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlSettingsSlider::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_settings_slider = - new AddonToKodiFuncTable_kodi_gui_control_settings_slider(); - - addonInterface->toKodi->kodi_gui->control_settings_slider->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_settings_slider->set_enabled = set_enabled; - - addonInterface->toKodi->kodi_gui->control_settings_slider->set_text = set_text; - addonInterface->toKodi->kodi_gui->control_settings_slider->reset = reset; - - addonInterface->toKodi->kodi_gui->control_settings_slider->set_int_range = set_int_range; - addonInterface->toKodi->kodi_gui->control_settings_slider->set_int_value = set_int_value; - addonInterface->toKodi->kodi_gui->control_settings_slider->get_int_value = get_int_value; - addonInterface->toKodi->kodi_gui->control_settings_slider->set_int_interval = set_int_interval; - - addonInterface->toKodi->kodi_gui->control_settings_slider->set_percentage = set_percentage; - addonInterface->toKodi->kodi_gui->control_settings_slider->get_percentage = get_percentage; - - addonInterface->toKodi->kodi_gui->control_settings_slider->set_float_range = set_float_range; - addonInterface->toKodi->kodi_gui->control_settings_slider->set_float_value = set_float_value; - addonInterface->toKodi->kodi_gui->control_settings_slider->get_float_value = get_float_value; - addonInterface->toKodi->kodi_gui->control_settings_slider->set_float_interval = - set_float_interval; -} - -void Interface_GUIControlSettingsSlider::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_settings_slider; -} - -void Interface_GUIControlSettingsSlider::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlSettingsSlider::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enabled); -} - -void Interface_GUIControlSettingsSlider::set_text(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}', text='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(text), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); - msg.SetLabel(text); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -void Interface_GUIControlSettingsSlider::reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -void Interface_GUIControlSettingsSlider::set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_INT); - control->SetRange(start, end); -} - -void Interface_GUIControlSettingsSlider::set_int_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_INT); - control->SetIntValue(value); -} - -int Interface_GUIControlSettingsSlider::get_int_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - return control->GetIntValue(); -} - -void Interface_GUIControlSettingsSlider::set_int_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int interval) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetIntInterval(interval); -} - -void Interface_GUIControlSettingsSlider::set_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float percent) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); - control->SetPercentage(percent); -} - -float Interface_GUIControlSettingsSlider::get_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetPercentage(); -} - -void Interface_GUIControlSettingsSlider::set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_FLOAT); - control->SetFloatRange(start, end); -} - -void Interface_GUIControlSettingsSlider::set_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_FLOAT); - control->SetFloatValue(value); -} - -float Interface_GUIControlSettingsSlider::get_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetFloatValue(); -} - -void Interface_GUIControlSettingsSlider::set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISettingsSliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSettingsSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetFloatInterval(interval); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/SettingsSlider.h b/xbmc/addons/interfaces/gui/controls/SettingsSlider.h deleted file mode 100644 index 425c27564f181..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/SettingsSlider.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h" - */ - struct Interface_GUIControlSettingsSlider - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void set_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - static void reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end); - static void set_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - static int get_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_int_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int interval); - - static void set_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - static float get_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - static void set_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - static float get_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Slider.cpp b/xbmc/addons/interfaces/gui/controls/Slider.cpp deleted file mode 100644 index 73502d87e08ef..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Slider.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Slider.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUISliderControl.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlSlider::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_slider = - new AddonToKodiFuncTable_kodi_gui_control_slider(); - - addonInterface->toKodi->kodi_gui->control_slider->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_slider->set_enabled = set_enabled; - - addonInterface->toKodi->kodi_gui->control_slider->reset = reset; - addonInterface->toKodi->kodi_gui->control_slider->get_description = get_description; - - addonInterface->toKodi->kodi_gui->control_slider->set_int_range = set_int_range; - addonInterface->toKodi->kodi_gui->control_slider->set_int_value = set_int_value; - addonInterface->toKodi->kodi_gui->control_slider->get_int_value = get_int_value; - addonInterface->toKodi->kodi_gui->control_slider->set_int_interval = set_int_interval; - - addonInterface->toKodi->kodi_gui->control_slider->set_percentage = set_percentage; - addonInterface->toKodi->kodi_gui->control_slider->get_percentage = get_percentage; - - addonInterface->toKodi->kodi_gui->control_slider->set_float_range = set_float_range; - addonInterface->toKodi->kodi_gui->control_slider->set_float_value = set_float_value; - addonInterface->toKodi->kodi_gui->control_slider->get_float_value = get_float_value; - addonInterface->toKodi->kodi_gui->control_slider->set_float_interval = set_float_interval; -} - -void Interface_GUIControlSlider::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_slider; -} - -void Interface_GUIControlSlider::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlSlider::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enabled); -} - -void Interface_GUIControlSlider::reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -char* Interface_GUIControlSlider::get_description(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetDescription().c_str()); -} - -void Interface_GUIControlSlider::set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_INT); - control->SetRange(start, end); -} - -void Interface_GUIControlSlider::set_int_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_INT); - control->SetIntValue(value); -} - -int Interface_GUIControlSlider::get_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - return control->GetIntValue(); -} - -void Interface_GUIControlSlider::set_int_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int interval) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetIntInterval(interval); -} - -void Interface_GUIControlSlider::set_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float percent) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); - control->SetPercentage(percent); -} - -float Interface_GUIControlSlider::get_percentage(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetPercentage(); -} - -void Interface_GUIControlSlider::set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_FLOAT); - control->SetFloatRange(start, end); -} - -void Interface_GUIControlSlider::set_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(SLIDER_CONTROL_TYPE_FLOAT); - control->SetFloatValue(value); -} - -float Interface_GUIControlSlider::get_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetFloatValue(); -} - -void Interface_GUIControlSlider::set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISliderControl* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSlider::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetFloatInterval(interval); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Slider.h b/xbmc/addons/interfaces/gui/controls/Slider.h deleted file mode 100644 index 30afbafadd775..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Slider.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h" - */ - struct Interface_GUIControlSlider - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static char* get_description(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end); - static void set_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - static int get_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_int_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int interval); - - static void set_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - static float get_percentage(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - static void set_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - static float get_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/Spin.cpp b/xbmc/addons/interfaces/gui/controls/Spin.cpp deleted file mode 100644 index b9eb6ea3fc559..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Spin.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Spin.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUISpinControlEx.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlSpin::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_spin = new AddonToKodiFuncTable_kodi_gui_control_spin(); - - addonInterface->toKodi->kodi_gui->control_spin->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_spin->set_enabled = set_enabled; - - addonInterface->toKodi->kodi_gui->control_spin->set_text = set_text; - addonInterface->toKodi->kodi_gui->control_spin->reset = reset; - addonInterface->toKodi->kodi_gui->control_spin->set_type = set_type; - - addonInterface->toKodi->kodi_gui->control_spin->add_string_label = add_string_label; - addonInterface->toKodi->kodi_gui->control_spin->set_string_value = set_string_value; - addonInterface->toKodi->kodi_gui->control_spin->get_string_value = get_string_value; - - addonInterface->toKodi->kodi_gui->control_spin->add_int_label = add_int_label; - addonInterface->toKodi->kodi_gui->control_spin->set_int_range = set_int_range; - addonInterface->toKodi->kodi_gui->control_spin->set_int_value = set_int_value; - addonInterface->toKodi->kodi_gui->control_spin->get_int_value = get_int_value; - - addonInterface->toKodi->kodi_gui->control_spin->set_float_range = set_float_range; - addonInterface->toKodi->kodi_gui->control_spin->set_float_value = set_float_value; - addonInterface->toKodi->kodi_gui->control_spin->get_float_value = get_float_value; - addonInterface->toKodi->kodi_gui->control_spin->set_float_interval = set_float_interval; -} - -void Interface_GUIControlSpin::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_spin; -} - -void Interface_GUIControlSpin::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlSpin::set_enabled(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool enabled) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetEnabled(enabled); -} - -void Interface_GUIControlSpin::set_text(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}', " - "text='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(text), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); - msg.SetLabel(text); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -void Interface_GUIControlSpin::reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -void Interface_GUIControlSpin::set_type(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int type) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetType(type); -} - -void Interface_GUIControlSpin::add_string_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control || !label || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}', value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - static_cast(value), addon ? addon->ID() : "unknown"); - return; - } - - control->AddLabel(std::string(label), std::string(value)); -} - -void Interface_GUIControlSpin::set_string_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control || !value) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}', " - "value='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(value), - addon ? addon->ID() : "unknown"); - return; - } - - control->SetStringValue(std::string(value)); -} - -char* Interface_GUIControlSpin::get_string_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetStringValue().c_str()); -} - -void Interface_GUIControlSpin::add_int_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - int value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control || !label) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}', " - "label='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(label), - addon ? addon->ID() : "unknown"); - return; - } - - control->AddLabel(std::string(label), value); -} - -void Interface_GUIControlSpin::set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetRange(start, end); -} - -void Interface_GUIControlSpin::set_int_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetValue(value); -} - -int Interface_GUIControlSpin::get_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return -1; - } - - return control->GetValue(); -} - -void Interface_GUIControlSpin::set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetFloatRange(start, end); -} - -void Interface_GUIControlSpin::set_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float value) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetFloatValue(value); -} - -float Interface_GUIControlSpin::get_float_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return 0.0f; - } - - return control->GetFloatValue(); -} - -void Interface_GUIControlSpin::set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUISpinControlEx* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlSpin::{} - invalid handler data (kodiBase='{}', handle='{}') " - "on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetFloatInterval(interval); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/Spin.h b/xbmc/addons/interfaces/gui/controls/Spin.h deleted file mode 100644 index 1c7102ea44e03..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/Spin.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h" - */ - struct Interface_GUIControlSpin - { - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void set_enabled(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - - static void set_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - static void reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_type(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int type); - - static void add_string_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - const char* value); - static void add_int_label(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - int value); - - static void set_string_value(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* value); - static char* get_string_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_int_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int start, - int end); - static void set_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - static int get_int_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - - static void set_float_range(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - static void set_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - static float get_float_value(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_float_interval(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/controls/TextBox.cpp b/xbmc/addons/interfaces/gui/controls/TextBox.cpp deleted file mode 100644 index 44c5f893d2656..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/TextBox.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "TextBox.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUITextBox.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIControlTextBox::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->control_text_box = - new AddonToKodiFuncTable_kodi_gui_control_text_box(); - - addonInterface->toKodi->kodi_gui->control_text_box->set_visible = set_visible; - addonInterface->toKodi->kodi_gui->control_text_box->reset = reset; - addonInterface->toKodi->kodi_gui->control_text_box->set_text = set_text; - addonInterface->toKodi->kodi_gui->control_text_box->get_text = get_text; - addonInterface->toKodi->kodi_gui->control_text_box->scroll = scroll; - addonInterface->toKodi->kodi_gui->control_text_box->set_auto_scrolling = set_auto_scrolling; -} - -void Interface_GUIControlTextBox::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->control_text_box; -} - -void Interface_GUIControlTextBox::set_visible(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - bool visible) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetVisible(visible); -} - -void Interface_GUIControlTextBox::reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_RESET, control->GetParentID(), control->GetID()); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -void Interface_GUIControlTextBox::set_text(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}', text='{}') on addon '{}'", - __func__, kodiBase, handle, static_cast(text), - addon ? addon->ID() : "unknown"); - return; - } - - CGUIMessage msg(GUI_MSG_LABEL_SET, control->GetParentID(), control->GetID()); - msg.SetLabel(text); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg, control->GetParentID()); -} - -char* Interface_GUIControlTextBox::get_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return nullptr; - } - - return strdup(control->GetDescription().c_str()); -} - -void Interface_GUIControlTextBox::scroll(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - unsigned int position) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->Scroll(position); -} - -void Interface_GUIControlTextBox::set_auto_scrolling( - KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) -{ - CAddonDll* addon = static_cast(kodiBase); - CGUITextBox* control = static_cast(handle); - if (!addon || !control) - { - CLog::Log(LOGERROR, - "Interface_GUIControlTextBox::{} - invalid handler data (kodiBase='{}', " - "handle='{}') on addon '{}'", - __func__, kodiBase, handle, addon ? addon->ID() : "unknown"); - return; - } - - control->SetAutoScrolling(delay, time, repeat); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/controls/TextBox.h b/xbmc/addons/interfaces/gui/controls/TextBox.h deleted file mode 100644 index 09c2ff4e6152b..0000000000000 --- a/xbmc/addons/interfaces/gui/controls/TextBox.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold general gui functions and initialize also all other gui related types not - * related to a instance type and usable for every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h" - */ - struct Interface_GUIControlTextBox - { - - 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 void set_visible(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - static void reset(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void set_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - static char* get_text(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - static void scroll(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, unsigned int position); - static void set_auto_scrolling( - KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/CMakeLists.txt b/xbmc/addons/interfaces/gui/dialogs/CMakeLists.txt deleted file mode 100644 index 4dad4e9b73fa5..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -set(SOURCES ContextMenu.cpp - ExtendedProgressBar.cpp - FileBrowser.cpp - Keyboard.cpp - Numeric.cpp - OK.cpp - Progress.cpp - Select.cpp - TextViewer.cpp - YesNo.cpp) - -set(HEADERS ContextMenu.h - ExtendedProgressBar.h - FileBrowser.h - Keyboard.h - Numeric.h - OK.h - Progress.h - Select.h - TextViewer.h - YesNo.h) - -core_add_library(addons_interfaces_gui_dialogs) diff --git a/xbmc/addons/interfaces/gui/dialogs/ContextMenu.cpp b/xbmc/addons/interfaces/gui/dialogs/ContextMenu.cpp deleted file mode 100644 index e0e5684652ff6..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/ContextMenu.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "ContextMenu.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h" -#include "dialogs/GUIDialogContextMenu.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogContextMenu::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogContextMenu = - new AddonToKodiFuncTable_kodi_gui_dialogContextMenu(); - - addonInterface->toKodi->kodi_gui->dialogContextMenu->open = open; -} - -void Interface_GUIDialogContextMenu::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogContextMenu; -} - -int Interface_GUIDialogContextMenu::open(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogContextMenu::{} - invalid data", __func__); - return -1; - } - - CGUIDialogContextMenu* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_CONTEXT_MENU); - if (!heading || !entries || !dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogContextMenu::{} - invalid handler data (heading='{}', " - "entries='{}', dialog='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(entries), - kodiBase, addon->ID()); - return -1; - } - - CContextButtons choices; - for (unsigned int i = 0; i < size; ++i) - choices.Add(i, entries[i]); - - return dialog->Show(choices); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/ContextMenu.h b/xbmc/addons/interfaces/gui/dialogs/ContextMenu.h deleted file mode 100644 index 7b41a28fbceb8..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/ContextMenu.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h" - */ - struct Interface_GUIDialogContextMenu - { - 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 int open(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.cpp b/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.cpp deleted file mode 100644 index 9e7f7a7e69083..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "ExtendedProgressBar.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogExtendedProgress::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogExtendedProgress = - new AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress(); - - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->new_dialog = new_dialog; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->delete_dialog = delete_dialog; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->get_title = get_title; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->set_title = set_title; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->get_text = get_text; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->set_text = set_text; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->is_finished = is_finished; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->mark_finished = mark_finished; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->get_percentage = get_percentage; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->set_percentage = set_percentage; - addonInterface->toKodi->kodi_gui->dialogExtendedProgress->set_progress = set_progress; -} - -void Interface_GUIDialogExtendedProgress::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogExtendedProgress; -} - -KODI_GUI_HANDLE Interface_GUIDialogExtendedProgress::new_dialog(KODI_HANDLE kodiBase, - const char* title) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return nullptr; - } - - // setup the progress dialog - CGUIDialogExtendedProgressBar* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_EXT_PROGRESS); - if (!title || !dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid handler data (title='{}', " - "dialog='{}') on addon '{}'", - __func__, static_cast(title), static_cast(dialog), addon->ID()); - return nullptr; - } - - CGUIDialogProgressBarHandle* dlgProgressHandle = dialog->GetHandle(title); - return dlgProgressHandle; -} - -void Interface_GUIDialogExtendedProgress::delete_dialog(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid handler data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->MarkFinished(); -} - -char* Interface_GUIDialogExtendedProgress::get_title(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return nullptr; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid handler data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return nullptr; - } - - return strdup(static_cast(handle)->Title().c_str()); -} - -void Interface_GUIDialogExtendedProgress::set_title(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - const char* title) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle || !title) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid handler data (handle='{}', " - "title='{}') on addon '{}'", - __func__, handle, static_cast(title), addon->ID()); - return; - } - - static_cast(handle)->SetTitle(title); -} - -char* Interface_GUIDialogExtendedProgress::get_text(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return nullptr; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return nullptr; - } - - return strdup(static_cast(handle)->Text().c_str()); -} - -void Interface_GUIDialogExtendedProgress::set_text(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid handler data (handle='{}', " - "text='{}') on addon '{}'", - __func__, handle, static_cast(text), addon->ID()); - return; - } - - static_cast(handle)->SetText(text); -} - -bool Interface_GUIDialogExtendedProgress::is_finished(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return false; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return false; - } - - return static_cast(handle)->IsFinished(); -} - -void Interface_GUIDialogExtendedProgress::mark_finished(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->MarkFinished(); -} - -float Interface_GUIDialogExtendedProgress::get_percentage(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return 0.0f; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return 0.0f; - } - - return static_cast(handle)->Percentage(); -} - -void Interface_GUIDialogExtendedProgress::set_percentage(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - float percentage) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetPercentage(percentage); -} - -void Interface_GUIDialogExtendedProgress::set_progress(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int currentItem, - int itemCount) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogExtendedProgress::{} - invalid kodi base data", - __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogExtendedProgress::{} - invalid add-on data (handle='{}') on " - "addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetProgress(currentItem, itemCount); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.h b/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.h deleted file mode 100644 index 66ccb49e6b0dd..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h" - */ - struct Interface_GUIDialogExtendedProgress - { - 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 KODI_GUI_HANDLE new_dialog(KODI_HANDLE kodiBase, const char* title); - static void delete_dialog(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static char* get_title(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void set_title(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* title); - static char* get_text(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void set_text(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* text); - static bool is_finished(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void mark_finished(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static float get_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void set_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, float percentage); - static void set_progress(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int currentItem, - int itemCount); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/FileBrowser.cpp b/xbmc/addons/interfaces/gui/dialogs/FileBrowser.cpp deleted file mode 100644 index 84d64432326ea..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/FileBrowser.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "FileBrowser.h" - -#include "URL.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h" -#include "dialogs/GUIDialogFileBrowser.h" -#include "settings/MediaSourceSettings.h" -#include "storage/MediaManager.h" -#include "utils/URIUtils.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogFileBrowser::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogFileBrowser = - new AddonToKodiFuncTable_kodi_gui_dialogFileBrowser(); - - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_directory = - show_and_get_directory; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file = show_and_get_file; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_from_dir = - show_and_get_file_from_dir; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_list = - show_and_get_file_list; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_source = show_and_get_source; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image = show_and_get_image; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image_list = - show_and_get_image_list; - addonInterface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list = clear_file_list; -} - -void Interface_GUIDialogFileBrowser::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogFileBrowser; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_directory(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out, - bool write_only) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!shares || !heading || !path_in || !path_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (shares='{}', " - "heading='{}', path_in='{}', path_out='{}') on addon '{}'", - __func__, static_cast(shares), static_cast(heading), - static_cast(path_in), static_cast(path_out), addon->ID()); - return false; - } - - std::string strPath = path_in; - - VECSOURCES vecShares; - GetVECShares(vecShares, shares, strPath); - bool bRet = CGUIDialogFileBrowser::ShowAndGetDirectory(vecShares, heading, strPath, write_only); - if (bRet) - *path_out = strdup(strPath.c_str()); - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_file(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!shares || !mask || !heading || !path_in || !path_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (shares='{}', mask='{}', " - "heading='{}', path_in='{}', path_out='{}') on addon '{}'", - __func__, static_cast(shares), static_cast(mask), - static_cast(heading), static_cast(path_in), - static_cast(path_out), addon->ID()); - return false; - } - - std::string strPath = path_in; - - VECSOURCES vecShares; - GetVECShares(vecShares, shares, strPath); - bool bRet = CGUIDialogFileBrowser::ShowAndGetFile(vecShares, mask, heading, strPath, use_thumbs, - use_file_directories); - if (bRet) - *path_out = strdup(strPath.c_str()); - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_file_from_dir(KODI_HANDLE kodiBase, - const char* directory, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories, - bool single_list) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!directory || !mask || !heading || !path_in || !path_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (directory='{}', " - "mask='{}', heading='{}', path_in='{}', path_out='{}') on addon '{}'", - __func__, static_cast(directory), static_cast(mask), - static_cast(heading), static_cast(path_in), - static_cast(path_out), addon->ID()); - return false; - } - - std::string strPath = path_in; - bool bRet = CGUIDialogFileBrowser::ShowAndGetFile(directory, mask, heading, strPath, use_thumbs, - use_file_directories, single_list); - if (bRet) - *path_out = strdup(strPath.c_str()); - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_file_list(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - char*** file_list, - unsigned int* entries, - bool use_thumbs, - bool use_file_directories) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!shares || !mask || !heading || !file_list || !entries) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (shares='{}', mask='{}', " - "heading='{}', file_list='{}', entries='{}') on addon '{}'", - __func__, static_cast(shares), static_cast(mask), - static_cast(heading), static_cast(file_list), - static_cast(entries), addon->ID()); - return false; - } - - VECSOURCES vecShares; - GetVECShares(vecShares, shares, ""); - - std::vector pathsInt; - bool bRet = CGUIDialogFileBrowser::ShowAndGetFileList(vecShares, mask, heading, pathsInt, - use_thumbs, use_file_directories); - if (bRet) - { - *entries = pathsInt.size(); - *file_list = static_cast(malloc(*entries * sizeof(char*))); - for (unsigned int i = 0; i < *entries; ++i) - (*file_list)[i] = strdup(pathsInt[i].c_str()); - } - else - *entries = 0; - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_source(KODI_HANDLE kodiBase, - const char* path_in, - char** path_out, - bool allowNetworkShares, - const char* additionalShare, - const char* strType) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!strType || !additionalShare || !path_in || !path_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (additionalShare='{}', " - "strType='{}', path_in='{}', path_out='{}') on addon '{}'", - __func__, static_cast(additionalShare), - static_cast(strType), static_cast(path_in), - static_cast(path_out), addon->ID()); - return false; - } - - std::string strPath = path_in; - - VECSOURCES vecShares; - if (additionalShare) - GetVECShares(vecShares, additionalShare, strPath); - bool bRet = - CGUIDialogFileBrowser::ShowAndGetSource(strPath, allowNetworkShares, &vecShares, strType); - if (bRet) - *path_out = strdup(strPath.c_str()); - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_image(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!shares || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (shares='{}', " - "heading='{}') on addon '{}'", - __func__, static_cast(shares), static_cast(heading), - addon->ID()); - return false; - } - - std::string strPath = path_in; - - VECSOURCES vecShares; - GetVECShares(vecShares, shares, strPath); - bool bRet = CGUIDialogFileBrowser::ShowAndGetImage(vecShares, heading, strPath); - if (bRet) - *path_out = strdup(strPath.c_str()); - return bRet; -} - -bool Interface_GUIDialogFileBrowser::show_and_get_image_list(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - char*** file_list, - unsigned int* entries) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return false; - } - - if (!shares || !heading || !file_list || !entries) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (shares='{}', " - "heading='{}', file_list='{}', entries='{}') on addon '{}'", - __func__, static_cast(shares), static_cast(heading), - static_cast(file_list), static_cast(entries), addon->ID()); - return false; - } - - VECSOURCES vecShares; - GetVECShares(vecShares, shares, ""); - - std::vector pathsInt; - bool bRet = CGUIDialogFileBrowser::ShowAndGetImageList(vecShares, heading, pathsInt); - if (bRet) - { - *entries = pathsInt.size(); - *file_list = static_cast(malloc(*entries * sizeof(char*))); - for (unsigned int i = 0; i < *entries; ++i) - (*file_list)[i] = strdup(pathsInt[i].c_str()); - } - else - *entries = 0; - return bRet; -} - -void Interface_GUIDialogFileBrowser::clear_file_list(KODI_HANDLE kodiBase, - char*** file_list, - unsigned int entries) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogFileBrowser::{} - invalid data", __func__); - return; - } - - if (*file_list) - { - for (unsigned int i = 0; i < entries; ++i) - free((*file_list)[i]); - free(*file_list); - *file_list = nullptr; - } - else - { - - CLog::Log(LOGERROR, - "Interface_GUIDialogFileBrowser::{} - invalid handler data (file_list='{}') on " - "addon '{}'", - __func__, static_cast(file_list), addon->ID()); - } -} - -void Interface_GUIDialogFileBrowser::GetVECShares(VECSOURCES& vecShares, - const std::string& strShares, - const std::string& strPath) -{ - std::size_t found; - found = strShares.find("local"); - if (found != std::string::npos) - CServiceBroker::GetMediaManager().GetLocalDrives(vecShares); - found = strShares.find("network"); - if (found != std::string::npos) - CServiceBroker::GetMediaManager().GetNetworkLocations(vecShares); - found = strShares.find("removable"); - if (found != std::string::npos) - CServiceBroker::GetMediaManager().GetRemovableDrives(vecShares); - found = strShares.find("programs"); - if (found != std::string::npos) - { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("programs"); - if (sources != nullptr) - vecShares.insert(vecShares.end(), sources->begin(), sources->end()); - } - found = strShares.find("files"); - if (found != std::string::npos) - { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("files"); - if (sources != nullptr) - vecShares.insert(vecShares.end(), sources->begin(), sources->end()); - } - found = strShares.find("music"); - if (found != std::string::npos) - { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("music"); - if (sources != nullptr) - vecShares.insert(vecShares.end(), sources->begin(), sources->end()); - } - found = strShares.find("video"); - if (found != std::string::npos) - { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("video"); - if (sources != nullptr) - vecShares.insert(vecShares.end(), sources->begin(), sources->end()); - } - found = strShares.find("pictures"); - if (found != std::string::npos) - { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources("pictures"); - if (sources != nullptr) - vecShares.insert(vecShares.end(), sources->begin(), sources->end()); - } - - if (vecShares.empty()) - { - CMediaSource share; - std::string basePath = strPath; - std::string tempPath; - while (URIUtils::GetParentPath(basePath, tempPath)) - basePath = tempPath; - share.strPath = basePath; - // don't include the user details in the share name - CURL url(share.strPath); - share.strName = url.GetWithoutUserDetails(); - vecShares.push_back(share); - } -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/FileBrowser.h b/xbmc/addons/interfaces/gui/dialogs/FileBrowser.h deleted file mode 100644 index c2193f3f72ce3..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/FileBrowser.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h" - -#include -#include - -class CMediaSource; - -typedef std::vector VECSOURCES; - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h" - */ - struct Interface_GUIDialogFileBrowser - { - 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 show_and_get_directory(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out, - bool write_only); - - static bool show_and_get_file(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories); - - static bool show_and_get_file_from_dir(KODI_HANDLE kodiBase, - const char* directory, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories, - bool singleList); - - static bool show_and_get_file_list(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - char*** file_list, - unsigned int* entries, - bool use_thumbs, - bool use_file_directories); - - static bool show_and_get_source(KODI_HANDLE kodiBase, - const char* path_in, - char** path_out, - bool allow_network_shares, - const char* additional_share, - const char* type); - - static bool show_and_get_image(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out); - - static bool show_and_get_image_list(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - char*** file_list, - unsigned int* entries); - - static void clear_file_list(KODI_HANDLE kodiBase, char*** file_list, unsigned int entries); - //@} - - private: - static void GetVECShares(VECSOURCES& vecShares, - const std::string& strShares, - const std::string& strPath); - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Keyboard.cpp b/xbmc/addons/interfaces/gui/dialogs/Keyboard.cpp deleted file mode 100644 index 7ec56ab18b605..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Keyboard.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Keyboard.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h" -#include "guilib/GUIKeyboardFactory.h" -#include "utils/Variant.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogKeyboard::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogKeyboard = - new AddonToKodiFuncTable_kodi_gui_dialogKeyboard(); - - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input_with_head = - show_and_get_input_with_head; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input = show_and_get_input; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password_with_head = - show_and_get_new_password_with_head; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password = - show_and_get_new_password; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password_with_head = - show_and_verify_new_password_with_head; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password = - show_and_verify_new_password; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_password = - show_and_verify_password; - addonInterface->toKodi->kodi_gui->dialogKeyboard->show_and_get_filter = show_and_get_filter; - addonInterface->toKodi->kodi_gui->dialogKeyboard->send_text_to_active_keyboard = - send_text_to_active_keyboard; - addonInterface->toKodi->kodi_gui->dialogKeyboard->is_keyboard_activated = is_keyboard_activated; -} - -void Interface_GUIDialogKeyboard::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogKeyboard; -} - -bool Interface_GUIDialogKeyboard::show_and_get_input_with_head(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - const char* heading, - bool allow_empty_result, - bool hidden_input, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!text_in || !text_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (text_in='{}', " - "text_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(text_in), static_cast(text_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = text_in; - bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, CVariant{heading}, allow_empty_result, - hidden_input, auto_close_ms); - if (bRet) - *text_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::show_and_get_input(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool allow_empty_result, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!text_in || !text_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (text_in='{}', " - "text_out='{}') on addon '{}'", - __func__, static_cast(text_in), static_cast(text_out), - addon->ID()); - return false; - } - - std::string str = text_in; - bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, allow_empty_result, auto_close_ms); - if (bRet) - *text_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::show_and_get_new_password_with_head(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - bool allow_empty_result, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!password_in || !password_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (password_in='{}', " - "password_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(password_in), static_cast(password_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = password_in; - bool bRet = - CGUIKeyboardFactory::ShowAndGetNewPassword(str, heading, allow_empty_result, auto_close_ms); - if (bRet) - *password_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::show_and_get_new_password(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!password_in || !password_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (password_in='{}', " - "password_out='{}') on addon '{}'", - __func__, static_cast(password_in), static_cast(password_out), - addon->ID()); - return false; - } - - std::string str = password_in; - bool bRet = CGUIKeyboardFactory::ShowAndGetNewPassword(str, auto_close_ms); - if (bRet) - *password_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::show_and_verify_new_password_with_head(KODI_HANDLE kodiBase, - char** password_out, - const char* heading, - bool allowEmpty, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!password_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (password_out='{}', " - "heading='{}') on addon '{}'", - __func__, static_cast(password_out), static_cast(heading), - addon->ID()); - return false; - } - - std::string str; - bool bRet = - CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, heading, allowEmpty, auto_close_ms); - if (bRet) - *password_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::show_and_verify_new_password(KODI_HANDLE kodiBase, - char** password_out, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!password_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (password_out='{}') on " - "addon '{}'", - __func__, static_cast(password_out), addon->ID()); - return false; - } - - std::string str; - bool bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, auto_close_ms); - if (bRet) - *password_out = strdup(str.c_str()); - return bRet; -} - -int Interface_GUIDialogKeyboard::show_and_verify_password(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - int retries, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!password_in || !password_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (password_in='{}', " - "password_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(password_in), static_cast(password_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = password_in; - int iRet = CGUIKeyboardFactory::ShowAndVerifyPassword(str, heading, retries, auto_close_ms); - if (iRet) - *password_out = strdup(str.c_str()); - return iRet; -} - -bool Interface_GUIDialogKeyboard::show_and_get_filter(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool searching, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - if (!text_in || !text_out) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogKeyboard::{} - invalid handler data (text_in='{}', " - "text_out='{}') on addon '{}'", - __func__, static_cast(text_in), static_cast(text_out), - addon->ID()); - return false; - } - - - std::string str = text_in; - bool bRet = CGUIKeyboardFactory::ShowAndGetFilter(str, searching, auto_close_ms); - if (bRet) - *text_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogKeyboard::send_text_to_active_keyboard(KODI_HANDLE kodiBase, - const char* text, - bool close_keyboard) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - return CGUIKeyboardFactory::SendTextToActiveKeyboard(text, close_keyboard); -} - -bool Interface_GUIDialogKeyboard::is_keyboard_activated(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogKeyboard::{} - invalid data", __func__); - return false; - } - - return CGUIKeyboardFactory::isKeyboardActivated(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Keyboard.h b/xbmc/addons/interfaces/gui/dialogs/Keyboard.h deleted file mode 100644 index fb7d6b9d595ad..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Keyboard.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h" - */ - struct Interface_GUIDialogKeyboard - { - 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 show_and_get_input_with_head(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - const char* heading, - bool allow_empty_result, - bool hidden_input, - unsigned int auto_close_ms); - static bool show_and_get_input(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool allow_empty_result, - unsigned int auto_close_ms); - static bool show_and_get_new_password_with_head(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - bool allow_empty_result, - unsigned int auto_close_ms); - static bool show_and_get_new_password(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - unsigned int auto_close_ms); - static bool show_and_verify_new_password_with_head(KODI_HANDLE kodiBase, - char** password_out, - const char* heading, - bool allowEmpty, - unsigned int auto_close_ms); - static bool show_and_verify_new_password(KODI_HANDLE kodiBase, - char** password_out, - unsigned int auto_close_ms); - static int show_and_verify_password(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - int retries, - unsigned int auto_close_ms); - static bool show_and_get_filter(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool searching, - unsigned int auto_close_ms); - static bool send_text_to_active_keyboard(KODI_HANDLE kodiBase, - const char* text, - bool close_keyboard); - static bool is_keyboard_activated(KODI_HANDLE kodiBase); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Numeric.cpp b/xbmc/addons/interfaces/gui/dialogs/Numeric.cpp deleted file mode 100644 index a78aa4af607af..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Numeric.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Numeric.h" - -#include "XBDateTime.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h" -#include "dialogs/GUIDialogNumeric.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogNumeric::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogNumeric = - new AddonToKodiFuncTable_kodi_gui_dialogNumeric(); - - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password = - show_and_verify_new_password; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_verify_password = - show_and_verify_password; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_verify_input = show_and_verify_input; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_get_time = show_and_get_time; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_get_date = show_and_get_date; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_get_ip_address = - show_and_get_ip_address; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_get_number = show_and_get_number; - addonInterface->toKodi->kodi_gui->dialogNumeric->show_and_get_seconds = show_and_get_seconds; -} - -void Interface_GUIDialogNumeric::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogNumeric; -} - -bool Interface_GUIDialogNumeric::show_and_verify_new_password(KODI_HANDLE kodiBase, char** password) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - std::string str; - bool bRet = CGUIDialogNumeric::ShowAndVerifyNewPassword(str); - if (bRet) - *password = strdup(str.c_str()); - return bRet; -} - -int Interface_GUIDialogNumeric::show_and_verify_password(KODI_HANDLE kodiBase, - const char* password, - const char* heading, - int retries) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return -1; - } - - if (!password || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (password='{}', heading='{}') " - "on addon '{}'", - __func__, static_cast(password), static_cast(heading), - addon->ID()); - return -1; - } - - std::string pw(password); - return CGUIDialogNumeric::ShowAndVerifyPassword(pw, heading, retries); -} - -bool Interface_GUIDialogNumeric::show_and_verify_input(KODI_HANDLE kodiBase, - const char* verify_in, - char** verify_out, - const char* heading, - bool verify_input) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!verify_in || !verify_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (verify_in='{}', " - "verify_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(verify_in), static_cast(verify_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = verify_in; - if (CGUIDialogNumeric::ShowAndVerifyInput(str, heading, verify_input) == - InputVerificationResult::SUCCESS) - { - *verify_out = strdup(str.c_str()); - return true; - } - return false; -} - -bool Interface_GUIDialogNumeric::show_and_get_time(KODI_HANDLE kodiBase, - tm* time, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!time || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (time='{}', heading='{}') on " - "addon '{}'", - __func__, static_cast(time), static_cast(heading), addon->ID()); - return false; - } - - KODI::TIME::SystemTime systemTime; - CDateTime dateTime(*time); - dateTime.GetAsSystemTime(systemTime); - if (CGUIDialogNumeric::ShowAndGetTime(systemTime, heading)) - { - dateTime = systemTime; - dateTime.GetAsTm(*time); - return true; - } - return false; -} - -bool Interface_GUIDialogNumeric::show_and_get_date(KODI_HANDLE kodiBase, - tm* date, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!date || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (date='{}', heading='{}') on " - "addon '{}'", - __func__, static_cast(date), static_cast(heading), addon->ID()); - return false; - } - - KODI::TIME::SystemTime systemTime; - CDateTime dateTime(*date); - dateTime.GetAsSystemTime(systemTime); - if (CGUIDialogNumeric::ShowAndGetDate(systemTime, heading)) - { - dateTime = systemTime; - dateTime.GetAsTm(*date); - return true; - } - return false; -} - -bool Interface_GUIDialogNumeric::show_and_get_ip_address(KODI_HANDLE kodiBase, - const char* ip_address_in, - char** ip_address_out, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!ip_address_in || !ip_address_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (ip_address_in='{}', " - "ip_address_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(ip_address_in), static_cast(ip_address_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string strIP = ip_address_in; - bool bRet = CGUIDialogNumeric::ShowAndGetIPAddress(strIP, heading); - if (bRet) - *ip_address_out = strdup(strIP.c_str()); - return bRet; -} - -bool Interface_GUIDialogNumeric::show_and_get_number(KODI_HANDLE kodiBase, - const char* number_in, - char** number_out, - const char* heading, - unsigned int auto_close_ms) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!number_in || !number_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (number_in='{}', " - "number_out='{}', heading='{}') on addon '{}'", - __func__, static_cast(number_in), static_cast(number_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = number_in; - bool bRet = CGUIDialogNumeric::ShowAndGetNumber(str, heading, auto_close_ms); - if (bRet) - *number_out = strdup(str.c_str()); - return bRet; -} - -bool Interface_GUIDialogNumeric::show_and_get_seconds(KODI_HANDLE kodiBase, - const char* time_in, - char** time_out, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogNumeric::{} - invalid data", __func__); - return false; - } - - if (!time_in || !time_out || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogNumeric::{} - invalid handler data (time_in='{}', time_out='{}', " - "heading='{}') on addon '{}'", - __func__, static_cast(time_in), static_cast(time_out), - static_cast(heading), addon->ID()); - return false; - } - - std::string str = time_in; - bool bRet = CGUIDialogNumeric::ShowAndGetSeconds(str, heading); - if (bRet) - *time_out = strdup(str.c_str()); - return bRet; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Numeric.h b/xbmc/addons/interfaces/gui/dialogs/Numeric.h deleted file mode 100644 index a54ad525b5d6f..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Numeric.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h" - */ - struct Interface_GUIDialogNumeric - { - 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 show_and_verify_new_password(KODI_HANDLE kodiBase, char** password); - static int show_and_verify_password(KODI_HANDLE kodiBase, - const char* password, - const char* heading, - int retries); - static bool show_and_verify_input(KODI_HANDLE kodiBase, - const char* verify_in, - char** verify_out, - const char* heading, - bool verify_input); - static bool show_and_get_time(KODI_HANDLE kodiBase, tm* time, const char* heading); - static bool show_and_get_date(KODI_HANDLE kodiBase, tm* date, const char* heading); - static bool show_and_get_ip_address(KODI_HANDLE kodiBase, - const char* ip_address_in, - char** ip_address_out, - const char* heading); - static bool show_and_get_number(KODI_HANDLE kodiBase, - const char* number_in, - char** number_out, - const char* heading, - unsigned int auto_close_ms); - static bool show_and_get_seconds(KODI_HANDLE kodiBase, - const char* time_in, - char** time_out, - const char* heading); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/OK.cpp b/xbmc/addons/interfaces/gui/dialogs/OK.cpp deleted file mode 100644 index 90e9d6999b8f6..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/OK.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "OK.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h" -#include "messaging/helpers/DialogOKHelper.h" -#include "utils/Variant.h" -#include "utils/log.h" - -using namespace KODI::MESSAGING; - -namespace ADDON -{ - -void Interface_GUIDialogOK::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogOK = new AddonToKodiFuncTable_kodi_gui_dialogOK(); - - addonInterface->toKodi->kodi_gui->dialogOK->show_and_get_input_single_text = - show_and_get_input_single_text; - addonInterface->toKodi->kodi_gui->dialogOK->show_and_get_input_line_text = - show_and_get_input_line_text; -} - -void Interface_GUIDialogOK::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogOK; -} - -void Interface_GUIDialogOK::show_and_get_input_single_text(KODI_HANDLE kodiBase, - const char* heading, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon || !heading || !text) - { - CLog::Log( - LOGERROR, "Interface_GUIDialogOK:{} - invalid data (addon='{}', heading='{}', text='{}')", - __func__, kodiBase, static_cast(heading), static_cast(text)); - return; - } - - HELPERS::ShowOKDialogText(CVariant{heading}, CVariant{text}); -} - -void Interface_GUIDialogOK::show_and_get_input_line_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon || !heading || !line0 || !line1 || !line2) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogOK::{} - invalid data (addon='{}', heading='{}', line0='{}', " - "line1='{}', line2='{}')", - __func__, kodiBase, static_cast(heading), - static_cast(line0), static_cast(line1), - static_cast(line2)); - return; - } - HELPERS::ShowOKDialogLines(CVariant{heading}, CVariant{line0}, CVariant{line1}, CVariant{line2}); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/OK.h b/xbmc/addons/interfaces/gui/dialogs/OK.h deleted file mode 100644 index fd13719a99abd..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/OK.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h" - */ - struct Interface_GUIDialogOK - { - static void Init(AddonGlobalInterface* addonInterface); - static void DeInit(AddonGlobalInterface* addonInterface); - - /*! - * @brief callback functions from add-on to kodi - * - * @note For add of new functions use the "_" style to identify direct a - * add-on callback function. Everything with CamelCase is only for the - * usage in Kodi only. - * - * The parameter `kodiBase` is used to become the pointer for a `CAddonDll` - * class. - */ - //@{ - static void show_and_get_input_single_text(KODI_HANDLE kodiBase, - const char* heading, - const char* text); - static void show_and_get_input_line_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Progress.cpp b/xbmc/addons/interfaces/gui/dialogs/Progress.cpp deleted file mode 100644 index ff6c7424ba81f..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Progress.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright (C) 2015-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Progress.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h" -#include "dialogs/GUIDialogProgress.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/Variant.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogProgress::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogProgress = - new AddonToKodiFuncTable_kodi_gui_dialogProgress(); - - addonInterface->toKodi->kodi_gui->dialogProgress->new_dialog = new_dialog; - addonInterface->toKodi->kodi_gui->dialogProgress->delete_dialog = delete_dialog; - addonInterface->toKodi->kodi_gui->dialogProgress->open = open; - addonInterface->toKodi->kodi_gui->dialogProgress->set_heading = set_heading; - addonInterface->toKodi->kodi_gui->dialogProgress->set_line = set_line; - addonInterface->toKodi->kodi_gui->dialogProgress->set_can_cancel = set_can_cancel; - addonInterface->toKodi->kodi_gui->dialogProgress->is_canceled = is_canceled; - addonInterface->toKodi->kodi_gui->dialogProgress->set_percentage = set_percentage; - addonInterface->toKodi->kodi_gui->dialogProgress->get_percentage = get_percentage; - addonInterface->toKodi->kodi_gui->dialogProgress->show_progress_bar = show_progress_bar; - addonInterface->toKodi->kodi_gui->dialogProgress->set_progress_max = set_progress_max; - addonInterface->toKodi->kodi_gui->dialogProgress->set_progress_advance = set_progress_advance; - addonInterface->toKodi->kodi_gui->dialogProgress->abort = abort; -} - -void Interface_GUIDialogProgress::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogProgress; -} - -KODI_GUI_HANDLE Interface_GUIDialogProgress::new_dialog(KODI_HANDLE kodiBase) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return nullptr; - } - - CGUIDialogProgress* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_PROGRESS); - if (!dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (dialog='{}') on addon '{}'", - __func__, static_cast(dialog), addon->ID()); - return nullptr; - } - - return dialog; -} - -void Interface_GUIDialogProgress::delete_dialog(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->Close(); -} - -void Interface_GUIDialogProgress::open(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->Open(); -} - -void Interface_GUIDialogProgress::set_heading(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - const char* heading) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle || !heading) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}', heading='{}') " - "on addon '{}'", - __func__, handle, static_cast(heading), addon->ID()); - return; - } - - static_cast(handle)->SetHeading(heading); -} - -void Interface_GUIDialogProgress::set_line(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - unsigned int line, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle || !text) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}', text='{}') on " - "addon '{}'", - __func__, handle, static_cast(text), addon->ID()); - return; - } - - static_cast(handle)->SetLine(line, text); -} - -void Interface_GUIDialogProgress::set_can_cancel(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - bool canCancel) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetCanCancel(canCancel); -} - -bool Interface_GUIDialogProgress::is_canceled(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return false; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return false; - } - - return static_cast(handle)->IsCanceled(); -} - -void Interface_GUIDialogProgress::set_percentage(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int percentage) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetPercentage(percentage); -} - -int Interface_GUIDialogProgress::get_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return 0; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return 0; - } - - return static_cast(handle)->GetPercentage(); -} - -void Interface_GUIDialogProgress::show_progress_bar(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - bool onOff) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->ShowProgressBar(onOff); -} - -void Interface_GUIDialogProgress::set_progress_max(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int max) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetProgressMax(max); -} - -void Interface_GUIDialogProgress::set_progress_advance(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int nSteps) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return; - } - - static_cast(handle)->SetProgressAdvance(nSteps); -} - -bool Interface_GUIDialogProgress::abort(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogProgress::{} - invalid data", __func__); - return false; - } - - if (!handle) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogProgress::{} - invalid handler data (handle='{}') on addon '{}'", - __func__, handle, addon->ID()); - return false; - } - - return static_cast(handle)->Abort(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Progress.h b/xbmc/addons/interfaces/gui/dialogs/Progress.h deleted file mode 100644 index ba31f3c74c1ec..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Progress.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h" - */ - struct Interface_GUIDialogProgress - { - 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 KODI_GUI_HANDLE new_dialog(KODI_HANDLE kodiBase); - static void delete_dialog(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void open(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void set_heading(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* heading); - static void set_line(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - unsigned int line, - const char* text); - static void set_can_cancel(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, bool canCancel); - static bool is_canceled(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void set_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int percentage); - static int get_percentage(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - static void show_progress_bar(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, bool bOnOff); - static void set_progress_max(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int max); - static void set_progress_advance(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int nSteps); - static bool abort(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Select.cpp b/xbmc/addons/interfaces/gui/dialogs/Select.cpp deleted file mode 100644 index 7ad6ed667fd2e..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Select.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "Select.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h" -#include "dialogs/GUIDialogSelect.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/Variant.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogSelect::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogSelect = new AddonToKodiFuncTable_kodi_gui_dialogSelect(); - - addonInterface->toKodi->kodi_gui->dialogSelect->open = open; - addonInterface->toKodi->kodi_gui->dialogSelect->open_multi_select = open_multi_select; -} - -void Interface_GUIDialogSelect::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogSelect; -} - -int Interface_GUIDialogSelect::open(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size, - int selected, - unsigned int autoclose) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogSelect::{} - invalid data", __func__); - return -1; - } - - CGUIDialogSelect* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_SELECT); - if (!heading || !entries || !dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogSelect::{} - invalid handler data (heading='{}', entries='{}', " - "dialog='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(entries), - static_cast(dialog), addon->ID()); - return -1; - } - - dialog->Reset(); - dialog->SetHeading(CVariant{heading}); - - for (unsigned int i = 0; i < size; ++i) - dialog->Add(entries[i]); - - if (selected > 0) - dialog->SetSelected(selected); - if (autoclose > 0) - dialog->SetAutoClose(autoclose); - - dialog->Open(); - return dialog->GetSelectedItem(); -} - - -bool Interface_GUIDialogSelect::open_multi_select(KODI_HANDLE kodiBase, - const char* heading, - const char* entryIDs[], - const char* entryNames[], - bool entriesSelected[], - unsigned int size, - unsigned int autoclose) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogMultiSelect::{} - invalid data", __func__); - return false; - } - - CGUIDialogSelect* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_SELECT); - if (!heading || !entryIDs || !entryNames || !entriesSelected || !dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogMultiSelect::{} - invalid handler data (heading='{}', " - "entryIDs='{}', entryNames='{}', entriesSelected='{}', dialog='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(entryIDs), - static_cast(entryNames), static_cast(entriesSelected), - static_cast(dialog), addon->ID()); - return false; - } - - dialog->Reset(); - dialog->SetMultiSelection(true); - dialog->SetHeading(CVariant{heading}); - - std::vector selectedIndexes; - - for (unsigned int i = 0; i < size; ++i) - { - dialog->Add(entryNames[i]); - if (entriesSelected[i]) - selectedIndexes.push_back(i); - } - - dialog->SetSelected(selectedIndexes); - if (autoclose > 0) - dialog->SetAutoClose(autoclose); - - dialog->Open(); - if (dialog->IsConfirmed()) - { - for (unsigned int i = 0; i < size; ++i) - entriesSelected[i] = false; - - selectedIndexes = dialog->GetSelectedItems(); - - for (unsigned int i = 0; i < selectedIndexes.size(); ++i) - { - if (selectedIndexes[i]) - entriesSelected[selectedIndexes[i]] = true; - } - } - - return true; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/Select.h b/xbmc/addons/interfaces/gui/dialogs/Select.h deleted file mode 100644 index 5f2d0ef6aa72c..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/Select.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h" - */ - struct Interface_GUIDialogSelect - { - 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 int open(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size, - int selected, - unsigned int autoclose); - static bool open_multi_select(KODI_HANDLE kodiBase, - const char* heading, - const char* entryIDs[], - const char* entryNames[], - bool entriesSelected[], - unsigned int size, - unsigned int autoclose); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/TextViewer.cpp b/xbmc/addons/interfaces/gui/dialogs/TextViewer.cpp deleted file mode 100644 index 637975a73b6cb..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/TextViewer.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "TextViewer.h" - -#include "ServiceBroker.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h" -#include "dialogs/GUIDialogTextViewer.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "utils/log.h" - -namespace ADDON -{ - -void Interface_GUIDialogTextViewer::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogTextViewer = - new AddonToKodiFuncTable_kodi_gui_dialogTextViewer(); - - addonInterface->toKodi->kodi_gui->dialogTextViewer->open = open; -} - -void Interface_GUIDialogTextViewer::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogTextViewer; -} - -void Interface_GUIDialogTextViewer::open(KODI_HANDLE kodiBase, - const char* heading, - const char* text) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogTextViewer::{} - invalid data", __func__); - return; - } - - CGUIDialogTextViewer* dialog = - CServiceBroker::GetGUI()->GetWindowManager().GetWindow( - WINDOW_DIALOG_TEXT_VIEWER); - if (!heading || !text || !dialog) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogTextViewer::{} - invalid handler data (heading='{}', text='{}', " - "dialog='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(text), - static_cast(dialog), addon->ID()); - return; - } - - dialog->SetHeading(heading); - dialog->SetText(text); - dialog->Open(); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/TextViewer.h b/xbmc/addons/interfaces/gui/dialogs/TextViewer.h deleted file mode 100644 index 873dbbba4e0cd..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/TextViewer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h" - */ - struct Interface_GUIDialogTextViewer - { - 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 void open(KODI_HANDLE kodiBase, const char* heading, const char* text); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/gui/dialogs/YesNo.cpp b/xbmc/addons/interfaces/gui/dialogs/YesNo.cpp deleted file mode 100644 index 2c635fb1f94bc..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/YesNo.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "YesNo.h" - -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h" -#include "dialogs/GUIDialogYesNo.h" -#include "messaging/helpers/DialogHelper.h" -#include "utils/log.h" - -using namespace KODI::MESSAGING; -using KODI::MESSAGING::HELPERS::DialogResponse; - -namespace ADDON -{ - -void Interface_GUIDialogYesNo::Init(AddonGlobalInterface* addonInterface) -{ - addonInterface->toKodi->kodi_gui->dialogYesNo = new AddonToKodiFuncTable_kodi_gui_dialogYesNo(); - - addonInterface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_single_text = - show_and_get_input_single_text; - addonInterface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_text = - show_and_get_input_line_text; - addonInterface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_button_text = - show_and_get_input_line_button_text; -} - -void Interface_GUIDialogYesNo::DeInit(AddonGlobalInterface* addonInterface) -{ - delete addonInterface->toKodi->kodi_gui->dialogYesNo; -} - -bool Interface_GUIDialogYesNo::show_and_get_input_single_text(KODI_HANDLE kodiBase, - const char* heading, - const char* text, - bool* canceled, - const char* noLabel, - const char* yesLabel) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogYesNo::{} - invalid data", __func__); - return false; - } - - if (!heading || !text || !canceled || !noLabel || !yesLabel) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogYesNo::{} - invalid handler data (heading='{}', text='{}', " - "canceled='{}', noLabel='{}', yesLabel='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(text), - static_cast(canceled), static_cast(noLabel), - static_cast(yesLabel), addon->ID()); - return false; - } - - DialogResponse result = HELPERS::ShowYesNoDialogText(heading, text, noLabel, yesLabel); - *canceled = (result == DialogResponse::CANCELLED); - return (result == DialogResponse::YES); -} - -bool Interface_GUIDialogYesNo::show_and_get_input_line_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - const char* noLabel, - const char* yesLabel) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogYesNo::{} - invalid data", __func__); - return false; - } - - if (!heading || !line0 || !line1 || !line2 || !noLabel || !yesLabel) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogYesNo::{} - invalid handler data (heading='{}', line0='{}', " - "line1='{}', line2='{}', " - "noLabel='{}', yesLabel='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(line0), - static_cast(line1), static_cast(line2), - static_cast(noLabel), static_cast(yesLabel), addon->ID()); - return false; - } - - return HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel) == - DialogResponse::YES; -} - -bool Interface_GUIDialogYesNo::show_and_get_input_line_button_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - bool* canceled, - const char* noLabel, - const char* yesLabel) -{ - CAddonDll* addon = static_cast(kodiBase); - if (!addon) - { - CLog::Log(LOGERROR, "Interface_GUIDialogYesNo::{} - invalid data", __func__); - return false; - } - - if (!heading || !line0 || !line1 || !line2 || !canceled || !noLabel || !yesLabel) - { - CLog::Log(LOGERROR, - "Interface_GUIDialogYesNo::{} - invalid handler data (heading='{}', line0='{}', " - "line1='{}', line2='{}', " - "canceled='{}', noLabel='{}', yesLabel='{}') on addon '{}'", - __func__, static_cast(heading), static_cast(line0), - static_cast(line1), static_cast(line2), - static_cast(canceled), static_cast(noLabel), - static_cast(yesLabel), addon->ID()); - return false; - } - - DialogResponse result = - HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel); - *canceled = (result == DialogResponse::CANCELLED); - return (result == DialogResponse::YES); -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/interfaces/gui/dialogs/YesNo.h b/xbmc/addons/interfaces/gui/dialogs/YesNo.h deleted file mode 100644 index 84e5d73bb77f0..0000000000000 --- a/xbmc/addons/interfaces/gui/dialogs/YesNo.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h" - -extern "C" -{ - - struct AddonGlobalInterface; - - namespace ADDON - { - - /*! - * @brief Global gui Add-on to Kodi callback functions - * - * To hold functions not related to a instance type and usable for - * every add-on type. - * - * Related add-on header is "./xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h" - */ - struct Interface_GUIDialogYesNo - { - 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 show_and_get_input_single_text(KODI_HANDLE kodiBase, - const char* heading, - const char* text, - bool* canceled, - const char* noLabel, - const char* yesLabel); - - static bool show_and_get_input_line_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - const char* noLabel, - const char* yesLabel); - - static bool show_and_get_input_line_button_text(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - bool* canceled, - const char* noLabel, - const char* yesLabel); - //@} - }; - - } /* namespace ADDON */ -} /* extern "C" */ diff --git a/xbmc/addons/interfaces/platform/android/System.cpp b/xbmc/addons/interfaces/platform/android/System.cpp deleted file mode 100644 index 6b11b15def878..0000000000000 --- a/xbmc/addons/interfaces/platform/android/System.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "System.h" - -#include "CompileInfo.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/platform/android/System.h" - -#include "platform/android/activity/XBMCApp.h" - -static AddonToKodiFuncTable_android_system function_table; - -namespace ADDON -{ - -void Interface_Android::Register() -{ - function_table.get_jni_env = get_jni_env; - function_table.get_sdk_version = get_sdk_version; - function_table.get_class_name = get_class_name; - Interface_Base::RegisterInterface(Get); -} - -void* Interface_Android::Get(const std::string &name, const std::string &version) -{ - if (name == INTERFACE_ANDROID_SYSTEM_NAME - && version >= INTERFACE_ANDROID_SYSTEM_VERSION_MIN - && version <= INTERFACE_ANDROID_SYSTEM_VERSION) - return &function_table; - - return nullptr; -}; - -void* Interface_Android::get_jni_env() -{ - return xbmc_jnienv(); -} - -int Interface_Android::get_sdk_version() -{ - return CXBMCApp::get()->getActivity()->sdkVersion; -} - -const char *Interface_Android::get_class_name() -{ - return CCompileInfo::GetClass(); -} - - -} //namespace ADDON diff --git a/xbmc/addons/interfaces/platform/android/System.h b/xbmc/addons/interfaces/platform/android/System.h deleted file mode 100644 index 59805abcbbcf8..0000000000000 --- a/xbmc/addons/interfaces/platform/android/System.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include - -namespace ADDON -{ - -struct Interface_Android -{ - static void Register(); - static void* Get(const std::string &name, const std::string &version); - - static void* get_jni_env(); - static int get_sdk_version(); - static const char *get_class_name(); -}; - -} //namespace ADDON diff --git a/xbmc/addons/kodi-dev-kit/.gitignore b/xbmc/addons/kodi-dev-kit/.gitignore index 93c8d068bd361..8207d7f38f647 100644 --- a/xbmc/addons/kodi-dev-kit/.gitignore +++ b/xbmc/addons/kodi-dev-kit/.gitignore @@ -30,4 +30,5 @@ /docs /build -include/groups.dox +/include/groups.dox +/tools/code-generator/tmp diff --git a/xbmc/addons/kodi-dev-kit/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/CMakeLists.txt index 4b539b24f62a8..c8ac327eda09c 100644 --- a/xbmc/addons/kodi-dev-kit/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/CMakeLists.txt @@ -1,4 +1,8 @@ cmake_minimum_required(VERSION 3.5) project(kodi-dev-kit) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + include(cmake/test/abi-interface-test.cmake) + +#add_subdirectory(src) diff --git a/xbmc/addons/kodi-dev-kit/cmake/Macros.cmake b/xbmc/addons/kodi-dev-kit/cmake/Macros.cmake new file mode 100644 index 0000000000000..d7c40344dbb3c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/cmake/Macros.cmake @@ -0,0 +1,10 @@ +include(../../../../../cmake/scripts/common/Macros.cmake) + +macro(devkit_add_object name) + add_library(${name} OBJECT ${SOURCES} ${HEADERS}) + set_target_properties(${name} PROPERTIES C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON) + set(DEVKIT_OBJECTS $ ${DEVKIT_OBJECTS} PARENT_SCOPE) +endmacro() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h b/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h index 06b22d5193b87..8f7591ef651b4 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2018 Team Kodi + * Copyright (C) 2005-2021 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,22 +9,16 @@ #pragma once #include "c-api/addon_base.h" -#include "versions.h" - -#include /* assert */ -#include /* va_list, va_start, va_arg, va_end */ +#include "c-api/dl/kodi_api_1.h" #ifdef __cplusplus -#include -#include -#include +#include +#include #include -#include #include -#include - -#include "tools/StringUtils.h" +#include +#include namespace kodi { @@ -58,193 +52,93 @@ struct IRenderHelper; /// ~~~~~~~~~~~~~ /// ///@{ -using HardwareContext = ADDON_HARDWARE_CONTEXT; +using HardwareContext = ADDON_HARDWARE_CONTEXT2; ///@} //------------------------------------------------------------------------------ -//============================================================================== -/// @ingroup cpp_kodi_addon_addonbase_Defs -/// @defgroup cpp_kodi_addon_addonbase_Defs_CSettingValue class CSettingValue -/// @brief **Setting value handler**\n -/// Inside addon main instance used helper class to give settings value. -/// -/// This is used on @ref addon::CAddonBase::SetSetting() to inform addon about -/// settings change by used. This becomes then used to give the related value -/// name. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_addonbase_Defs_CSettingValue_Help -/// -/// ---------------------------------------------------------------------------- -/// -/// **Here is a code example how this is used:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// enum myEnumValue -/// { -/// valueA, -/// valueB, -/// valueC -/// }; -/// -/// std::string m_myStringValue; -/// int m_myIntegerValue; -/// bool m_myBooleanValue; -/// float m_myFloatingPointValue; -/// myEnumValue m_myEnumValue; -/// -/// -/// ADDON_STATUS CMyAddon::SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue) -/// { -/// if (settingName == "my_string_value") -/// m_myStringValue = settingValue.GetString(); -/// else if (settingName == "my_integer_value") -/// m_myIntegerValue = settingValue.GetInt(); -/// else if (settingName == "my_boolean_value") -/// m_myBooleanValue = settingValue.GetBoolean(); -/// else if (settingName == "my_float_value") -/// m_myFloatingPointValue = settingValue.GetFloat(); -/// else if (settingName == "my_enum_value") -/// m_myEnumValue = settingValue.GetEnum(); -/// } -/// ~~~~~~~~~~~~~ -/// -/// @note The asked type should match the type used on settings.xml. -/// -///@{ -class ATTRIBUTE_HIDDEN CSettingValue +class ATTR_DLL_LOCAL dl { public: - explicit CSettingValue(const void* settingValue) : m_settingValue(settingValue) {} + static inline std::string get_kodi_lib_path(int argc, char* argv[]) + { + std::string main_shared; - bool empty() const { return (m_settingValue == nullptr) ? true : false; } + for (int i = 1; i < argc; ++i) + { + if (argv[i] == nullptr) + break; - /// @defgroup cpp_kodi_addon_addonbase_Defs_CSettingValue_Help Value Help - /// @ingroup cpp_kodi_addon_addonbase_Defs_CSettingValue - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_addonbase_Defs_CSettingValue : - /// | Name | Type | Get call - /// |------|------|---------- - /// | **Settings value as string** | `std::string` | @ref CSettingValue::GetString "GetString" - /// | **Settings value as integer** | `int` | @ref CSettingValue::GetInt "GetInt" - /// | **Settings value as unsigned integer** | `unsigned int` | @ref CSettingValue::GetUInt "GetUInt" - /// | **Settings value as boolean** | `bool` | @ref CSettingValue::GetBoolean "GetBoolean" - /// | **Settings value as floating point** | `float` | @ref CSettingValue::GetFloat "GetFloat" - /// | **Settings value as enum** | `enum` | @ref CSettingValue::GetEnum "GetEnum" + std::string arg = argv[i]; + if (arg.rfind("--dl=", 0) == 0) + { + main_shared = arg.substr(strlen("--dl=")); + break; + } + else if ((arg == "-l") || (arg == "--dl")) + { + if (i + 1 < argc) // Make sure we aren't at the end of argv! + { + main_shared = argv[++i]; // Increment 'i' so we don't get the argument as the next argv[i]. + break; + } + } + } - /// @addtogroup cpp_kodi_addon_addonbase_Defs_CSettingValue - ///@{ + return main_shared; + } - /// @brief To get settings value as string. - std::string GetString() const { return (const char*)m_settingValue; } + static inline bool LoadDll(int argc, char** argv) + { + const std::string libPath = get_kodi_lib_path(argc, argv); + dll = dlopen(libPath.c_str(), RTLD_LAZY | RTLD_GLOBAL); + if (dll == nullptr) + return false; - /// @brief To get settings value as integer. - int GetInt() const { return *(const int*)m_settingValue; } + bool (*load_kodi_api_1)(struct kodi_api_1*) = reinterpret_cast(dlsym(dll, "load_kodi_api_1")); + if (!load_kodi_api_1 || !load_kodi_api_1(&api)) + { + fprintf(stderr, "FATAL: Failed to load required kodi dev kit lib '%s'!\n", libPath.c_str()); + dlclose(dll); + return false; + } - /// @brief To get settings value as unsigned integer. - unsigned int GetUInt() const { return *(const unsigned int*)m_settingValue; } + return true; + } - /// @brief To get settings value as boolean. - bool GetBoolean() const { return *(const bool*)m_settingValue; } + static inline void UnloadDll() + { + dlclose(dll); + } - /// @brief To get settings value as floating point. - float GetFloat() const { return *(const float*)m_settingValue; } + static kodi_api_1 api; + static KODI_IFC_HDL hdl; + static KODI_DLL_HDL dll; +}; - /// @brief To get settings value as enum. - /// @note Inside settings.xml them stored as integer. +class CSettingValue +{ +public: + explicit CSettingValue(const std::string& settingValue) : str(settingValue) {} + bool empty() const { return str.empty(); } + + std::string GetString() const { return str; } + int GetInt() const { return atoi(str.c_str()); } + unsigned int GetUInt() const { return atoi(str.c_str()); } + bool GetBoolean() const { return atoi(str.c_str()) > 0; } + float GetFloat() const { return static_cast(atof(str.c_str())); } template enumType GetEnum() const { - return static_cast(*(const int*)m_settingValue); + return static_cast(GetInt()); } - ///@} - private: - const void* m_settingValue; + const std::string str; }; -///@} -//------------------------------------------------------------------------------ namespace addon { -//============================================================================== -/* - * Internal class to control various instance types with general parts defined - * here. - * - * Mainly is this currently used to identify requested instance types. - * - * @note This class is not need to know during add-on development thats why - * commented with "*". - */ -class ATTRIBUTE_HIDDEN IAddonInstance -{ -public: - explicit IAddonInstance(ADDON_TYPE type, const std::string& version) - : m_type(type), m_kodiVersion(version) - { - } - virtual ~IAddonInstance() = default; - - virtual ADDON_STATUS CreateInstance(int instanceType, - const std::string& instanceID, - KODI_HANDLE instance, - const std::string& version, - KODI_HANDLE& addonInstance) - { - return ADDON_STATUS_NOT_IMPLEMENTED; - } - - const ADDON_TYPE m_type; - const std::string m_kodiVersion; - std::string m_id; -}; - -/* - * Internally used helper class to manage processing of a "C" structure in "CPP" - * class. - * - * At constant, the "C" structure is copied, otherwise the given pointer is - * superseded and is changeable. - * - * ----------------------------------------------------------------------------- - * - * Example: - * - * ~~~~~~~~~~~~~{.cpp} - * extern "C" typedef struct C_SAMPLE_DATA - * { - * unsigned int iUniqueId; - * } C_SAMPLE_DATA; - * - * class CPPSampleData : public CStructHdl - * { - * public: - * CPPSampleData() = default; - * CPPSampleData(const CPPSampleData& sample) : CStructHdl(sample) { } - * CPPSampleData(const C_SAMPLE_DATA* sample) : CStructHdl(sample) { } - * CPPSampleData(C_SAMPLE_DATA* sample) : CStructHdl(sample) { } - * - * void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; } - * unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; } - * }; - * - * ~~~~~~~~~~~~~ - * - * It also works with the following example: - * - * ~~~~~~~~~~~~~{.cpp} - * CPPSampleData test; - * // Some work - * C_SAMPLE_DATA* data = test; - * // Give "data" to Kodi - * ~~~~~~~~~~~~~ - */ template class CStructHdl { @@ -312,246 +206,122 @@ class CStructHdl bool m_owner = false; }; -//============================================================================ -/// @addtogroup cpp_kodi_addon_addonbase -/// @brief **Add-on main instance class**\n -/// This is the addon main class, similar to an `int main()` in executable and -/// carries out initial work and later management of it. -/// -class ATTRIBUTE_HIDDEN CAddonBase +class IAddonInstance { public: - //============================================================================ - /// @ingroup cpp_kodi_addon_addonbase - /// @brief Addon base class constructor. - /// - CAddonBase() + explicit IAddonInstance(ADDON_INSTANCE type) + : m_type(type) { - m_interface->toAddon->destroy = ADDONBASE_Destroy; - m_interface->toAddon->create_instance = ADDONBASE_CreateInstance; - m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance; - m_interface->toAddon->set_setting = ADDONBASE_SetSetting; } - //---------------------------------------------------------------------------- + virtual ~IAddonInstance() = default; + + virtual ADDON_STATUS CreateInstance(ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_HANDLE instance, + KODI_HANDLE& addonInstance) + { + return ADDON_STATUS_NOT_IMPLEMENTED; + } + + virtual void SetAddonStruct(KODI_HANDLE instance) = 0; - //============================================================================ - /// @ingroup cpp_kodi_addon_addonbase - /// @brief Destructor. - /// + const ADDON_INSTANCE m_type; + std::string m_id; +}; + +class CAddonBase +{ +public: + CAddonBase() = default; virtual ~CAddonBase() = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_addonbase - /// @brief Main addon creation function - /// - /// With this function addon can carry out necessary work which is required - /// at later points or start necessary processes. - /// - /// This function is optional and necessary work can also be carried out - /// using @ref CreateInstance (if it concerns any instance types). - /// - /// @return @ref ADDON_STATUS_OK if correct, for possible errors see - /// @ref ADDON_STATUS - /// - /// @note Terminating the add-on must be carried out using the class destructor - /// given by child. - /// + virtual ADDON_STATUS Create() { return ADDON_STATUS_OK; } - //---------------------------------------------------------------------------- - - // obsolete - virtual ADDON_STATUS GetStatus() { return ADDON_STATUS_OK; } - - //============================================================================ - /// @ingroup cpp_kodi_addon_addonbase - /// @brief To inform addon about changed settings values. - /// - /// This becomes called for every entry defined inside his settings.xml and - /// as **last** call the one where last in xml (to identify end of calls). - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_addonbase_Defs_CSettingValue_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here is a code example how this is used:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// - /// enum myEnumValue - /// { - /// valueA, - /// valueB, - /// valueC - /// }; - /// - /// std::string m_myStringValue; - /// int m_myIntegerValue; - /// bool m_myBooleanValue; - /// float m_myFloatingPointValue; - /// myEnumValue m_myEnumValue; - /// - /// - /// ADDON_STATUS CMyAddon::SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue) - /// { - /// if (settingName == "my_string_value") - /// m_myStringValue = settingValue.GetString(); - /// else if (settingName == "my_integer_value") - /// m_myIntegerValue = settingValue.GetInt(); - /// else if (settingName == "my_boolean_value") - /// m_myBooleanValue = settingValue.GetBoolean(); - /// else if (settingName == "my_float_value") - /// m_myFloatingPointValue = settingValue.GetFloat(); - /// else if (settingName == "my_enum_value") - /// m_myEnumValue = settingValue.GetEnum(); - /// } - /// ~~~~~~~~~~~~~ - /// - /// @note The asked type should match the type used on settings.xml. - /// + virtual ADDON_STATUS SetSetting(const std::string& settingName, - const kodi::CSettingValue& settingValue) + const CSettingValue& settingValue) { return ADDON_STATUS_UNKNOWN; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_addonbase - /// @brief Instance created - /// - /// @param[in] instanceType The requested type of required instance, see @ref ADDON_TYPE. - /// @param[in] instanceID An individual identification key string given by Kodi. - /// @param[in] instance The instance handler used by Kodi must be passed to - /// the classes created here. See in the example. - /// @param[in] version The from Kodi used version of instance. This can be - /// used to allow compatibility to older versions of - /// them. Further is this given to the parent instance - /// that it can handle differences. - /// @param[out] addonInstance The pointer to instance class created in addon. - /// Needed to be able to identify them on calls. - /// @return @ref ADDON_STATUS_OK if correct, for possible errors - /// see @ref ADDON_STATUS - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here is a code example how this is used:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// - /// ... - /// - /// // If you use only one instance in your add-on, can be instanceType and - /// // instanceID ignored - /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, - /// const std::string& instanceID, - /// KODI_HANDLE instance, - /// const std::string& version, - /// KODI_HANDLE& addonInstance) - /// { - /// if (instanceType == ADDON_INSTANCE_SCREENSAVER) - /// { - /// kodi::Log(ADDON_LOG_INFO, "Creating my Screensaver"); - /// addonInstance = new CMyScreensaver(instance); - /// return ADDON_STATUS_OK; - /// } - /// else if (instanceType == ADDON_INSTANCE_VISUALIZATION) - /// { - /// kodi::Log(ADDON_LOG_INFO, "Creating my Visualization"); - /// addonInstance = new CMyVisualization(instance); - /// return ADDON_STATUS_OK; - /// } - /// else if (...) - /// { - /// ... - /// } - /// return ADDON_STATUS_UNKNOWN; - /// } - /// - /// ... - /// - /// ~~~~~~~~~~~~~ - /// - virtual ADDON_STATUS CreateInstance(int instanceType, - const std::string& instanceID, - KODI_HANDLE instance, - const std::string& version, - KODI_HANDLE& addonInstance) + + virtual ADDON_STATUS CreateInstance(ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_HANDLE instance, + KODI_HANDLE& addonInstance) { return ADDON_STATUS_NOT_IMPLEMENTED; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_addonbase - /// @brief Instance destroy - /// - /// This function is optional and intended to notify addon that the instance - /// is terminating. - /// - /// @param[in] instanceType The requested type of required instance, see @ref ADDON_TYPE. - /// @param[in] instanceID An individual identification key string given by Kodi. - /// @param[in] addonInstance The pointer to instance class created in addon. - /// - /// @warning This call is only used to inform that the associated instance - /// is terminated. The deletion is carried out in the background. - /// - virtual void DestroyInstance(int instanceType, + + virtual void DestroyInstance(ADDON_INSTANCE instanceType, const std::string& instanceID, KODI_HANDLE addonInstance) { } - //-------------------------------------------------------------------------- /* Background helper for GUI render systems, e.g. Screensaver or Visualization */ std::shared_ptr m_renderHelper; - /* Global variables of class */ - static AddonGlobalInterface* - m_interface; // Interface function table to hold addresses on add-on and from kodi + static struct CIfc + { + CAddonBase* m_addonBase{nullptr}; + KODI_OWN_HDL m_firstInstance{nullptr}; + KODI_ADDON_HDL m_globalSingleInstance{nullptr}; + } ifc; -private: - static inline void ADDONBASE_Destroy() +// private: + + static inline void ADDONBASE_Destroy(KODI_ADDON_HDL hdl) + { + delete static_cast(hdl); + } + + static inline ADDON_STATUS ADDONBASE_SetSettingString(const KODI_ADDON_HDL hdl, const char* name, const char* value) + { + return static_cast(hdl)->SetSetting(name, CSettingValue(value)); + } + + static inline ADDON_STATUS ADDONBASE_SetSettingBoolean(const KODI_ADDON_HDL hdl, const char* name, bool value) + { + return static_cast(hdl)->SetSetting(name, CSettingValue(value ? "1" : "0")); + } + + static inline ADDON_STATUS ADDONBASE_SetSettingInteger(const KODI_ADDON_HDL hdl, const char* name, int value) { - delete static_cast(m_interface->addonBase); - m_interface->addonBase = nullptr; + return static_cast(hdl)->SetSetting(name, CSettingValue(std::to_string(value))); } - static inline ADDON_STATUS ADDONBASE_SetSetting(const char* settingName, const void* settingValue) + static inline ADDON_STATUS ADDONBASE_SetSettingFloat(const KODI_ADDON_HDL hdl, const char* name, float value) { - return static_cast(m_interface->addonBase) - ->SetSetting(settingName, CSettingValue(settingValue)); + return static_cast(hdl)->SetSetting(name, CSettingValue(std::to_string(value))); } - static inline ADDON_STATUS ADDONBASE_CreateInstance(int instanceType, + static inline ADDON_STATUS ADDONBASE_CreateInstance(const KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, const char* instanceID, - KODI_HANDLE instance, - const char* version, - KODI_HANDLE* addonInstance, - KODI_HANDLE parent) + KODI_INSTANCE_HDL* addonInstance, + KODI_IFC_HDL parent) { - CAddonBase* base = static_cast(m_interface->addonBase); + CAddonBase* base = static_cast(hdl); ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED; + if (addonInstance == nullptr) + { + kodi::dl::api.kodi_log(ADDON_LOG_FATAL, "kodi::addon::CAddonBase CreateInstance called with empty instance memory"); + return ADDON_STATUS_PERMANENT_FAILURE; + } + /* Check about single instance usage: * 1. The kodi side instance pointer must be equal to first one * 2. The addon side instance pointer must be set * 3. And the requested type must be equal with used add-on class */ - if (m_interface->firstKodiInstance == instance && m_interface->globalSingleInstance && - static_cast(m_interface->globalSingleInstance)->m_type == instanceType) + if (ifc.m_globalSingleInstance && + static_cast(ifc.m_globalSingleInstance)->m_type == instanceType) { /* The handling here is intended for the case of the add-on only one * instance and this is integrated in the add-on base class. */ - *addonInstance = m_interface->globalSingleInstance; + static_cast(ifc.m_globalSingleInstance)->SetAddonStruct(addonInstance); status = ADDON_STATUS_OK; } else @@ -562,21 +332,23 @@ class ATTRIBUTE_HIDDEN CAddonBase /* Check first a parent is defined about (e.g. Codec within inputstream) */ if (parent != nullptr) + { status = static_cast(parent)->CreateInstance( - instanceType, instanceID, instance, version, *addonInstance); + instanceType, instanceID, addonInstance, addonInstance->instance); + } /* if no parent call the main instance creation function to get it */ if (status == ADDON_STATUS_NOT_IMPLEMENTED) { - status = base->CreateInstance(instanceType, instanceID, instance, version, *addonInstance); + status = base->CreateInstance(instanceType, instanceID, addonInstance, addonInstance->instance); } } - if (*addonInstance == nullptr) + if (addonInstance->instance == nullptr) { if (status == ADDON_STATUS_OK) { - m_interface->toKodi->addon_log_msg(m_interface->toKodi->kodiBase, ADDON_LOG_FATAL, + kodi::dl::api.kodi_log(ADDON_LOG_FATAL, "kodi::addon::CAddonBase CreateInstance returned an " "empty instance pointer, but reported OK!"); return ADDON_STATUS_PERMANENT_FAILURE; @@ -587,73 +359,58 @@ class ATTRIBUTE_HIDDEN CAddonBase } } - if (static_cast(*addonInstance)->m_type != instanceType) + if (static_cast(addonInstance->instance)->m_type != instanceType) { - m_interface->toKodi->addon_log_msg( - m_interface->toKodi->kodiBase, ADDON_LOG_FATAL, + kodi::dl::api.kodi_log(ADDON_LOG_FATAL, "kodi::addon::CAddonBase CreateInstance difference between given and returned"); - delete static_cast(*addonInstance); - *addonInstance = nullptr; + delete static_cast(addonInstance->instance); + addonInstance->instance = nullptr; return ADDON_STATUS_PERMANENT_FAILURE; } // Store the used ID inside instance, to have on destroy calls by addon to identify - static_cast(*addonInstance)->m_id = instanceID; + static_cast(addonInstance->instance)->m_id = instanceID; return status; } - static inline void ADDONBASE_DestroyInstance(int instanceType, KODI_HANDLE instance) + static inline void ADDONBASE_DestroyInstance(KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + KODI_INSTANCE_HDL* instance) { - CAddonBase* base = static_cast(m_interface->addonBase); + CAddonBase* base = static_cast(hdl); - if (m_interface->globalSingleInstance == nullptr && instance != base) + if (ifc.m_globalSingleInstance == nullptr && instance->instance != base) { - base->DestroyInstance(instanceType, static_cast(instance)->m_id, instance); - delete static_cast(instance); + base->DestroyInstance(instanceType, static_cast(instance->instance)->m_id, instance->instance); + delete static_cast(instance->instance); } } }; -} /* namespace addon */ - -//============================================================================== -/// @ingroup cpp_kodi -/// @brief To get used version inside Kodi itself about asked type. -/// -/// This thought to allow a addon a handling of newer addon versions within -/// older Kodi until the type min version not changed. -/// -/// @param[in] type The wanted type of @ref ADDON_TYPE to ask -/// @return The version string about type in MAJOR.MINOR.PATCH style. -/// -inline std::string ATTRIBUTE_HIDDEN GetKodiTypeVersion(int type) +inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CAddonBase::m_interface->toKodi->get_type_version( - CAddonBase::m_interface->toKodi->kodiBase, type); + char* str = kodi::dl::api.kodi_addon_get_lib_path(); std::string ret = str; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str); + free(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; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @ingroup cpp_kodi -/// @brief To get the addon system installation folder. -/// -/// @param[in] append [optional] Path to append to given string -/// @return Path where addon is installed -/// -inline std::string ATTRIBUTE_HIDDEN GetAddonPath(const std::string& append = "") +inline std::string ATTR_DLL_LOCAL GetSharePath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = - CAddonBase::m_interface->toKodi->get_addon_path(CAddonBase::m_interface->toKodi->kodiBase); + char* str = kodi::dl::api.kodi_addon_get_share_path(); std::string ret = str; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -666,26 +423,12 @@ inline std::string ATTRIBUTE_HIDDEN GetAddonPath(const std::string& append = "") } return ret; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @ingroup cpp_kodi -/// @brief To get the user-related folder of the addon. -/// -/// @note This folder is not created automatically and has to be created by the -/// addon the first time. -/// -/// @param[in] append [optional] Path to append to given string -/// @return User path of addon -/// -inline std::string ATTRIBUTE_HIDDEN GetBaseUserPath(const std::string& append = "") +inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CAddonBase::m_interface->toKodi->get_base_user_path( - CAddonBase::m_interface->toKodi->kodiBase); + char* str = kodi::dl::api.kodi_addon_get_user_path(); std::string ret = str; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -698,757 +441,234 @@ inline std::string ATTRIBUTE_HIDDEN GetBaseUserPath(const std::string& append = } return ret; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi -/// @brief This function gives OS associated executable binary path of the addon. -/// -/// With some systems this can differ from the addon path at @ref GetAddonPath. -/// -/// As an example on Linux: -/// - Addon path is at `/usr/share/kodi/addons/YOUR_ADDON_ID` -/// - Library path is at `/usr/lib/kodi/addons/YOUR_ADDON_ID` -/// -/// @note In addition, in this function, for a given folder, the add-on path -/// itself, but its parent. -/// -/// @return Kodi's sytem library path where related addons are installed. -/// -inline std::string ATTRIBUTE_HIDDEN GetLibPath() -{ - using namespace kodi::addon; - - return CAddonBase::m_interface->libBasePath; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi -/// @brief Add a message to Kodi's log. -/// -/// @param[in] loglevel The log level of the message. -/// @param[in] format The format of the message to pass to Kodi. -/// @param[in] ... Additional text to insert in format text -/// -/// -/// @note This method uses limited buffer (16k) for the formatted output. -/// So data, which will not fit into it, will be silently discarded. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// kodi::Log(ADDON_LOG_ERROR, "%s: There is an error occurred!", __func__); -/// -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN Log(const AddonLog loglevel, const char* format, ...) -{ - using namespace kodi::addon; - - va_list args; - va_start(args, format); - const std::string str = kodi::tools::StringUtils::FormatV(format, args); - va_end(args); - CAddonBase::m_interface->toKodi->addon_log_msg(CAddonBase::m_interface->toKodi->kodiBase, - loglevel, str.c_str()); -} -//------------------------------------------------------------------------------ - -//############################################################################## -/// @ingroup cpp_kodi -/// @defgroup cpp_kodi_settings 1. Setting control -/// @brief **Functions to handle settings access**\n -/// This can be used to get and set the addon related values inside his -/// settings.xml. -/// -/// The settings style is given with installed part on e.g. -/// `$HOME/.kodi/addons/myspecial.addon/resources/settings.xml`. The -/// related edit becomes then stored inside -/// `$HOME/.kodi/userdata/addon_data/myspecial.addon/settings.xml`. -/// -/*!@{*/ -//============================================================================== -/// @brief Check the given setting name is set to default value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @return true if setting is the default -/// -inline bool ATTRIBUTE_HIDDEN IsSettingUsingDefault(const std::string& settingName) +inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "") { - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->is_setting_using_default( - CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str()); + char* str = kodi::dl::api.kodi_addon_get_temp_path(); + std::string ret = str; + free(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; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Check and get a string setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[out] settingValue The given setting value -/// @return true if setting was successfully found and "settingValue" is set -/// -/// @note If returns false, the "settingValue" is not changed. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// std::string value; -/// if (!kodi::CheckSettingString("my_string_value", value)) -/// value = "my_default_if_setting_not_work"; -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN CheckSettingString(const std::string& settingName, +inline bool ATTR_DLL_LOCAL CheckSettingString(const std::string& settingName, std::string& settingValue) { - using namespace kodi::addon; - char* buffer = nullptr; - bool ret = CAddonBase::m_interface->toKodi->get_setting_string( - CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &buffer); + bool ret = kodi::dl::api.kodi_addon_get_setting_string(settingName.c_str(), &buffer); if (buffer) { if (ret) settingValue = buffer; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, buffer); + free(buffer); } return ret; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Get string setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[in] defaultValue [opt] Default value if not found -/// @return The value of setting, empty if not found; -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// std::string value = kodi::GetSettingString("my_string_value"); -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetSettingString(const std::string& settingName, +inline std::string ATTR_DLL_LOCAL GetSettingString(const std::string& settingName, const std::string& defaultValue = "") { std::string settingValue = defaultValue; CheckSettingString(settingName, settingValue); return settingValue; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Set string setting of addon. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of setting -/// @param[in] settingValue The setting value to write -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// std::string value = "my_new_name for"; -/// kodi::SetSettingString("my_string_value", value); -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN SetSettingString(const std::string& settingName, +inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName, const std::string& settingValue) { - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->set_setting_string(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), settingValue.c_str()); + kodi::dl::api.kodi_addon_set_setting_string(settingName.c_str(), settingValue.c_str()); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Check and get a integer setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[out] settingValue The given setting value -/// @return true if setting was successfully found and "settingValue" is set -/// -/// @note If returns false, the "settingValue" is not changed. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// int value = 0; -/// if (!kodi::CheckSettingInt("my_integer_value", value)) -/// value = 123; // My default of them -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN CheckSettingInt(const std::string& settingName, int& settingValue) +inline bool ATTR_DLL_LOCAL CheckSettingInt(const std::string& settingName, int& settingValue) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->get_setting_int(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_int(settingName.c_str(), &settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Get integer setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[in] defaultValue [opt] Default value if not found -/// @return The value of setting, `0` or defaultValue if not found -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// int value = kodi::GetSettingInt("my_integer_value"); -/// ~~~~~~~~~~~~~ -/// -inline int ATTRIBUTE_HIDDEN GetSettingInt(const std::string& settingName, int defaultValue = 0) +inline int ATTR_DLL_LOCAL GetSettingInt(const std::string& settingName, int defaultValue = 0) { int settingValue = defaultValue; CheckSettingInt(settingName, settingValue); return settingValue; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Set integer setting of addon. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of setting -/// @param[in] settingValue The setting value to write -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// int value = 123; -/// kodi::SetSettingInt("my_integer_value", value); -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN SetSettingInt(const std::string& settingName, int settingValue) +inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int settingValue) { - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_int(settingName.c_str(), settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Check and get a boolean setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[out] settingValue The given setting value -/// @return true if setting was successfully found and "settingValue" is set -/// -/// @note If returns false, the "settingValue" is not changed. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// bool value = false; -/// if (!kodi::CheckSettingBoolean("my_boolean_value", value)) -/// value = true; // My default of them -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN CheckSettingBoolean(const std::string& settingName, bool& settingValue) +inline bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string& settingName, bool& settingValue) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->get_setting_bool( - CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_bool(settingName.c_str(), &settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Get boolean setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[in] defaultValue [opt] Default value if not found -/// @return The value of setting, `false` or defaultValue if not found -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// bool value = kodi::GetSettingBoolean("my_boolean_value"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetSettingBoolean(const std::string& settingName, +inline bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string& settingName, bool defaultValue = false) { bool settingValue = defaultValue; CheckSettingBoolean(settingName, settingValue); return settingValue; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Set boolean setting of addon. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of setting -/// @param[in] settingValue The setting value to write -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// bool value = true; -/// kodi::SetSettingBoolean("my_boolean_value", value); -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN SetSettingBoolean(const std::string& settingName, bool settingValue) +inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, bool settingValue) { - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->set_setting_bool(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_bool(settingName.c_str(), settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Check and get a floating point setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[out] settingValue The given setting value -/// @return true if setting was successfully found and "settingValue" is set -/// -/// @note If returns false, the "settingValue" is not changed. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// float value = 0.0f; -/// if (!kodi::CheckSettingBoolean("my_float_value", value)) -/// value = 1.0f; // My default of them -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN CheckSettingFloat(const std::string& settingName, float& settingValue) +inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, float& settingValue) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->get_setting_float( - CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_float(settingName.c_str(), &settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Get floating point setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[in] defaultValue [opt] Default value if not found -/// @return The value of setting, `0.0` or defaultValue if not found -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// float value = kodi::GetSettingFloat("my_float_value"); -/// ~~~~~~~~~~~~~ -/// -inline float ATTRIBUTE_HIDDEN GetSettingFloat(const std::string& settingName, +inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName, float defaultValue = 0.0f) { float settingValue = defaultValue; CheckSettingFloat(settingName, settingValue); return settingValue; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Set floating point setting of addon. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of setting -/// @param[in] settingValue The setting value to write -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// float value = 1.0f; -/// kodi::SetSettingFloat("my_float_value", value); -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN SetSettingFloat(const std::string& settingName, float settingValue) +inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float settingValue) { - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->set_setting_float(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_float(settingName.c_str(), settingValue); } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Check and get a enum setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[out] settingValue The given setting value -/// @return true if setting was successfully found and "settingValue" is set -/// -/// @remark The enums are used as integer inside settings.xml. -/// @note If returns false, the "settingValue" is not changed. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// enum myEnumValue -/// { -/// valueA, -/// valueB, -/// valueC -/// }; -/// -/// myEnumValue value; -/// if (!kodi::CheckSettingEnum("my_enum_value", value)) -/// value = valueA; // My default of them -/// ~~~~~~~~~~~~~ -/// template -inline bool ATTRIBUTE_HIDDEN CheckSettingEnum(const std::string& settingName, +inline bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string& settingName, enumType& settingValue) { - using namespace kodi::addon; - int settingValueInt = static_cast(settingValue); - bool ret = CAddonBase::m_interface->toKodi->get_setting_int( - CAddonBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValueInt); + bool ret = kodi::dl::api.kodi_addon_get_setting_int(settingName.c_str(), &settingValueInt); if (ret) settingValue = static_cast(settingValueInt); return ret; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Get enum setting value. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of asked setting -/// @param[in] defaultValue [opt] Default value if not found -/// @return The value of setting, forced to `0` or defaultValue if not found -/// -/// @remark The enums are used as integer inside settings.xml. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// enum myEnumValue -/// { -/// valueA, -/// valueB, -/// valueC -/// }; -/// -/// myEnumValue value = kodi::GetSettingEnum("my_enum_value"); -/// ~~~~~~~~~~~~~ -/// template -inline enumType ATTRIBUTE_HIDDEN GetSettingEnum(const std::string& settingName, +inline enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string& settingName, enumType defaultValue = static_cast(0)) { enumType settingValue = defaultValue; CheckSettingEnum(settingName, settingValue); return settingValue; } -//------------------------------------------------------------------------------ -//============================================================================== -/// @brief Set enum setting of addon. -/// -/// The setting name relate to names used in his settings.xml file. -/// -/// @param[in] settingName The name of setting -/// @param[in] settingValue The setting value to write -/// -/// @remark The enums are used as integer inside settings.xml. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// enum myEnumValue -/// { -/// valueA, -/// valueB, -/// valueC -/// }; -/// -/// myEnumValue value = valueA; -/// kodi::SetSettingEnum("my_enum_value", value); -/// ~~~~~~~~~~~~~ -/// template -inline void ATTRIBUTE_HIDDEN SetSettingEnum(const std::string& settingName, enumType settingValue) +inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumType settingValue) { - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->set_setting_int(CAddonBase::m_interface->toKodi->kodiBase, - settingName.c_str(), - static_cast(settingValue)); + kodi::dl::api.kodi_addon_set_setting_int(settingName.c_str(), static_cast(settingValue)); } -//------------------------------------------------------------------------------ -/*!@}*/ +} /* namespace addon */ -//============================================================================ -/// @ingroup cpp_kodi -/// @brief Get to related @ref ADDON_STATUS a human readable text. -/// -/// @param[in] status Status value to get name for -/// @return Wanted name, as "Unknown" if status not known -/// -inline std::string ATTRIBUTE_HIDDEN TranslateAddonStatus(ADDON_STATUS status) +inline bool Init(unsigned int api, + int argc, char* argv[], + struct KODI_ADDON_FUNC* func, bool via_main, bool no_receive) { - switch (status) - { - case ADDON_STATUS_OK: - return "OK"; - case ADDON_STATUS_LOST_CONNECTION: - return "Lost Connection"; - case ADDON_STATUS_NEED_RESTART: - return "Need Restart"; - case ADDON_STATUS_NEED_SETTINGS: - return "Need Settings"; - case ADDON_STATUS_UNKNOWN: - return "Unknown error"; - case ADDON_STATUS_PERMANENT_FAILURE: - return "Permanent failure"; - case ADDON_STATUS_NOT_IMPLEMENTED: - return "Not implemented"; - default: - break; - } - return "Unknown"; + if (!kodi::dl::LoadDll(argc, argv)) + return false; + + KODI_IFC_HDL hdl = kodi::dl::api.kodi_init(api, argc, argv, func, via_main, no_receive); + if (!hdl) + return false; + + kodi::dl::hdl = hdl; + + return true; } -//---------------------------------------------------------------------------- -//============================================================================== -/// @ingroup cpp_kodi -/// @brief Returns a function table to a named interface -/// -/// @return pointer to struct containing interface functions -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// ... -/// FuncTable_foo *table = kodi::GetPlatformInfo(foo_name, foo_version); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline void* GetInterface(const std::string& name, const std::string& version) +inline void Deinit() { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; + kodi::dl::api.kodi_deinit(kodi::dl::hdl); + kodi::dl::UnloadDll(); +} - return toKodi->get_interface(toKodi->kodiBase, name.c_str(), version.c_str()); +template +void Log(const ADDON_LOG loglevel, const std::string& fmt, Args&&... args) +{ + kodi::dl::api.kodi_log(loglevel, fmt.c_str(), args...); } -//---------------------------------------------------------------------------- } /* namespace kodi */ -//============================================================================== -/// @ingroup cpp_kodi_addon_addonbase_Defs -/// @defgroup cpp_kodi_addon_addonbase_Defs_ADDONCREATORAddonClass macro ADDONCREATOR(AddonClass) -/// @brief **Addon creation macro**\n -/// This export the three mandatory "C" functions to have available for Kodi. -/// -/// @note Only this macro can be used on a C++ addon, everything else is done -/// automatically. -/// -/// @param[in] AddonClass Used addon class to be exported with CAddonBase as -/// parent. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// -/// #include -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() = default; -/// ADDON_STATUS Create() override; -/// }; -/// -/// ADDON_STATUS CMyAddon::Create() -/// { -/// // Some work -/// -/// return ADDON_STATUS_OK; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// ---------------------------------------------------------------------------- -/// -/// As information, the following functions are exported using this macro: -/// \table_start -/// \table_h3{ Function, Use, Description } -/// \table_row3{ `ADDON_Create(KODI_HANDLE addonInterface\, const char* globalApiVersion\, void* unused)`, -/// \anchor ADDON_Create -/// _required_, -/// Addon creation call. -///
-/// Like an `int main()` is this the first on addon called place on his start -/// and create within C++ API related class inside addon. -///
-/// @param[in] addonInterface Handle pointer to get Kodi's given table. -/// There have addon needed values and functions -/// to Kodi and addon must set his functions there -/// for Kodi. -/// @param[in] globalApiVersion This give the main version @ref ADDON_GLOBAL_VERSION_MAIN -/// where currently on Kodi's side.
-/// This is unsued on addon as there also other -/// special callback functions for.
-/// Only thought for future use if needed earlier. -/// @param[in] unused This is a not used value\, only there to have in case of -/// need no Major API version increase where break current. -/// @return @ref ADDON_STATUS_OK if correct\, for possible errors see -/// @ref ADDON_STATUS. -///

-/// } -/// \table_row3{ `const char* ADDON_GetTypeVersion(int type)`, -/// \anchor ADDON_GetTypeVersion -/// _required_, -/// Ask addon about version of given type. -///
-/// This is used to query its associated version in the addon before work -/// is carried out in it and the Kodi can adapt to it. -///
-/// @param[in] type With @ref ADDON_TYPE defined type to ask. -/// @return Version as string of asked type. -///

-/// } -/// \table_row3{ `const char* ADDON_GetTypeMinVersion(int type)`, -/// \anchor ADDON_GetTypeMinVersion -/// _optional_, -/// Ask addon about minimal version of given type. -///
-/// This is used to query its associated min version in the addon before work -/// is carried out in it and the Kodi can adapt to it. -///
-/// @note The minimum version is optional\, if it were not available\, the -/// major version is used instead. -///
-/// @param[in] type With @ref ADDON_TYPE defined type to ask. -/// @return Min version as string of asked type. -///

-/// } -/// \table_end -/// +#define KODI_STARTER \ + kodi_api_1 kodi::dl::api{0}; \ + KODI_IFC_HDL kodi::dl::hdl{nullptr}; \ + KODI_DLL_HDL kodi::dl::dll{nullptr}; + +#ifdef LIBRARY_ADDON #define ADDONCREATOR(AddonClass) \ - extern "C" ATTRIBUTE_DLL_EXPORT ADDON_STATUS ADDON_Create( \ - KODI_HANDLE addonInterface, const char* /*globalApiVersion*/, void* /*unused*/) \ + KODI_STARTER \ + kodi::addon::CAddonBase::CIfc kodi::addon::CAddonBase::ifc; \ + ADDON_STATUS ADDON_Create(KODI_OWN_HDL first_instance, KODI_ADDON_HDL* hdl) \ { \ - kodi::addon::CAddonBase::m_interface = static_cast(addonInterface); \ - kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \ - return static_cast(kodi::addon::CAddonBase::m_interface->addonBase) \ - ->Create(); \ + using namespace ::kodi::addon; \ + CAddonBase::ifc.m_firstInstance = first_instance; \ + CAddonBase::ifc.m_addonBase = new AddonClass; \ + *hdl = CAddonBase::ifc.m_addonBase; \ + return static_cast(*hdl)->Create(); \ } \ - extern "C" ATTRIBUTE_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \ + extern "C" ATTR_DLL_EXPORT int non_blocking_main_start(int argc, char** argv) \ { \ - return kodi::addon::GetTypeVersion(type); \ + static KODI_ADDON_FUNC func = {ADDON_Create, \ + kodi::addon::CAddonBase::ADDONBASE_Destroy, \ + kodi::addon::CAddonBase::ADDONBASE_CreateInstance, \ + kodi::addon::CAddonBase::ADDONBASE_DestroyInstance, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingString, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingBoolean, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingInteger, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingFloat}; \ + return kodi::Init(__KODI_API__, argc, argv, &func, true, false) ? 0 : -1; \ } \ - extern "C" ATTRIBUTE_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \ + extern "C" ATTR_DLL_EXPORT void non_blocking_main_stop() \ { \ - return kodi::addon::GetTypeMinVersion(type); \ + kodi::Deinit(); \ + } +#else +#define ADDONCREATOR(AddonClass) \ + KODI_STARTER \ + kodi::addon::CAddonBase::CIfc kodi::addon::CAddonBase::ifc; \ + ADDON_STATUS ADDON_Create(KODI_OWN_HDL first_instance, KODI_ADDON_HDL* hdl) \ + { \ + using namespace ::kodi::addon; \ + CAddonBase::ifc.m_firstInstance = first_instance; \ + CAddonBase::ifc.m_addonBase = new AddonClass; \ + *hdl = CAddonBase::ifc.m_addonBase; \ + return static_cast(*hdl)->Create(); \ } \ - AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr; -//------------------------------------------------------------------------------ + extern "C" ATTR_DLL_EXPORT int main(int argc, char** argv) \ + { \ + fprintf(stderr, "TEMP DEBUG: Addon main started, PID %i\n", getpid()); \ + /* sleep(5); */ \ + static KODI_ADDON_FUNC func = {ADDON_Create, \ + kodi::addon::CAddonBase::ADDONBASE_Destroy, \ + kodi::addon::CAddonBase::ADDONBASE_CreateInstance, \ + kodi::addon::CAddonBase::ADDONBASE_DestroyInstance, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingString, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingBoolean, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingInteger, \ + kodi::addon::CAddonBase::ADDONBASE_SetSettingFloat}; \ + if (!kodi::Init(__KODI_API__, argc, argv, &func, true, false)) \ + { \ + fprintf(stderr, "TEMP DEBUG: Addon main start failed!!! PID %i\n", getpid()); \ + return -1; \ + } \ + while (1) \ + { \ + if (!kodi::dl::api.kodi_process(kodi::dl::hdl)) \ + break; \ + } \ + kodi::Deinit(); \ + return 0; \ + } +#endif #endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/AudioEngine.h b/xbmc/addons/kodi-dev-kit/include/kodi/AudioEngine.h index c6f8c4fdfccfb..9ea932fd2d882 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/AudioEngine.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/AudioEngine.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2019 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,198 +9,77 @@ #pragma once #include "AddonBase.h" +#include "General.h" #include "c-api/audio_engine.h" #ifdef __cplusplus +#include + namespace kodi { namespace audioengine { -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// Main page text for audio engine group by Doxygen. -//{{{ - -//============================================================================== -/// -/// @defgroup cpp_kodi_audioengine Interface - kodi::audioengine -/// @ingroup cpp -/// @brief **Audio engine functions**\n -/// This interface contains auxiliary functions and classes which allow an addon -/// to play their own individual audio stream in Kodi. -/// -/// Using @ref cpp_kodi_audioengine_CAEStream "kodi::audioengine::CAEStream", -/// a class can be created in this regard, about which the necessary stream data and -/// information are given to Kodi. -/// -/// Via @ref kodi::audioengine::GetCurrentSinkFormat(), the audio formats currently -/// processed in Kodi can be called up beforehand in order to adapt your own stream -/// to them. -/// -/// However, the created stream can also differ from this because Kodi changes -/// it to suit it. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// -/// #include -/// -/// ... -/// -/// kodi::audioengine::AudioEngineFormat format; -/// if (!kodi::audioengine::GetCurrentSinkFormat(format)) -/// return false; -/// -/// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP); -/// format.SetChannelLayout(std::vector(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR)); -/// -/// unsigned int myUsedSampleRate = format.GetSampleRate(); -/// -/// ... -/// -/// kodi::audioengine::CAEStream* stream = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_AUTOSTART); -/// -/// ~~~~~~~~~~~~~ -/// -/// ------------------------------------------------------------------------ -/// -/// It has the header @ref AudioEngine.h "#include " be included -/// to enjoy it. -/// -//------------------------------------------------------------------------------ - -//============================================================================== -/// -/// @defgroup cpp_kodi_audioengine_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_audioengine -/// @brief **Library definition values**\n -/// All audio engine functions associated data structures. -/// -//------------------------------------------------------------------------------ - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" related audio engine definitions -//{{{ - -//============================================================================== -/// @defgroup cpp_kodi_audioengine_Defs_AudioEngineFormat class AudioEngineFormat -/// @ingroup cpp_kodi_audioengine_Defs -/// @brief **Audio format structure**\n -/// The audio format structure that fully defines a stream's audio -/// information. -/// -/// With the help of this format information, Kodi adjusts its processing -/// accordingly. -/// -///@{ -class ATTRIBUTE_HIDDEN AudioEngineFormat - : public addon::CStructHdl +class AudioEngineFormat : public addon::CStructHdl { public: - /*! \cond PRIVATE */ AudioEngineFormat() { - m_cStructure->m_dataFormat = AUDIOENGINE_FMT_INVALID; - m_cStructure->m_sampleRate = 0; - m_cStructure->m_encodedRate = 0; - m_cStructure->m_frames = 0; - m_cStructure->m_frameSize = 0; - m_cStructure->m_channelCount = 0; + m_cStructure->data_format = AUDIOENGINE_FMT_INVALID; + m_cStructure->sample_rate = 0; + m_cStructure->frames = 0; + m_cStructure->frame_size = 0; + m_cStructure->channel_count = 0; for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) - m_cStructure->m_channels[ch] = AUDIOENGINE_CH_NULL; + m_cStructure->channels[ch] = AUDIOENGINE_CH_NULL; } AudioEngineFormat(const AudioEngineFormat& channel) : CStructHdl(channel) {} - AudioEngineFormat(const AUDIO_ENGINE_FORMAT* channel) : CStructHdl(channel) {} - AudioEngineFormat(AUDIO_ENGINE_FORMAT* channel) : CStructHdl(channel) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineFormat_Help *Value Help* - /// @ingroup cpp_kodi_audioengine_Defs_AudioEngineFormat - /// - /// The following table contains values that can be set with @ref cpp_kodi_audioengine_Defs_AudioEngineFormat : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Data format**, see @ref AudioEngineDataFormat for available types | enum | @ref AudioEngineFormat::SetDataFormat "SetDataFormat" | @ref AudioEngineFormat::GetDataFormat "GetDataFormat" - /// | **Sample rate** | unsigned int | @ref AudioEngineFormat::SetSampleRate "SetSampleRate" | @ref AudioEngineFormat::GetSampleRate "GetSampleRate" - /// | **Encoded rate** | unsigned int | @ref AudioEngineFormat::SetEncodedRate "SetEncodedRate" | @ref AudioEngineFormat::GetEncodedRate "GetEncodedRate" - /// | **Channel layout**, see @ref AudioEngineChannel for available types | std::vector | @ref AudioEngineFormat::SetChannelLayout "SetChannelLayout" | @ref AudioEngineFormat::GetChannelLayout "GetChannelLayout" - /// | **Frames amount** | unsigned int | @ref AudioEngineFormat::SetFramesAmount "SetFramesAmount" | @ref AudioEngineFormat::GetFramesAmount "GetFramesAmount" - /// | **Frame size** | unsigned int | @ref AudioEngineFormat::SetFrameSize "SetFrameSize" | @ref AudioEngineFormat::GetFrameSize "GetFrameSize" - /// - /// Further is @ref AudioEngineFormat::CompareFormat "CompareFormat" included to compare this class with another. - /// - - /// @addtogroup cpp_kodi_audioengine_Defs_AudioEngineFormat - /// @copydetails cpp_kodi_audioengine_Defs_AudioEngineFormat_Help - ///@{ - - /// @brief The stream's data format (eg, AUDIOENGINE_FMT_S16LE) - void SetDataFormat(enum AudioEngineDataFormat format) { m_cStructure->m_dataFormat = format; } - - /// @brief To get with @ref SetDataFormat changed values. - enum AudioEngineDataFormat GetDataFormat() const { return m_cStructure->m_dataFormat; } - - /// @brief The stream's sample rate (eg, 48000) - void SetSampleRate(unsigned int rate) { m_cStructure->m_sampleRate = rate; } - - /// @brief To get with @ref SetSampleRate changed values. - unsigned int GetSampleRate() const { return m_cStructure->m_sampleRate; } - - /// @brief The encoded streams sample rate if a bitstream, otherwise undefined - void SetEncodedRate(unsigned int rate) { m_cStructure->m_encodedRate = rate; } - - /// @brief To get with @ref SetEncodedRate changed values. - unsigned int GetEncodedRate() const { return m_cStructure->m_encodedRate; } - - /// @brief The stream's channel layout - void SetChannelLayout(const std::vector& layout) + AudioEngineFormat(const AUDIO_ENGINE_FMT* channel) : CStructHdl(channel) {} + AudioEngineFormat(AUDIO_ENGINE_FMT* channel) : CStructHdl(channel) {} + + void SetDataFormat(AudioEngineDataFormat format) { m_cStructure->data_format = format; } + AudioEngineDataFormat GetDataFormat() const { return m_cStructure->data_format; } + + void SetSampleRate(unsigned int rate) { m_cStructure->sample_rate = rate; } + unsigned int GetSampleRate() const { return m_cStructure->sample_rate; } + + void SetChannelLayout(const std::vector& layout) { // Reset first all to empty values to AUDIOENGINE_CH_NULL, in case given list is empty - m_cStructure->m_channelCount = 0; + m_cStructure->channel_count = 0; for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) - m_cStructure->m_channels[ch] = AUDIOENGINE_CH_NULL; + m_cStructure->channels[ch] = AUDIOENGINE_CH_NULL; for (size_t ch = 0; ch < layout.size() && ch < AUDIOENGINE_CH_MAX; ++ch) { - m_cStructure->m_channels[ch] = layout[ch]; - m_cStructure->m_channelCount++; + m_cStructure->channels[ch] = layout[ch]; + m_cStructure->channel_count++; } } - /// @brief To get with @ref SetChannelLayout changed values. - std::vector GetChannelLayout() const + std::vector GetChannelLayout() const { - std::vector channels; + std::vector channels; for (size_t ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) { - if (m_cStructure->m_channels[ch] == AUDIOENGINE_CH_NULL) + if (m_cStructure->channels[ch] == AUDIOENGINE_CH_NULL) break; - channels.push_back(m_cStructure->m_channels[ch]); + channels.push_back(m_cStructure->channels[ch]); } return channels; } - /// @brief The number of frames per period - void SetFramesAmount(unsigned int frames) { m_cStructure->m_frames = frames; } - - /// @brief To get with @ref SetFramesAmount changed values. - unsigned int GetFramesAmount() const { return m_cStructure->m_frames; } + unsigned int GetChannelCount() { return m_cStructure->channel_count; } - /// @brief The size of one frame in bytes - void SetFrameSize(unsigned int frameSize) { m_cStructure->m_frameSize = frameSize; } + void SetFramesAmount(unsigned int frames) { m_cStructure->frames = frames; } + unsigned int GetFramesAmount() const { return m_cStructure->frames; } - /// @brief To get with @ref SetFrameSize changed values. - unsigned int GetFrameSize() const { return m_cStructure->m_frameSize; } + void SetFrameSize(unsigned int frameSize) { m_cStructure->frame_size = frameSize; } + unsigned int GetFrameSize() const { return m_cStructure->frame_size; } - /// @brief Function to compare the format structure with another bool CompareFormat(const AudioEngineFormat* fmt) { if (!fmt) @@ -208,19 +87,18 @@ class ATTRIBUTE_HIDDEN AudioEngineFormat return false; } - if (m_cStructure->m_dataFormat != fmt->m_cStructure->m_dataFormat || - m_cStructure->m_sampleRate != fmt->m_cStructure->m_sampleRate || - m_cStructure->m_encodedRate != fmt->m_cStructure->m_encodedRate || - m_cStructure->m_frames != fmt->m_cStructure->m_frames || - m_cStructure->m_frameSize != fmt->m_cStructure->m_frameSize || - m_cStructure->m_channelCount != fmt->m_cStructure->m_channelCount) + if (m_cStructure->data_format != fmt->m_cStructure->data_format || + m_cStructure->sample_rate != fmt->m_cStructure->sample_rate || + m_cStructure->frames != fmt->m_cStructure->frames || + m_cStructure->frame_size != fmt->m_cStructure->frame_size || + m_cStructure->channel_count != fmt->m_cStructure->channel_count) { return false; } for (unsigned int ch = 0; ch < AUDIOENGINE_CH_MAX; ++ch) { - if (fmt->m_cStructure->m_channels[ch] != m_cStructure->m_channels[ch]) + if (fmt->m_cStructure->channels[ch] != m_cStructure->channels[ch]) { return false; } @@ -228,127 +106,35 @@ class ATTRIBUTE_HIDDEN AudioEngineFormat return true; } - ///@} }; -///@} -//---------------------------------------------------------------------------- - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" AudioEngine addon interface -//{{{ - -//============================================================================ -/// -/// @defgroup cpp_kodi_audioengine_CAEStream class CAEStream -/// @ingroup cpp_kodi_audioengine -/// @brief **Audio Engine Stream Class**\n -/// Class that can be created by the addon in order to be able to transfer -/// audiostream data processed on the addon to Kodi and output it audibly. -/// -/// This can create individually several times and performed in different -/// processes simultaneously. -/// -/// It has the header @ref AudioEngine.h "#include " be -/// included to enjoy it. -/// -//---------------------------------------------------------------------------- -class ATTRIBUTE_HIDDEN CAEStream + +class CAEStream { public: - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Contructs new class to an Kodi IAEStream in the format specified. - /// - /// @param[in] format The data format the incoming audio will be in - /// (e.g. @ref AUDIOENGINE_FMT_S16LE) - /// @param[in] options [opt] A bit field of stream options (see: enum @ref AudioEngineStreamOptions) - /// - /// - /// ------------------------------------------------------------------------ - /// - /// @copydetails cpp_kodi_audioengine_Defs_AudioEngineFormat_Help - /// - /// ------------------------------------------------------------------------ - /// - /// **Bit options to pass (on Kodi by IAE::MakeStream)** - /// - /// | enum AEStreamOptions | Value: | Description: - /// |----------------------------:|:------:|:----------------------------------- - /// | AUDIO_STREAM_FORCE_RESAMPLE | 1 << 0 | Force resample even if rates match - /// | AUDIO_STREAM_PAUSED | 1 << 1 | Create the stream paused - /// | AUDIO_STREAM_AUTOSTART | 1 << 2 | Autostart the stream when enough data is buffered - /// - /// - /// ------------------------------------------------------------------------ - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// - /// #include - /// - /// ... - /// - /// kodi::audioengine::AudioEngineFormat format; - /// - /// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP); /* The stream's data format (eg, AUDIOENGINE_FMT_S16LE) */ - /// format.SetChannelLayout(std::vector(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR)); /* The stream's channel layout */ - /// format.SetSampleRate(48000); /* The stream's sample rate (eg, 48000) */ - /// format.SetFrameSize(sizeof(float)*2); /* The size of one frame in bytes */ - /// format.SetFramesAmount(882); /* The number of samples in one frame */ - /// - /// kodi::audioengine::CAEStream* stream = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_AUTOSTART); - /// - /// ~~~~~~~~~~~~~ - /// - CAEStream(AudioEngineFormat& format, unsigned int options = 0) - : m_kodiBase(::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase), - m_cb(::kodi::addon::CAddonBase::m_interface->toKodi->kodi_audioengine) + CAEStream(AudioEngineFormat& format, unsigned int options = 0) : m_format(format) { - m_StreamHandle = m_cb->make_stream(m_kodiBase, format, options); - if (m_StreamHandle == nullptr) + m_streamHandle = kodi::dl::api.kodi_audioengine_stream_make(m_format, options); + if (m_streamHandle == nullptr) { kodi::Log(ADDON_LOG_FATAL, "CAEStream: make_stream failed!"); + return; } + + m_planes = + kodi::dl::api.kodi_audioengine_is_planar_format(format.GetDataFormat()) ? format.GetChannelCount() : 1; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Class destructor. - /// ~CAEStream() { - if (m_StreamHandle) + if (m_streamHandle) { - m_cb->free_stream(m_kodiBase, m_StreamHandle); - m_StreamHandle = nullptr; + kodi::dl::api.kodi_audioengine_stream_free(m_streamHandle); + m_streamHandle = nullptr; } } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the amount of space available in the stream. - /// - /// @return The number of bytes AddData will consume - /// - unsigned int GetSpace() { return m_cb->aestream_get_space(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Add planar or interleaved PCM data to the stream. - /// - /// @param[in] data array of pointers to the planes - /// @param[in] offset to frame in frames - /// @param[in] frames number of frames - /// @param[in] pts [opt] presentation timestamp, default is 0 - /// @param[in] hasDownmix [opt] set true if downmix is present, default is false - /// @param[in] centerMixLevel [opt] level to mix left and right to center default is 1.0 - /// @return The number of frames consumed - /// + + unsigned int GetSpace() { return kodi::dl::api.kodi_audioengine_stream_get_space(m_streamHandle); } + unsigned int AddData(uint8_t* const* data, unsigned int offset, unsigned int frames, @@ -356,262 +142,87 @@ class ATTRIBUTE_HIDDEN CAEStream bool hasDownmix = false, double centerMixLevel = 1.0) { - return m_cb->aestream_add_data(m_kodiBase, m_StreamHandle, data, offset, frames, pts, - hasDownmix, centerMixLevel); + return kodi::dl::api.kodi_audioengine_stream_add_data(m_streamHandle, data, m_planes, frames * m_format.GetFrameSize(), offset, frames, + m_format.GetFrameSize(), pts, hasDownmix, + centerMixLevel); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the time in seconds that it will take for the next added - /// packet to be heard from the speakers. - /// - /// @return seconds - /// - double GetDelay() { return m_cb->aestream_get_delay(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns if the stream is buffering. - /// - /// @return True if the stream is buffering - /// - bool IsBuffering() { return m_cb->aestream_is_buffering(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the time in seconds of the stream's cached audio samples. - /// Engine buffers excluded. - /// - /// @return seconds - /// - double GetCacheTime() { return m_cb->aestream_get_cache_time(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the total time in seconds of the cache. - /// - /// @return seconds - /// - double GetCacheTotal() { return m_cb->aestream_get_cache_total(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Pauses the stream playback. - /// - void Pause() { return m_cb->aestream_pause(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Resumes the stream after pausing - /// - void Resume() { return m_cb->aestream_resume(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Start draining the stream. - /// - /// @param[in] wait [opt] Wait until drain is finished if set to true, - /// otherwise it returns direct - /// - /// @note Once called AddData will not consume more data. - /// - void Drain(bool wait = true) { return m_cb->aestream_drain(m_kodiBase, m_StreamHandle, wait); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns true if the is stream draining. - /// - bool IsDraining() { return m_cb->aestream_is_draining(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns true if the is stream has finished draining. - /// - bool IsDrained() { return m_cb->aestream_is_drained(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Flush all buffers dropping the audio data. - /// - void Flush() { return m_cb->aestream_flush(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Return the stream's current volume level. - /// - /// @return The volume level between 0.0 and 1.0 - /// - float GetVolume() { return m_cb->aestream_get_volume(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Set the stream's volume level. - /// - /// @param[in] volume The new volume level between 0.0 and 1.0 - /// + + double GetDelay() { return kodi::dl::api.kodi_audioengine_stream_get_delay(m_streamHandle); } + + bool IsBuffering() { return kodi::dl::api.kodi_audioengine_stream_is_buffering(m_streamHandle); } + + double GetCacheTime() { return kodi::dl::api.kodi_audioengine_stream_get_cache_time(m_streamHandle); } + + double GetCacheTotal() { return kodi::dl::api.kodi_audioengine_stream_get_cache_total(m_streamHandle); } + + void Pause() { return kodi::dl::api.kodi_audioengine_stream_pause(m_streamHandle); } + + void Resume() { return kodi::dl::api.kodi_audioengine_stream_resume(m_streamHandle); } + + void Drain(bool wait = true) { return kodi::dl::api.kodi_audioengine_stream_drain(m_streamHandle, wait); } + + bool IsDraining() { return kodi::dl::api.kodi_audioengine_stream_is_draining(m_streamHandle); } + + bool IsDrained() { return kodi::dl::api.kodi_audioengine_stream_is_drained(m_streamHandle); } + + void Flush() { return kodi::dl::api.kodi_audioengine_stream_flush(m_streamHandle); } + + float GetVolume() { return kodi::dl::api.kodi_audioengine_stream_get_volume(m_streamHandle); } + void SetVolume(float volume) { - return m_cb->aestream_set_volume(m_kodiBase, m_StreamHandle, volume); + return kodi::dl::api.kodi_audioengine_stream_set_volume(m_streamHandle, volume); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Gets the stream's volume amplification in linear units. - /// - /// @return The volume amplification factor between 1.0 and 1000.0 - /// - float GetAmplification() { return m_cb->aestream_get_amplification(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Sets the stream's volume amplification in linear units. - /// - /// @param[in] amplify The volume amplification factor between 1.0 and 1000.0 - /// + + float GetAmplification() { return kodi::dl::api.kodi_audioengine_stream_get_amplification(m_streamHandle); } + void SetAmplification(float amplify) { - return m_cb->aestream_set_amplification(m_kodiBase, m_StreamHandle, amplify); + return kodi::dl::api.kodi_audioengine_stream_set_amplification(m_streamHandle, amplify); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the size of one audio frame in bytes (channelCount * resolution). - /// - /// @return The size in bytes of one frame - /// + unsigned int GetFrameSize() const { - return m_cb->aestream_get_frame_size(m_kodiBase, m_StreamHandle); + return kodi::dl::api.kodi_audioengine_stream_get_frame_size(m_streamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the number of channels the stream is configured to accept. - /// - /// @return The channel count - /// + unsigned int GetChannelCount() const { - return m_cb->aestream_get_channel_count(m_kodiBase, m_StreamHandle); + return kodi::dl::api.kodi_audioengine_stream_get_channel_count(m_streamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Returns the stream's sample rate, if the stream is using a dynamic - /// sample rate, this value will NOT reflect any changes made by calls to - /// SetResampleRatio(). - /// - /// @return The stream's sample rate (eg, 48000) - /// + unsigned int GetSampleRate() const { - return m_cb->aestream_get_sample_rate(m_kodiBase, m_StreamHandle); + return kodi::dl::api.kodi_audioengine_stream_get_sample_rate(m_streamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Return the data format the stream has been configured with. - /// - /// @return The stream's data format (eg, AUDIOENGINE_FMT_S16LE) - /// + AudioEngineDataFormat GetDataFormat() const { - return m_cb->aestream_get_data_format(m_kodiBase, m_StreamHandle); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Return the resample ratio. - /// - /// @note This will return an undefined value if the stream is not resampling. - /// - /// @return the current resample ratio or undefined if the stream is not resampling - /// - double GetResampleRatio() - { - return m_cb->aestream_get_resample_ratio(m_kodiBase, m_StreamHandle); + return kodi::dl::api.kodi_audioengine_stream_get_data_format(m_streamHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Sets the resample ratio. - /// - /// @note This function may return false if the stream is not resampling, if - /// you wish to use this be sure to set the AESTREAM_FORCE_RESAMPLE option. - /// - /// @param[in] ratio the new sample rate ratio, calculated by - /// ((double)desiredRate / (double)GetSampleRate()) - /// + + double GetResampleRatio() { return kodi::dl::api.kodi_audioengine_stream_get_resample_ratio(m_streamHandle); } + void SetResampleRatio(double ratio) { - m_cb->aestream_set_resample_ratio(m_kodiBase, m_StreamHandle, ratio); + kodi::dl::api.kodi_audioengine_stream_set_resample_ratio(m_streamHandle, ratio); } - //-------------------------------------------------------------------------- private: - void* m_kodiBase; - AddonToKodiFuncTable_kodi_audioengine* m_cb; - AEStreamHandle* m_StreamHandle; + const AudioEngineFormat m_format; + int m_planes = 1; + KODI_AE_HDL m_streamHandle; }; -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_audioengine -/// @brief Get the current sink data format. -/// -/// @param[in] format Current sink data format. For more details see AudioEngineFormat. -/// @return Returns true on success, else false. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// -/// #include -/// -/// ... -/// -/// kodi::audioengine::AudioEngineFormat format; -/// if (!kodi::audioengine::GetCurrentSinkFormat(format)) -/// return false; -/// -/// std::vector layout = format.GetChannelLayout(); -/// -/// ... -/// return true; -/// -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetCurrentSinkFormat(AudioEngineFormat& format) + +inline bool GetCurrentSinkFormat(AudioEngineFormat& format) { - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_audioengine->get_current_sink_format( - CAddonBase::m_interface->toKodi->kodiBase, format); + return kodi::dl::api.kodi_audioengine_get_current_sink_format(format); } -//---------------------------------------------------------------------------- -//}}} +inline bool IsPlanarFormat(AudioEngineDataFormat format) +{ + return kodi::dl::api.kodi_audioengine_is_planar_format(format); +} } // namespace audioengine } // namespace kodi diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt index 298b5de1ceac1..cd099d1736f6c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt @@ -1,14 +1,14 @@ -set(HEADERS AddonBase.h - AudioEngine.h - Filesystem.h - General.h - Network.h - versions.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(CORE_SYSTEM_NAME STREQUAL android) - list(APPEND SOURCES platform/android/System.h) -endif() +set(HEADERS + AddonBase.h + AudioEngine.h + Filesystem.h + General.h + Monitor.h +) -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi) +if(HEADERS) + core_add_devkit_header(kodi) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h b/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h index 9e0598353b341..3f4b620e834ef 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h @@ -22,536 +22,207 @@ namespace kodi namespace vfs { -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// Main page text for filesystem group by Doxygen. -//{{{ - -//============================================================================== -/// -/// @defgroup cpp_kodi_vfs Interface - kodi::vfs -/// @ingroup cpp -/// @brief **Virtual filesystem functions**\n -/// Offers classes and functions for access to the Virtual File Server (VFS) -/// which you can use to manipulate files and folders. -/// -/// This system allow the use of ["Special Protocol"](https://kodi.wiki/view/Special_protocol) -/// where is Kodi's solution to platform dependent directories. Common directory -/// names are assigned a `special://[name]` path which is passed around -/// inside Kodi and then translated to the platform specific path before the -/// operating system sees it. This helps keep most of the platform mess -/// centralized in the code.\n -/// To become a correct path back can be @ref TranslateSpecialProtocol() used. -/// -/// It has the header @ref Filesystem.h "#include " be -/// included to enjoy it. -/// -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_vfs -/// @brief **Virtual file Server definition values**\n -/// All to VFS system functions associated data structures. -/// -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_Directory 1. Directory functions -/// @ingroup cpp_kodi_vfs -/// @brief **Globally available directories related functions**\n -/// Used to perform typical operations with it. -/// -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_File 2. File functions -/// @ingroup cpp_kodi_vfs -/// @brief **Globally available file related functions**\n -/// Used to perform typical operations with it. -/// -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_General 3. General functions -/// @ingroup cpp_kodi_vfs -/// @brief **Other globally available functions**\n -/// Used to perform typical operations with it. -/// -//------------------------------------------------------------------------------ - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" related filesystem definitions -//{{{ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_Defs_FileStatus class FileStatus -/// @ingroup cpp_kodi_vfs_Defs -/// @brief **File information status**\n -/// Used on kodi::vfs::StatFile() to get detailed information about a file. -/// -///@{ -class ATTRIBUTE_HIDDEN FileStatus : public kodi::addon::CStructHdl +class FileStatus : public kodi::addon::CStructHdl { public: - /*! \cond PRIVATE */ - FileStatus() { memset(m_cStructure, 0, sizeof(STAT_STRUCTURE)); } + FileStatus() { memset(m_cStructure, 0, sizeof(VFS_STAT_STRUCTURE)); } FileStatus(const FileStatus& channel) : CStructHdl(channel) {} - FileStatus(const STAT_STRUCTURE* channel) : CStructHdl(channel) {} - FileStatus(STAT_STRUCTURE* channel) : CStructHdl(channel) {} - /*! \endcond */ + FileStatus(const VFS_STAT_STRUCTURE* channel) : CStructHdl(channel) {} + FileStatus(VFS_STAT_STRUCTURE* channel) : CStructHdl(channel) {} - /// @defgroup cpp_kodi_vfs_Defs_FileStatus_Help Value Help - /// @ingroup cpp_kodi_vfs_Defs_FileStatus - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_vfs_Defs_FileStatus : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **ID of device containing file** | `uint32_t` | @ref FileStatus::SetDeviceId "SetDeviceId" | @ref FileStatus::GetDeviceId "GetDeviceId" - /// | **Represent file serial numbers** | `uint64_t` | @ref FileStatus::SetFileSerialNumber "SetFileSerialNumber" | @ref FileStatus::GetFileSerialNumber "GetFileSerialNumber" - /// | **Total size, in bytes** | `uint64_t` | @ref FileStatus::SetSize "SetSize" | @ref FileStatus::GetSize "GetSize" - /// | **Time of last access** | `time_t` | @ref FileStatus::SetAccessTime "SetAccessTime" | @ref FileStatus::GetAccessTime "GetAccessTime" - /// | **Time of last modification** | `time_t` | @ref FileStatus::SetModificationTime "SetModificationTime" | @ref FileStatus::GetModificationTime "GetModificationTime" - /// | **Time of last status change** | `time_t` | @ref FileStatus::SetStatusTime "SetStatusTime" | @ref FileStatus::GetStatusTime "GetStatusTime" - /// | **Stat url is a directory** | `bool` | @ref FileStatus::SetIsDirectory "SetIsDirectory" | @ref FileStatus::GetIsDirectory "GetIsDirectory" - /// | **Stat url as a symbolic link** | `bool` | @ref FileStatus::SetIsSymLink "SetIsSymLink" | @ref FileStatus::GetIsSymLink "GetIsSymLink" - /// | **Stat url as a block special** | `bool` | @ref FileStatus::SetIsBlock "SetIsBlock" | @ref FileStatus::GetIsBlock "GetIsBlock" - /// | **Stat url as a character special** | `bool` | @ref FileStatus::SetIsCharacter "SetIsCharacter" | @ref FileStatus::GetIsCharacter "GetIsCharacter" - /// | **Stat url as a FIFO special** | `bool` | @ref FileStatus::SetIsFifo "SetIsFifo" | @ref FileStatus::GetIsFifo "GetIsFifo" - /// | **Stat url as a regular** | `bool` | @ref FileStatus::SetIsRegular "SetIsRegular" | @ref FileStatus::GetIsRegular "GetIsRegular" - /// | **Stat url as a socket** | `bool` | @ref FileStatus::SetIsSocket "SetIsSocket" | @ref FileStatus::GetIsSocket "GetIsSocket" - /// - - /// @addtogroup cpp_kodi_vfs_Defs_FileStatus - /// @copydetails cpp_kodi_vfs_Defs_FileStatus_Help - ///@{ - - /// @brief Set ID of device containing file. void SetDeviceId(uint32_t deviceId) { m_cStructure->deviceId = deviceId; } - - /// @brief Get ID of device containing file. uint32_t GetDeviceId() const { return m_cStructure->deviceId; } - /// @brief Set the file serial number, which distinguishes this file from all other files on the same device. void SetFileSerialNumber(uint64_t fileSerialNumber) { m_cStructure->fileSerialNumber = fileSerialNumber; } - - /// @brief Get the file serial number, which distinguishes this file from all other files on the same device. uint64_t GetFileSerialNumber() const { return m_cStructure->fileSerialNumber; } - /// @brief Set total size, in bytes. void SetSize(uint64_t size) { m_cStructure->size = size; } - - /// @brief Get total size, in bytes. uint64_t GetSize() const { return m_cStructure->size; } - /// @brief Set time of last access. void SetAccessTime(time_t accessTime) { m_cStructure->accessTime = accessTime; } - - /// @brief Get time of last access. time_t GetAccessTime() const { return m_cStructure->accessTime; } - /// @brief Set time of last modification. void SetModificationTime(time_t modificationTime) { m_cStructure->modificationTime = modificationTime; } - - /// @brief Get time of last modification. time_t GetModificationTime() const { return m_cStructure->modificationTime; } - /// @brief Set time of last status change. void SetStatusTime(time_t statusTime) { m_cStructure->statusTime = statusTime; } - - /// @brief Get time of last status change. time_t GetStatusTime() const { return m_cStructure->statusTime; } - /// @brief Set the stat url is a directory. void SetIsDirectory(bool isDirectory) { m_cStructure->isDirectory = isDirectory; } - - /// @brief The stat url is a directory if returns true. bool GetIsDirectory() const { return m_cStructure->isDirectory; } - /// @brief Set stat url as a symbolic link. void SetIsSymLink(bool isSymLink) { m_cStructure->isSymLink = isSymLink; } - - /// @brief Get stat url is a symbolic link. bool GetIsSymLink() const { return m_cStructure->isSymLink; } - /// @brief Set stat url as a block special. void SetIsBlock(bool isBlock) { m_cStructure->isBlock = isBlock; } - - /// @brief Get stat url is a block special. bool GetIsBlock() const { return m_cStructure->isBlock; } - /// @brief Set stat url as a character special. void SetIsCharacter(bool isCharacter) { m_cStructure->isCharacter = isCharacter; } - - /// @brief Get stat url is a character special. bool GetIsCharacter() const { return m_cStructure->isCharacter; } - /// @brief Set stat url as a FIFO special. void SetIsFifo(bool isFifo) { m_cStructure->isFifo = isFifo; } - - /// @brief Get stat url is a FIFO special. bool GetIsFifo() const { return m_cStructure->isFifo; } - /// @brief Set stat url as a regular. void SetIsRegular(bool isRegular) { m_cStructure->isRegular = isRegular; } - - /// @brief Get stat url is a regular. bool GetIsRegular() const { return m_cStructure->isRegular; } - /// @brief Set stat url is a socket. void SetIsSocket(bool isSocket) { m_cStructure->isSocket = isSocket; } - - /// @brief Get stat url is a regular. bool GetIsSocket() const { return m_cStructure->isSocket; } - ///@} }; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_Defs_CacheStatus class CacheStatus -/// @ingroup cpp_kodi_vfs_Defs -/// @brief **Cache information status**\n -/// Used on kodi::vfs::CFile::IoControlGetCacheStatus() to get running cache -/// status of proccessed stream. -/// -///@{ -class ATTRIBUTE_HIDDEN CacheStatus - : public kodi::addon::CStructHdl + +class CacheStatus + : public kodi::addon::CStructHdl { public: - /*! \cond PRIVATE */ - CacheStatus() { memset(m_cStructure, 0, sizeof(VFS_CACHE_STATUS_DATA)); } + CacheStatus() { memset(m_cStructure, 0, sizeof(VFS_CACHE_STATUS)); } CacheStatus(const CacheStatus& channel) : CStructHdl(channel) {} - CacheStatus(const VFS_CACHE_STATUS_DATA* channel) : CStructHdl(channel) {} - CacheStatus(VFS_CACHE_STATUS_DATA* channel) : CStructHdl(channel) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_vfs_Defs_CacheStatus_Help Value Help - /// @ingroup cpp_kodi_vfs_Defs_CacheStatus - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_vfs_Defs_CacheStatus : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Number of bytes cached** | `uint64_t` | @ref CacheStatus::SetForward "SetForward" | @ref CacheStatus::GetForward "GetForward" - /// | **Maximum number of bytes per second** | `unsigned int` | @ref CacheStatus::SetMaxRate "SetMaxRate" | @ref CacheStatus::GetMaxRate "GetMaxRate" - /// | **Average read rate from source file** | `unsigned int` | @ref CacheStatus::SetCurrentRate "SetCurrentRate" | @ref CacheStatus::GetCurrentRate "GetCurrentRate" - /// | **Cache low speed condition detected** | `bool` | @ref CacheStatus::SetLowspeed "SetLowspeed" | @ref CacheStatus::GetLowspeed "GetLowspeed" - /// - - /// @addtogroup cpp_kodi_vfs_Defs_CacheStatus - /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help - ///@{ + CacheStatus(const VFS_CACHE_STATUS* channel) : CStructHdl(channel) {} + CacheStatus(VFS_CACHE_STATUS* channel) : CStructHdl(channel) {} - /// @brief Set number of bytes cached forward of current position. void SetForward(uint64_t forward) { m_cStructure->forward = forward; } - - /// @brief Get number of bytes cached forward of current position. uint64_t GetForward() { return m_cStructure->forward; } - /// @brief Set maximum number of bytes per second cache is allowed to fill. void SetMaxRate(unsigned int maxrate) { m_cStructure->maxrate = maxrate; } - - /// @brief Set maximum number of bytes per second cache is allowed to fill. unsigned int GetMaxRate() { return m_cStructure->maxrate; } - /// @brief Set average read rate from source file since last position change. void SetCurrentRate(unsigned int currate) { m_cStructure->currate = currate; } - - /// @brief Get average read rate from source file since last position change. unsigned int GetCurrentRate() { return m_cStructure->currate; } - /// @brief Set cache low speed condition detected. void SetLowspeed(bool lowspeed) { m_cStructure->lowspeed = lowspeed; } - - /// @brief Get cache low speed condition detected. bool GetLowspeed() { return m_cStructure->lowspeed; } - - ///@} }; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_Defs_HttpHeader class HttpHeader -/// @ingroup cpp_kodi_vfs_Defs -/// @brief **HTTP header information**\n -/// The class used to access HTTP header information and get his information. -/// -/// Used on @ref kodi::vfs::GetHttpHeader(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_vfs_Defs_HttpHeader_Help -/// -///@{ -class ATTRIBUTE_HIDDEN HttpHeader + +class HttpHeader { public: - //========================================================================== - /// @brief Http header parser class constructor. - /// HttpHeader() { - using namespace ::kodi::addon; - - CAddonBase::m_interface->toKodi->kodi_filesystem->http_header_create( - CAddonBase::m_interface->toKodi->kodiBase, &m_handle); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief Class destructor. - /// ~HttpHeader() { - using namespace ::kodi::addon; - - CAddonBase::m_interface->toKodi->kodi_filesystem->http_header_free( - CAddonBase::m_interface->toKodi->kodiBase, &m_handle); + kodi::dl::api.kodi_vfs_http_header_close(m_handle); } - //-------------------------------------------------------------------------- - /// @defgroup cpp_kodi_vfs_Defs_HttpHeader_Help Value Help - /// @ingroup cpp_kodi_vfs_Defs_HttpHeader - /// - /// The following table contains values that can be get with @ref cpp_kodi_vfs_Defs_HttpHeader : - /// | Description | Type | Get call - /// |-------------|------|------------ - /// | **Get the value associated with this parameter of these HTTP headers** | `std::string` | @ref HttpHeader::GetValue "GetValue" - /// | **Get the values as list associated with this parameter of these HTTP headers** | `std::vector` | @ref HttpHeader::GetValues "GetValues" - /// | **Get the full header string associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetHeader "GetHeader" - /// | **Get the mime type associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetMimeType "GetMimeType" - /// | **Get the charset associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetCharset "GetCharset" - /// | **The protocol line associated with these HTTP headers** | `std::string` | @ref HttpHeader::GetProtoLine "GetProtoLine" - /// - - /// @addtogroup cpp_kodi_vfs_Defs_HttpHeader - ///@{ - - //========================================================================== - /// @brief Get the value associated with this parameter of these HTTP - /// headers. - /// - /// @param[in] param The name of the parameter a value is required for - /// @return The value found - /// std::string GetValue(const std::string& param) const { - using namespace ::kodi::addon; - - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = m_handle.get_value(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle, - param.c_str()); + char* string = kodi::dl::api.kodi_vfs_http_header_get_value(m_handle, param.c_str()); if (string != nullptr) { protoLine = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + free( string); } return protoLine; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief Get the values as list associated with this parameter of these - /// HTTP headers. - /// - /// @param[in] param The name of the parameter values are required for - /// @return The values found - /// std::vector GetValues(const std::string& param) const { - using namespace kodi::addon; - - if (!m_handle.handle) + if (!m_handle) return std::vector(); - int numValues = 0; - char** res(m_handle.get_values(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle, + size_t numValues = 0; + char** res(kodi::dl::api.kodi_vfs_http_header_get_values(m_handle, param.c_str(), &numValues)); if (res) { std::vector vecReturn; vecReturn.reserve(numValues); - for (int i = 0; i < numValues; ++i) + for (size_t i = 0; i < numValues; ++i) { vecReturn.emplace_back(res[i]); + free(res[i]); } - CAddonBase::m_interface->toKodi->free_string_array(CAddonBase::m_interface->toKodi->kodiBase, - res, numValues); + free(res); + return vecReturn; } return std::vector(); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief Get the full header string associated with these HTTP headers. - /// - /// @return The header as a string - /// std::string GetHeader() const { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string header; - char* string = m_handle.get_header(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle); + char* string = kodi::dl::api.kodi_vfs_http_header_get_header(m_handle); if (string != nullptr) { header = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - string); + free(string); } return header; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief Get the mime type associated with these HTTP headers. - /// - /// @return The mime type - /// std::string GetMimeType() const { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; char* string = - m_handle.get_mime_type(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle); + kodi::dl::api.kodi_vfs_http_header_get_mime_type(m_handle); if (string != nullptr) { protoLine = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief Get the charset associated with these HTTP headers. - /// - /// @return The charset - /// std::string GetCharset() const { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = m_handle.get_charset(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle); + char* string = kodi::dl::api.kodi_vfs_http_header_get_charset(m_handle); if (string != nullptr) { protoLine = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @brief The protocol line associated with these HTTP headers. - /// - /// @return The protocol line - /// std::string GetProtoLine() const { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = - m_handle.get_proto_line(CAddonBase::m_interface->toKodi->kodiBase, m_handle.handle); + char* string = kodi::dl::api.kodi_vfs_http_header_get_proto_line(m_handle); if (string != nullptr) { protoLine = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } - //-------------------------------------------------------------------------- - - ///@} - KODI_HTTP_HEADER m_handle; + KODI_HTTP_HEADER_HDL m_handle; }; -///@} -//---------------------------------------------------------------------------- - -//============================================================================== -/// @defgroup cpp_kodi_vfs_CDirEntry class CDirEntry -/// @ingroup cpp_kodi_vfs_Defs -/// -/// @brief **Virtual file server directory entry**\n -/// This class is used as an entry for files and folders in -/// kodi::vfs::GetDirectory(). -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// ... -/// -/// std::vector items; -/// kodi::vfs::GetDirectory("special://temp", "", items); -/// -/// fprintf(stderr, "Directory have %lu entries\n", items.size()); -/// for (unsigned long i = 0; i < items.size(); i++) -/// { -/// char buff[20]; -/// time_t now = items[i].DateTime(); -/// strftime(buff, 20, "%Y-%m-%d %H:%M:%S", gmtime(&now)); -/// fprintf(stderr, " - %04lu -- Folder: %s -- Name: %s -- Path: %s -- Time: %s\n", -/// i+1, -/// items[i].IsFolder() ? "yes" : "no ", -/// items[i].Label().c_str(), -/// items[i].Path().c_str(), -/// buff); -/// } -/// ~~~~~~~~~~~~~ -/// -/// It has the header @ref Filesystem.h "#include " be included -/// to enjoy it. -/// -///@{ -class ATTRIBUTE_HIDDEN CDirEntry + +class CDirEntry { public: - //============================================================================ - /// @ingroup cpp_kodi_vfs_CDirEntry - /// @brief Constructor for VFS directory entry - /// - /// @param[in] label [opt] Name to use for entry - /// @param[in] path [opt] Used path of the entry - /// @param[in] folder [opt] If set entry used as folder - /// @param[in] size [opt] If used as file, his size defined there - /// @param[in] dateTime [opt] Date time of the entry - /// + CDirEntry(const std::string& label = "", const std::string& path = "", bool folder = false, @@ -560,18 +231,8 @@ class ATTRIBUTE_HIDDEN CDirEntry : m_label(label), m_path(path), m_folder(folder), m_size(size), m_dateTime(dateTime) { } - //---------------------------------------------------------------------------- - - //============================================================================ - // @note Not for addon development itself needed, thats why below is - // disabled for doxygen! - // - // @ingroup cpp_kodi_vfs_CDirEntry - // @brief Constructor to create own copy - // - // @param[in] dirEntry pointer to own class type - // - explicit CDirEntry(const VFSDirEntry& dirEntry) + + explicit CDirEntry(const VFS_DIR_ENTRY& dirEntry) : m_label(dirEntry.label ? dirEntry.label : ""), m_path(dirEntry.path ? dirEntry.path : ""), m_folder(dirEntry.folder), @@ -579,152 +240,22 @@ class ATTRIBUTE_HIDDEN CDirEntry m_dateTime(dirEntry.date_time) { } - //---------------------------------------------------------------------------- - /// @defgroup cpp_kodi_vfs_CDirEntry_Help Value Help - /// @ingroup cpp_kodi_vfs_CDirEntry - /// -------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_vfs_CDirEntry : - /// | Name | Type | Set call | Get call | Clear call | - /// |------|------|----------|----------|------------| - /// | **Directory entry name** | `std::string` | @ref CDirEntry::SetLabel "SetLabel" | @ref CDirEntry::Label "Label" | | - /// | **Title of entry** | `std::string` | @ref CDirEntry::SetTitle "SetTitle" | @ref CDirEntry::Title "Title" | | - /// | **Path of the entry** | `std::string` | @ref CDirEntry::SetPath "SetPath" | @ref CDirEntry::Path "Path" | | - /// | **Entry is folder** | `bool` | @ref CDirEntry::SetFolder "SetFolder" | @ref CDirEntry::IsFolder "IsFolder" | | - /// | **The size of the file** | `int64_t` | @ref CDirEntry::SetSize "SetSize" | @ref CDirEntry::Size "Size" | | - /// | **File time and date** | `time_t` | @ref CDirEntry::SetDateTime "SetDateTime" | @ref CDirEntry::DateTime "DateTime" | | - /// | **Property entries** | `std::string, std::string` | @ref CDirEntry::AddProperty "AddProperty" | @ref CDirEntry::GetProperties "GetProperties" | @ref CDirEntry::ClearProperties "ClearProperties" - /// - - /// @addtogroup cpp_kodi_vfs_CDirEntry - /// @copydetails cpp_kodi_vfs_CDirEntry_Help - ///@{ - - //============================================================================ - /// @brief Get the directory entry name. - /// - /// @return Name of the entry - /// const std::string& Label(void) const { return m_label; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the optional title of entry. - /// - /// @return Title of the entry, if exists - /// const std::string& Title(void) const { return m_title; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the path of the entry. - /// - /// @return File system path of the entry - /// const std::string& Path(void) const { return m_path; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Used to check entry is folder. - /// - /// @return true if entry is a folder - /// bool IsFolder(void) const { return m_folder; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief If file, the size of the file. - /// - /// @return Defined file size - /// int64_t Size(void) const { return m_size; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get file time and date for a new entry. - /// - /// @return The with time_t defined date and time of file - /// time_t DateTime() { return m_dateTime; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the label name. - /// - /// @param[in] label name of entry - /// void SetLabel(const std::string& label) { m_label = label; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the title name. - /// - /// @param[in] title title name of entry - /// void SetTitle(const std::string& title) { m_title = title; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the path of the entry. - /// - /// @param[in] path path of entry - /// void SetPath(const std::string& path) { m_path = path; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the entry defined as folder. - /// - /// @param[in] folder If true becomes entry defined as folder - /// void SetFolder(bool folder) { m_folder = folder; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set a file size for a new entry. - /// - /// @param[in] size Size to set for dir entry - /// void SetSize(int64_t size) { m_size = size; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set file time and date for a new entry. - /// - /// @param[in] dateTime The with time_t defined date and time of file - /// void SetDateTime(time_t dateTime) { m_dateTime = dateTime; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Add a by string defined property entry to directory entry. - /// - /// @note A property can be used to add some special information about a file - /// or directory entry, this can be used on other places to do the right work - /// of them. - /// - /// @param[in] id Identification name of property - /// @param[in] value The property value to add by given id - /// void AddProperty(const std::string& id, const std::string& value) { m_properties[id] = value; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Clear all present properties. - /// void ClearProperties() { m_properties.clear(); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the present properties list on directory entry. - /// - /// @return map with all present properties - /// const std::map& GetProperties() const { return m_properties; } - //---------------------------------------------------------------------------- - - ///@} private: std::string m_label; @@ -735,666 +266,154 @@ class ATTRIBUTE_HIDDEN CDirEntry int64_t m_size; time_t m_dateTime; }; -///@} -//------------------------------------------------------------------------------ - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Directory related functions -//{{{ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_Directory -/// @brief Make a directory. -/// -/// The kodi::vfs::CreateDirectory() function shall create a -/// new directory with name path. -/// -/// The newly created directory shall be an empty directory. -/// -/// @param[in] path Path to the directory. -/// @return Upon successful completion, CreateDirectory() shall return true. -/// Otherwise false shall be returned, no directory shall be created. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string directory = "C:\\my_dir"; -/// bool ret = kodi::vfs::CreateDirectory(directory); -/// fprintf(stderr, "Directory '%s' successfull created: %s\n", directory.c_str(), ret ? "yes" : "no"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN CreateDirectory(const std::string& path) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->create_directory( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_Directory -/// @brief Verifying the Existence of a Directory. -/// -/// The kodi::vfs::DirectoryExists() method determines whether -/// a specified folder exists. -/// -/// @param[in] path Path to the directory. -/// @return True when it exists, false otherwise. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string directory = "C:\\my_dir"; -/// bool ret = kodi::vfs::DirectoryExists(directory); -/// fprintf(stderr, "Directory '%s' present: %s\n", directory.c_str(), ret ? "yes" : "no"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN DirectoryExists(const std::string& path) +inline bool CreateDirectory(const std::string& path) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_filesystem->directory_exists( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_create_directory(path.c_str()); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_Directory -/// @brief Removes a directory. -/// -/// The kodi::vfs::RemoveDirectory() function shall remove a -/// directory whose name is given by path. -/// -/// @param[in] path Path to the directory. -/// @param[in] recursive [opt] Remove directory recursive (default is false) -/// @return Upon successful completion, the function RemoveDirectory() shall -/// return true. Otherwise, false shall be returned, and errno set -/// to indicate the error. If false is returned, the named directory -/// shall not be changed. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// bool ret = kodi::vfs::RemoveDirectory("C:\\my_dir"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN RemoveDirectory(const std::string& path, bool recursive = false) + +inline bool DirectoryExists(const std::string& path) { - using namespace kodi::addon; + return kodi::dl::api.kodi_vfs_directory_exists(path.c_str()); +} +inline bool RemoveDirectory(const std::string& path, bool recursive = false) +{ if (!recursive) - return CAddonBase::m_interface->toKodi->kodi_filesystem->remove_directory( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_remove_directory(path.c_str()); else - return CAddonBase::m_interface->toKodi->kodi_filesystem->remove_directory_recursive( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_remove_directory_recursive(path.c_str()); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_Directory -/// @brief Lists a directory. -/// -/// Return the list of files and directories which have been found in the -/// specified directory and which respect the given constraint. -/// -/// It can handle the normal OS dependent paths and also the special virtual -/// filesystem from Kodi what starts with \b special://. -/// -/// @param[in] path The path in which the files and directories are located. -/// @param[in] mask Mask to filter out requested files, e.g. "*.avi|*.mpg" to -/// files with this ending. -/// @param[out] items The returned list directory entries. -/// @return True if listing was successful, false otherwise. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// std::vector items; -/// kodi::vfs::GetDirectory("special://temp", "", items); -/// -/// fprintf(stderr, "Directory have %lu entries\n", items.size()); -/// for (unsigned long i = 0; i < items.size(); i++) -/// { -/// fprintf(stderr, " - %04lu -- Folder: %s -- Name: %s -- Path: %s\n", -/// i+1, -/// items[i].IsFolder() ? "yes" : "no ", -/// items[i].Label().c_str(), -/// items[i].Path().c_str()); -/// } -/// ~~~~~~~~~~~~~ -inline bool ATTRIBUTE_HIDDEN GetDirectory(const std::string& path, + +inline bool GetDirectory(const std::string& path, const std::string& mask, std::vector& items) { - using namespace kodi::addon; - - VFSDirEntry* dir_list = nullptr; - unsigned int num_items = 0; - if (CAddonBase::m_interface->toKodi->kodi_filesystem->get_directory( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), mask.c_str(), &dir_list, - &num_items)) + VFS_DIR_ENTRY* dir_list = nullptr; + size_t num_items = 0; + if (kodi::dl::api.kodi_vfs_get_directory(path.c_str(), mask.c_str(), &dir_list, &num_items)) { if (dir_list) { - for (unsigned int i = 0; i < num_items; ++i) + for (size_t i = 0; i < num_items; ++i) items.emplace_back(dir_list[i]); - CAddonBase::m_interface->toKodi->kodi_filesystem->free_directory( - CAddonBase::m_interface->toKodi->kodiBase, dir_list, num_items); + kodi::dl::api.kodi_vfs_free_directory(dir_list, num_items); } return true; } return false; } -//------------------------------------------------------------------------------ - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" File related functions -//{{{ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_File -/// @brief Check if a file exists. -/// -/// @param[in] filename The filename to check. -/// @param[in] usecache Check in file cache. -/// @return true if the file exists false otherwise. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// bool exists = kodi::vfs::FileExists("special://temp/kodi.log"); -/// fprintf(stderr, "Log file should be always present, is it present? %s\n", exists ? "yes" : "no"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN FileExists(const std::string& filename, bool usecache = false) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->file_exists( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), usecache); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_File -/// @brief Get file status. -/// -/// These function return information about a file. Execute (search) -/// permission is required on all of the directories in path that -/// lead to the file. -/// -/// The call return a stat structure, which contains the on -/// @ref cpp_kodi_vfs_Defs_FileStatus defined values. -/// -/// @warning Not all of the OS file systems implement all of the time fields. -/// -/// @param[in] filename The filename to read the status from. -/// @param[out] buffer The file status is written into this buffer. -/// @return On success, trur is returned. On error, false is returned -/// -/// -/// @copydetails cpp_kodi_vfs_Defs_FileStatus_Help -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi::vfs::FileStatus statFile; -/// int ret = kodi::vfs::StatFile("special://temp/kodi.log", statFile); -/// fprintf(stderr, "deviceId (ID of device containing file) = %u\n" -/// "size (total size, in bytes) = %lu\n" -/// "accessTime (time of last access) = %lu\n" -/// "modificationTime (time of last modification) = %lu\n" -/// "statusTime (time of last status change) = %lu\n" -/// "isDirectory (The stat url is a directory) = %s\n" -/// "isSymLink (The stat url is a symbolic link) = %s\n" -/// "Return value = %i\n", -/// statFile.GetDeviceId(), -/// statFile.GetSize(), -/// statFile.GetAccessTime(), -/// statFile.GetModificationTime(), -/// statFile.GetStatusTime(), -/// statFile.GetIsDirectory() ? "true" : "false", -/// statFile.GetIsSymLink() ? "true" : "false", -/// ret); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN StatFile(const std::string& filename, kodi::vfs::FileStatus& buffer) +inline bool FileExists(const std::string& filename, bool usecache = false) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_filesystem->stat_file( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), buffer); + return kodi::dl::api.kodi_vfs_file_exists(filename.c_str(), usecache); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_File -/// @brief Deletes a file. -/// -/// @param[in] filename The filename to delete. -/// @return The file was successfully deleted. -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// #include -/// ... -/// std::string filename; -/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "", -/// "Test File selection and delete of them!", -/// filename)) -/// { -/// bool successed = kodi::vfs::DeleteFile(filename); -/// if (!successed) -/// kodi::gui::DialogOK::ShowAndGetInput("Error", "Delete of File", filename, "failed!"); -/// else -/// kodi::gui::DialogOK::ShowAndGetInput("Information", "Delete of File", filename, "successfull done."); -/// } -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN DeleteFile(const std::string& filename) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->delete_file( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str()); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_File -/// @brief Rename a file name. -/// -/// @param[in] filename The filename to copy. -/// @param[in] newFileName The new filename -/// @return true if successfully renamed -/// -/// -inline bool ATTRIBUTE_HIDDEN RenameFile(const std::string& filename, const std::string& newFileName) +inline bool StatFile(const std::string& filename, kodi::vfs::FileStatus& buffer) { - using namespace kodi::addon; + return kodi::dl::api.kodi_vfs_stat_file(filename.c_str(), buffer); +} - return CAddonBase::m_interface->toKodi->kodi_filesystem->rename_file( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), newFileName.c_str()); +inline bool DeleteFile(const std::string& filename) +{ + return kodi::dl::api.kodi_vfs_delete_file(filename.c_str()); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_File -/// @brief Copy a file from source to destination. -/// -/// @param[in] filename The filename to copy. -/// @param[in] destination The destination to copy file to -/// @return true if successfully copied -/// -/// -inline bool ATTRIBUTE_HIDDEN CopyFile(const std::string& filename, const std::string& destination) + +inline bool RenameFile(const std::string& filename, const std::string& newFileName) { - using namespace kodi::addon; + return kodi::dl::api.kodi_vfs_rename_file(filename.c_str(), newFileName.c_str()); +} - return CAddonBase::m_interface->toKodi->kodi_filesystem->copy_file( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), destination.c_str()); +inline bool CopyFile(const std::string& filename, const std::string& destination) +{ + return kodi::dl::api.kodi_vfs_copy_file(filename.c_str(), destination.c_str()); } -//------------------------------------------------------------------------------ - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" General filesystem functions -//{{{ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Retrieve MD5sum of a file. -/// -/// @param[in] path Path to the file to MD5sum -/// @return MD5 sum of the file -/// -/// -/// ------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// ... -/// std::string md5; -/// std::string filename; -/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "*.avi|*.mpg|*.mp4", -/// "Test File selection to get MD5", -/// filename)) -/// { -/// md5 = kodi::vfs::GetFileMD5(filename); -/// fprintf(stderr, "MD5 of file '%s' is %s\n", md5.c_str(), filename.c_str()); -/// } -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetFileMD5(const std::string& path) + +inline std::string GetFileMD5(const std::string& path) { - using namespace kodi::addon; std::string strReturn; - char* strMd5 = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_md5( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + char* strMd5 = kodi::dl::api.kodi_vfs_get_file_md5(path.c_str()); if (strMd5 != nullptr) { if (std::strlen(strMd5)) strReturn = strMd5; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, strMd5); + free(strMd5); } return strReturn; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Returns a thumb cache filename. -/// -/// @param[in] filename Path to file -/// @return Cache filename -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// ... -/// std::string thumb; -/// std::string filename; -/// if (kodi::gui::DialogFileBrowser::ShowAndGetFile("local", "*.avi|*.mpg|*.mp4", -/// "Test File selection to get Thumnail", -/// filename)) -/// { -/// thumb = kodi::vfs::GetCacheThumbName(filename); -/// fprintf(stderr, "Thumb name of file '%s' is %s\n", thumb.c_str(), filename.c_str()); -/// } -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetCacheThumbName(const std::string& filename) -{ - using namespace kodi::addon; +inline std::string GetCacheThumbName(const std::string& filename) +{ std::string strReturn; - char* strThumbName = CAddonBase::m_interface->toKodi->kodi_filesystem->get_cache_thumb_name( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str()); + char* strThumbName = kodi::dl::api.kodi_vfs_get_cache_thumb_name(filename.c_str()); if (strThumbName != nullptr) { if (std::strlen(strThumbName)) strReturn = strThumbName; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - strThumbName); + free(strThumbName); } return strReturn; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Make filename valid. -/// -/// Function to replace not valid characters with '_'. It can be also -/// compared with original before in a own loop until it is equal -/// (no invalid characters). -/// -/// @param[in] filename Filename to check and fix -/// @return The legal filename -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string fileName = "///\\jk???lj????.mpg"; -/// std::string legalName = kodi::vfs::MakeLegalFileName(fileName); -/// fprintf(stderr, "Legal name of '%s' is '%s'\n", fileName.c_str(), legalName.c_str()); -/// -/// /* Returns as legal: 'jk___lj____.mpg' */ -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN MakeLegalFileName(const std::string& filename) -{ - using namespace kodi::addon; +inline std::string MakeLegalFileName(const std::string& filename) +{ std::string strReturn; - char* strLegalFileName = CAddonBase::m_interface->toKodi->kodi_filesystem->make_legal_filename( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str()); + char* strLegalFileName = kodi::dl::api.kodi_vfs_make_legal_filename(filename.c_str()); if (strLegalFileName != nullptr) { if (std::strlen(strLegalFileName)) strReturn = strLegalFileName; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - strLegalFileName); + free(strLegalFileName); } return strReturn; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Make directory name valid. -/// -/// Function to replace not valid characters with '_'. It can be also -/// compared with original before in a own loop until it is equal -/// (no invalid characters). -/// -/// @param[in] path Directory name to check and fix -/// @return The legal directory name -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string path = "///\\jk???lj????\\hgjkg"; -/// std::string legalPath = kodi::vfs::MakeLegalPath(path); -/// fprintf(stderr, "Legal name of '%s' is '%s'\n", path.c_str(), legalPath.c_str()); -/// -/// /* Returns as legal: '/jk___lj____/hgjkg' */ -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN MakeLegalPath(const std::string& path) -{ - using namespace kodi::addon; +inline std::string MakeLegalPath(const std::string& path) +{ std::string strReturn; - char* strLegalPath = CAddonBase::m_interface->toKodi->kodi_filesystem->make_legal_path( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + char* strLegalPath = kodi::dl::api.kodi_vfs_make_legal_path(path.c_str()); if (strLegalPath != nullptr) { if (std::strlen(strLegalPath)) strReturn = strLegalPath; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - strLegalPath); + free(strLegalPath); } return strReturn; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Returns the translated path. -/// -/// @param[in] source String or unicode - Path to format -/// @return A human-readable string suitable for logging -/// -/// @note Only useful if you are coding for both Linux and Windows. e.g. -/// Converts 'special://masterprofile/script_data' -> -/// '/home/user/.kodi/UserData/script_data' on Linux. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string path = kodi::vfs::TranslateSpecialProtocol("special://masterprofile/script_data"); -/// fprintf(stderr, "Translated path is: %s\n", path.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// or -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// fprintf(stderr, "Directory 'special://temp' is '%s'\n", kodi::vfs::TranslateSpecialProtocol("special://temp").c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN TranslateSpecialProtocol(const std::string& source) -{ - using namespace kodi::addon; +inline std::string TranslateSpecialProtocol(const std::string& source) +{ std::string strReturn; - char* protocol = CAddonBase::m_interface->toKodi->kodi_filesystem->translate_special_protocol( - CAddonBase::m_interface->toKodi->kodiBase, source.c_str()); + char* protocol = kodi::dl::api.kodi_vfs_translate_special_protocol(source.c_str()); if (protocol != nullptr) { if (std::strlen(protocol)) strReturn = protocol; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - protocol); + free(protocol); } return strReturn; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Retrieves information about the amount of space that is available on -/// a disk volume. -/// -/// Path can be also with Kodi's special protocol. -/// -/// @param[in] path Path for where to check -/// @param[out] capacity The total number of bytes in the file system -/// @param[out] free The total number of free bytes in the file system -/// @param[out] available The total number of free bytes available to a -/// non-privileged process -/// @return true if successfully done and set -/// -/// @warning This only works with paths belonging to OS. If "special://" -/// is used, it must point to a place on your own OS. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include // for ULLONG_MAX -/// #include -/// ... -/// std::string path = "special://temp"; -/// uint64_t capacity = ULLONG_MAX; -/// uint64_t free = ULLONG_MAX; -/// uint64_t available = ULLONG_MAX; -/// kodi::vfs::GetDiskSpace(path, capacity, free, available); -/// fprintf(stderr, "Path '%s' sizes:\n", path.c_str()); -/// fprintf(stderr, " - capacity: %lu MByte\n", capacity / 1024 / 1024); -/// fprintf(stderr, " - free: %lu MByte\n", free / 1024 / 1024); -/// fprintf(stderr, " - available: %lu MByte\n", available / 1024 / 1024); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetDiskSpace(const std::string& path, - uint64_t& capacity, - uint64_t& free, - uint64_t& available) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_disk_space( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), &capacity, &free, &available); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Return the file name from given complate path string. -/// -/// @param[in] path The complete path include file and directory -/// @return Filename from path -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string fileName = kodi::vfs::GetFileName("special://temp/kodi.log"); -/// fprintf(stderr, "File name is '%s'\n", fileName.c_str()); -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetFileName(const std::string& path) +// inline bool GetDiskSpace(const std::string& path, +// uint64_t& capacity, +// uint64_t& free, +// uint64_t& available) +// { +// return kodi::dl::api.kodi_vfs_get_disk_space( +// path.c_str(), &capacity, &free, &available); +// } + +inline std::string GetFileName(const std::string& path) { /* find the last slash */ const size_t slash = path.find_last_of("/\\"); return path.substr(slash + 1); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Return the directory name from given complate path string. -/// -/// @param[in] path The complete path include file and directory -/// @return Directory name from path -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string dirName = kodi::vfs::GetDirectoryName("special://temp/kodi.log"); -/// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str()); -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetDirectoryName(const std::string& path) + +inline std::string GetDirectoryName(const std::string& path) { // Will from a full filename return the directory the file resides in. // Keeps the final slash at end and possible |option=foo options. @@ -1409,27 +428,8 @@ inline std::string ATTRIBUTE_HIDDEN GetDirectoryName(const std::string& path) return path.substr(0, iPosSlash + 1) + path.substr(iPosBar); // Path + options } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Remove the slash on given path name. -/// -/// @param[in,out] path The complete path -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string dirName = "special://temp/"; -/// kodi::vfs::RemoveSlashAtEnd(dirName); -/// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str()); -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN RemoveSlashAtEnd(std::string& path) + +inline void RemoveSlashAtEnd(std::string& path) { if (!path.empty()) { @@ -1438,529 +438,141 @@ inline void ATTRIBUTE_HIDDEN RemoveSlashAtEnd(std::string& path) path.erase(path.size() - 1); } } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Return a size aligned to the chunk size at least as large as the -/// chunk size. -/// -/// @param[in] chunk The chunk size -/// @param[in] minimum The minimum size (or maybe the minimum number of chunks?) -/// @return The aligned size -/// -inline unsigned int ATTRIBUTE_HIDDEN GetChunkSize(unsigned int chunk, unsigned int minimum) + +inline unsigned int GetChunkSize(unsigned int chunk, unsigned int minimum) { if (chunk) return chunk * ((minimum + chunk - 1) / chunk); else return minimum; } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Checks the given path contains a known internet protocol. -/// -/// About following protocols are the path checked: -/// | Protocol | Return true condition | Protocol | Return true condition -/// |----------|-----------------------|----------|----------------------- -/// | **dav** | strictCheck = true | **rtmps** | always -/// | **davs** | strictCheck = true | **rtmpt** | always -/// | **ftp** | strictCheck = true | **rtmpte** | always -/// | **ftps** | strictCheck = true | **rtp** | always -/// | **http** | always | **rtsp** | always -/// | **https**| always | **sdp** | always -/// | **mms** | always | **sftp** | strictCheck = true -/// | **mmsh** | always | **stack** | always -/// | **mmst** | always | **tcp** | always -/// | **rtmp** | always | **udp** | always -/// | **rtmpe**| always | | | -/// -/// @param[in] path To checked path/URL -/// @param[in] strictCheck [opt] If True the set of protocols used will be -/// extended to include ftp, ftps, dav, davs and sftp. -/// @return True if path is to a internet stream, false otherwise -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// // Check should return false -/// fprintf(stderr, "File name 1 is internet stream '%s' (should no)\n", -/// kodi::vfs::IsInternetStream("D:/my-file.mkv") ? "yes" : "no"); -/// -/// // Check should return true -/// fprintf(stderr, "File name 2 is internet stream '%s' (should yes)\n", -/// kodi::vfs::IsInternetStream("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4") ? "yes" : "no"); -/// -/// // Check should return false -/// fprintf(stderr, "File name 1 is internet stream '%s' (should no)\n", -/// kodi::vfs::IsInternetStream("ftp://do-somewhere.com/the-file.mkv") ? "yes" : "no", false); -/// -/// // Check should return true -/// fprintf(stderr, "File name 1 is internet stream '%s' (should yes)\n", -/// kodi::vfs::IsInternetStream("ftp://do-somewhere.com/the-file.mkv") ? "yes" : "no", true); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsInternetStream(const std::string& path, bool strictCheck = false) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->is_internet_stream( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), strictCheck); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Checks whether the specified path refers to a local network. -/// -/// In difference to @ref IsHostOnLAN() include this more deeper checks where -/// also handle Kodi's special protocol and stacks. -/// -/// @param[in] path To checked path -/// @return True if path is on LAN, false otherwise -/// -/// @note Check includes @ref IsHostOnLAN() too. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// // Check should return true -/// bool lan = kodi::vfs::IsOnLAN("smb://path/to/file"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsOnLAN(const std::string& path) +inline bool IsInternetStream(const std::string& path, bool strictCheck = false) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_filesystem->is_on_lan( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_internet_stream(path.c_str(), strictCheck); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Checks specified path for external network. -/// -/// @param[in] path To checked path -/// @return True if path is remote, false otherwise -/// -/// @note This does not apply to the local network. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// // Check should return true -/// bool remote = kodi::vfs::IsRemote("http://path/to/file"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsRemote(const std::string& path) -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_filesystem->is_remote( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Checks whether the given path refers to the own system. -/// -/// @param[in] path To checked path -/// @return True if path is local, false otherwise -/// -inline bool ATTRIBUTE_HIDDEN IsLocal(const std::string& path) +inline bool IsOnLAN(const std::string& path) { - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_filesystem->is_local( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_on_lan(path.c_str()); } -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_vfs_General -/// @brief Checks specified path is a regular URL, e.g. "someprotocol://path/to/file" -/// -/// @return True if file item is URL, false otherwise -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// -/// bool isURL; -/// // Check should return true -/// isURL = kodi::vfs::IsURL("someprotocol://path/to/file"); -/// -/// // Check should return false -/// isURL = kodi::vfs::IsURL("/path/to/file"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsURL(const std::string& path) + +inline bool IsRemote(const std::string& path) { - using namespace kodi::addon; + return kodi::dl::api.kodi_vfs_is_remote(path.c_str()); +} - return CAddonBase::m_interface->toKodi->kodi_filesystem->is_url( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str()); +inline bool IsLocal(const std::string& path) +{ + return kodi::dl::api.kodi_vfs_is_local(path.c_str()); } -//-------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_vfs_General -/// @brief To get HTTP header information. -/// -/// @param[in] url URL source of the data -/// @param[out] header The @ref cpp_kodi_vfs_Defs_HttpHeader -/// @return true if successfully done, otherwise false -/// -/// -/// ------------------------------------------------------------------------ -/// -/// @copydetails cpp_kodi_vfs_Defs_HttpHeader_Help -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi::vfs::HttpHeader header; -/// bool ret = kodi::vfs::GetHttpHeader(url, header); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetHttpHeader(const std::string& url, HttpHeader& header) + +inline bool IsURL(const std::string& path) { - using namespace ::kodi::addon; + return kodi::dl::api.kodi_vfs_is_url(path.c_str()); +} - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_http_header( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &header.m_handle); +inline bool GetHttpHeader(const std::string& url, HttpHeader& header) +{ + header.m_handle = kodi::dl::api.kodi_vfs_http_header_open(url.c_str()); + return header.m_handle != nullptr; } -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_vfs_General -/// @brief Get file mime type. -/// -/// @param[in] url URL source of the data -/// @param[out] mimeType the mime type of the URL -/// @param[in] useragent to be used when retrieving the MimeType [opt] -/// @return true if successfully done, otherwise false -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string mimeType;. -/// if (kodi::vfs::GetMimeType(url, mimeType)) -/// fprintf(stderr, "The mime type is '%s'\n", mimeType.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetMimeType(const std::string& url, + +inline bool GetMimeType(const std::string& url, std::string& mimeType, const std::string& useragent = "") { - using namespace ::kodi::addon; - char* cMimeType = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_mime_type( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cMimeType, useragent.c_str()); + bool ret = kodi::dl::api.kodi_vfs_get_mime_type(url.c_str(), &cMimeType, useragent.c_str()); if (cMimeType != nullptr) { mimeType = cMimeType; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - cMimeType); + free(cMimeType); } return ret; } -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_vfs_General -/// @brief Get file content-type. -/// -/// @param[in] url URL source of the data -/// @param[out] content The returned type -/// @param[in] useragent to be used when retrieving the MimeType [opt] -/// @return true if successfully done, otherwise false -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string content;. -/// if (kodi::vfs::GetContentType(url, content)) -/// fprintf(stderr, "The content type is '%s'\n", content.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetContentType(const std::string& url, + +inline bool GetContentType(const std::string& url, std::string& content, const std::string& useragent = "") { - using namespace ::kodi::addon; - char* cContent = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_content_type( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cContent, useragent.c_str()); + bool ret = kodi::dl::api.kodi_vfs_get_content_type(url.c_str(), &cContent, useragent.c_str()); if (cContent != nullptr) { content = cContent; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - cContent); + free( cContent); } return ret; } -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_vfs_General -/// @brief Get cookies stored by CURL in RFC 2109 format. -/// -/// @param[in] url URL source of the data -/// @param[out] cookies The text list of available cookies -/// @return true if successfully done, otherwise false -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string url = ""; -/// std::string cookies; -/// bool ret = kodi::vfs::GetCookies(url, cookies); -/// fprintf(stderr, "Cookies from URL '%s' are '%s' (return was %s)\n", -/// url.c_str(), cookies.c_str(), ret ? "true" : "false"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetCookies(const std::string& url, std::string& cookies) -{ - using namespace ::kodi::addon; +inline bool GetCookies(const std::string& url, std::string& cookies) +{ char* cCookies = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_filesystem->get_cookies( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str(), &cCookies); + bool ret = kodi::dl::api.kodi_vfs_get_cookies(url.c_str(), &cCookies); if (cCookies != nullptr) { cookies = cCookies; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - cCookies); + free(cCookies); } return ret; } -//---------------------------------------------------------------------------- - -//}}} - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" CFile class -//{{{ - -//============================================================================== -/// @defgroup cpp_kodi_vfs_CFile 4. class CFile -/// @ingroup cpp_kodi_vfs -/// -/// @brief **Creatable class for virtual file server control**\n -/// To perform file read/write with Kodi's filesystem parts. -/// -/// CFile is the class used for handling Files in Kodi. This class can be used -/// for creating, reading, writing and modifying files. It directly provides unbuffered, binary disk input/output services -/// -/// It has the header @ref Filesystem.h "#include " be included -/// to enjoy it. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// ... -/// -/// /* Create the needed file handle class */ -/// kodi::vfs::CFile myFile(); -/// -/// /* In this example we use the user path for the add-on */ -/// std::string file = kodi::GetUserPath() + "/myFile.txt"; -/// -/// /* Now create and open the file or overwrite if present */ -/// myFile.OpenFileForWrite(file, true); -/// -/// const char* str = "I love Kodi!"; -/// -/// /* write string */ -/// myFile.Write(str, sizeof(str)); -/// -/// /* On this way the Close() is not needed to call, becomes done from destructor */ -/// -/// ~~~~~~~~~~~~~ -/// -///@{ -class ATTRIBUTE_HIDDEN CFile + +class CFile { public: - //============================================================================ - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Construct a new, unopened file. - /// CFile() = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_vfs_CFile - /// @brief `Close()` is called from the destructor, so explicitly - /// closing the file isn't required. - /// virtual ~CFile() { Close(); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Open the file with filename via Kodi's @ref cpp_kodi_vfs_CFile - /// "CFile". Needs to be closed by calling Close() when done. - /// - /// @param[in] filename The filename to open. - /// @param[in] flags [opt] The flags to pass, see @ref OpenFileFlags - /// @return True on success or false on failure - /// bool OpenFile(const std::string& filename, unsigned int flags = 0) { - using namespace kodi::addon; - Close(); - m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), flags); + m_file = kodi::dl::api.kodi_vfs_file_open(filename.c_str(), flags); return m_file != nullptr; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Open the file with filename via Kodi's @ref cpp_kodi_vfs_CFile - /// "CFile" in write mode. Needs to be closed by calling Close() when - /// done. - /// - /// @note Related folders becomes created if not present. - /// - /// @param[in] filename The filename to open. - /// @param[in] overwrite True to overwrite, false otherwise. - /// @return True on success or false on failure - /// bool OpenFileForWrite(const std::string& filename, bool overwrite = false) { - using namespace kodi::addon; - Close(); // Try to open the file. If it fails, check if we need to create the directory first // This way we avoid checking if the directory exists every time - m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file_for_write( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), overwrite); + m_file = kodi::dl::api.kodi_vfs_file_open_for_write( + filename.c_str(), overwrite); if (!m_file) { std::string cacheDirectory = kodi::vfs::GetDirectoryName(filename); - if (CAddonBase::m_interface->toKodi->kodi_filesystem->directory_exists( - CAddonBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str()) || - CAddonBase::m_interface->toKodi->kodi_filesystem->create_directory( - CAddonBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str())) - m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->open_file_for_write( - CAddonBase::m_interface->toKodi->kodiBase, filename.c_str(), overwrite); + if (kodi::dl::api.kodi_vfs_directory_exists(cacheDirectory.c_str()) || + kodi::dl::api.kodi_vfs_create_directory(cacheDirectory.c_str())) + m_file = kodi::dl::api.kodi_vfs_file_open_for_write(filename.c_str(), overwrite); } return m_file != nullptr; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Check file is opened. - /// - /// @return True on open or false on closed or failure - /// bool IsOpen() const { return m_file != nullptr; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Close an open file. - /// void Close() { - using namespace kodi::addon; - if (!m_file) return; - CAddonBase::m_interface->toKodi->kodi_filesystem->close_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + kodi::dl::api.kodi_vfs_file_close(m_file); m_file = nullptr; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Create a Curl representation - /// - /// @param[in] url The URL of the Type. - /// @return True on success or false on failure - /// bool CURLCreate(const std::string& url) { - using namespace kodi::addon; - - m_file = CAddonBase::m_interface->toKodi->kodi_filesystem->curl_create( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str()); + m_file = kodi::dl::api.kodi_vfs_file_curl_create(url.c_str()); return m_file != nullptr; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Add options to the curl file created with CURLCreate. - /// - /// @param[in] type Option type to set, see @ref CURLOptiontype - /// @param[in] name Name of the option - /// @param[in] value Value of the option - /// @return True on success or false on failure - /// bool CURLAddOption(CURLOptiontype type, const std::string& name, const std::string& value) { - using namespace kodi::addon; - if (!m_file) { - kodi::Log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!"); + kodi_log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!"); return false; } - return CAddonBase::m_interface->toKodi->kodi_filesystem->curl_add_option( - CAddonBase::m_interface->toKodi->kodiBase, m_file, type, name.c_str(), value.c_str()); + return kodi::dl::api.kodi_vfs_file_curl_add_option(m_file, type, name.c_str(), value.c_str()); } //-------------------------------------------------------------------------- @@ -1973,51 +585,23 @@ class ATTRIBUTE_HIDDEN CFile /// bool CURLOpen(unsigned int flags = 0) { - using namespace kodi::addon; - if (!m_file) { - kodi::Log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!"); + kodi_log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before!"); return false; } - return CAddonBase::m_interface->toKodi->kodi_filesystem->curl_open( - CAddonBase::m_interface->toKodi->kodiBase, m_file, flags); + return kodi::dl::api.kodi_vfs_file_curl_open(m_file, flags); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Read from an open file. - /// - /// @param[in] ptr The buffer to store the data in. - /// @param[in] size The size of the buffer. - /// @return number of successfully read bytes if any bytes were read and - /// stored in buffer, zero if no bytes are available to read (end of - /// file was reached) or undetectable error occur, -1 in case of any - /// explicit error - /// - ssize_t Read(void* ptr, size_t size) + ssize_t Read(uint8_t* ptr, size_t size) { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->read_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file, ptr, size); + return kodi::dl::api.kodi_vfs_file_read(m_file, ptr, size); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Read a string from an open file. - /// - /// @param[out] line The buffer to store the data in. - /// @return True when a line was read, false otherwise. - /// bool ReadLine(std::string& line) { - using namespace kodi::addon; - line.clear(); if (!m_file) return false; @@ -2025,269 +609,101 @@ class ATTRIBUTE_HIDDEN CFile // chars, we didn't hit a newline. Otherwise, if file position is 1 or 2 // past the number of bytes read, we read (and skipped) a newline sequence. char buffer[1025]; - if (CAddonBase::m_interface->toKodi->kodi_filesystem->read_file_string( - CAddonBase::m_interface->toKodi->kodiBase, m_file, buffer, sizeof(buffer))) + if (kodi::dl::api.kodi_vfs_file_read_line(m_file, buffer, sizeof(buffer))) { line = buffer; return !line.empty(); } return false; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Write to a file opened in write mode. - /// - /// @param[in] ptr Pointer to the data to write, converted to a `const void*`. - /// @param[in] size Size of the data to write. - /// @return number of successfully written bytes if any bytes were written, - /// zero if no bytes were written and no detectable error occur,-1 - /// in case of any explicit error - /// - ssize_t Write(const void* ptr, size_t size) + ssize_t Write(const uint8_t* ptr, size_t size) { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->write_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file, ptr, size); + return kodi::dl::api.kodi_vfs_file_write(m_file, ptr, size); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Flush buffered data. - /// - /// If the given stream was open for writing (or if it was open for updating - /// and the last i/o operation was an output operation) any unwritten data - /// in its output buffer is written to the file. - /// - /// The stream remains open after this call. - /// - /// When a file is closed, either because of a call to close or because the - /// class is destructed, all the buffers associated with it are - /// automatically flushed. - /// void Flush() { - using namespace kodi::addon; - if (!m_file) return; - CAddonBase::m_interface->toKodi->kodi_filesystem->flush_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + kodi::dl::api.kodi_vfs_file_flush(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Set the file's current position. - /// - /// The whence argument is optional and defaults to SEEK_SET (0) - /// - /// @param[in] position the position that you want to seek to - /// @param[in] whence [optional] offset relative to You can set the value of - /// whence to one of three things: - /// | Value | int | Description | - /// |:--------:|:---:|:----------------------------------------------------| - /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// - /// @return Returns the resulting offset location as measured in bytes from - /// the beginning of the file. On error, the value -1 is returned. - /// int64_t Seek(int64_t position, int whence = SEEK_SET) { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->seek_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file, position, whence); + return kodi::dl::api.kodi_vfs_file_seek(m_file, position, whence); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Truncate a file to the requested size. - /// - /// @param[in] size The new max size. - /// @return New size? On error, the value -1 is returned. - /// int Truncate(int64_t size) { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->truncate_file( - CAddonBase::m_interface->toKodi->kodiBase, m_file, size); + return kodi::dl::api.kodi_vfs_file_truncate(m_file, size); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief The current offset in an open file. - /// - /// @return The requested offset. On error, the value -1 is returned. - /// int64_t GetPosition() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_position( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_position(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Get the file size of an open file. - /// - /// @return The requested size. On error, the value -1 is returned. - /// int64_t GetLength() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_length( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_length(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Checks the file access is on end position. - /// - /// @return If you've reached the end of the file, AtEnd() returns true. - /// bool AtEnd() const { - using namespace kodi::addon; - - if (!m_file) - return true; - int64_t length = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_length( - CAddonBase::m_interface->toKodi->kodiBase, m_file); - int64_t position = CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_position( - CAddonBase::m_interface->toKodi->kodiBase, m_file); - return position >= length; + return kodi::dl::api.kodi_vfs_file_at_end(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Get the chunk size for an open file. - /// - /// @return The requested size. On error, the value -1 is returned. - /// int GetChunkSize() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_chunk_size( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_chunk_size(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief To check seek possible on current stream by file. - /// - /// @return true if seek possible, false if not - /// bool IoControlGetSeekPossible() const { - using namespace kodi::addon; - if (!m_file) return false; - return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_get_seek_possible( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_io_ctl_get_seek_possible(m_file); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief To check a running stream on file for state of his cache. - /// - /// @param[in] status Information about current cache status - /// @return true if successfull done, false otherwise - /// - /// - /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help - /// bool IoControlGetCacheStatus(CacheStatus& status) const { - using namespace kodi::addon; - if (!m_file) return false; - return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_get_cache_status( - CAddonBase::m_interface->toKodi->kodiBase, m_file, status); + return kodi::dl::api.kodi_vfs_file_io_ctl_get_cache_status(m_file, status); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Unsigned int with speed limit for caching in bytes per second. - /// - /// @param[in] rate Cache rate size to use - /// @return true if successfull done, false otherwise - /// bool IoControlSetCacheRate(unsigned int rate) { - using namespace kodi::addon; - if (!m_file) return false; - return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_set_cache_rate( - CAddonBase::m_interface->toKodi->kodiBase, m_file, rate); + return kodi::dl::api.kodi_vfs_file_io_ctl_set_cache_rate(m_file, rate); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Enable/disable retry within the protocol handler (if supported). - /// - /// @param[in] retry To set the retry, true for use, false for not - /// @return true if successfull done, false otherwise - /// bool IoControlSetRetry(bool retry) { - using namespace kodi::addon; - if (!m_file) return false; - return CAddonBase::m_interface->toKodi->kodi_filesystem->io_control_set_retry( - CAddonBase::m_interface->toKodi->kodiBase, m_file, retry); + return kodi::dl::api.kodi_vfs_file_io_ctl_set_retry(m_file, retry); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Retrieve a file property. - /// - /// @param[in] type The type of the file property to retrieve the value for - /// @param[in] name The name of a named property value (e.g. Header) - /// @return value of requested property, empty on failure / non-existance - /// const std::string GetPropertyValue(FilePropertyTypes type, const std::string& name) const { - using namespace kodi::addon; - if (!m_file) { - kodi::Log(ADDON_LOG_ERROR, + kodi_log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before GetPropertyValue!"); return ""; } @@ -2298,70 +714,46 @@ class ATTRIBUTE_HIDDEN CFile } return values[0]; } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Retrieve file property values. - /// - /// @param[in] type The type of the file property values to retrieve the value for - /// @param[in] name The name of the named property (e.g. Header) - /// @return values of requested property, empty vector on failure / non-existance - /// const std::vector GetPropertyValues(FilePropertyTypes type, const std::string& name) const { - using namespace kodi::addon; - if (!m_file) { - kodi::Log(ADDON_LOG_ERROR, + kodi_log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before GetPropertyValues!"); return std::vector(); } - int numValues = 0; - char** res(CAddonBase::m_interface->toKodi->kodi_filesystem->get_property_values( - CAddonBase::m_interface->toKodi->kodiBase, m_file, type, name.c_str(), &numValues)); + size_t numValues = 0; + char** res(kodi::dl::api.kodi_vfs_file_get_property_values( + m_file, type, name.c_str(), &numValues)); if (res) { std::vector vecReturn; vecReturn.reserve(numValues); - for (int i = 0; i < numValues; ++i) + for (size_t i = 0; i < numValues; ++i) { vecReturn.emplace_back(res[i]); + free(res[i]); } - CAddonBase::m_interface->toKodi->free_string_array(CAddonBase::m_interface->toKodi->kodiBase, - res, numValues); + + free(res); + return vecReturn; } return std::vector(); } - //-------------------------------------------------------------------------- - //========================================================================== - /// @ingroup cpp_kodi_vfs_CFile - /// @brief Get the current download speed of file if loaded from web. - /// - /// @return The current download speed. - /// double GetFileDownloadSpeed() const { - using namespace kodi::addon; - if (!m_file) return 0.0; - return CAddonBase::m_interface->toKodi->kodi_filesystem->get_file_download_speed( - CAddonBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_download_speed(m_file); } - //-------------------------------------------------------------------------- private: - void* m_file = nullptr; + KODI_FILE_HDL m_file = nullptr; }; -///@} -//------------------------------------------------------------------------------ - -//}}} } /* namespace vfs */ } /* namespace kodi */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/General.h index ab9452b282a03..b599c29f98b98 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/General.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/General.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2018 Team Kodi + * Copyright (C) 2005-2021 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -12,823 +12,53 @@ #include "c-api/general.h" #include "tools/StringUtils.h" -#ifdef __cplusplus - -//============================================================================== -/// \ingroup cpp_kodi_Defs -/// @brief For kodi::Version used structure -/// -typedef struct kodi_version_t -{ - /// Application name, normally 'Kodi' - std::string compile_name; - /// Major code version of Kodi - int major; - /// Minor code version of Kodi - int minor; - /// The Revision contains a id and the build date, e.g. 20170706-c6b22fe217-dirty - std::string revision; - /// The version canditate e.g. alpha, beta or release - std::string tag; - /// The revision of tag before - std::string tag_revision; -} kodi_version_t; -//------------------------------------------------------------------------------ +#include namespace kodi { -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Returns the value of an addon property as a string -/// -/// @param[in] id id of the property that the module needs to access -/// | | Choices are | | -/// |:------------:|:------------:|:------------:| -/// | author | icon | stars | -/// | changelog | id | summary | -/// | description | name | type | -/// | disclaimer | path | version | -/// | fanart | profile | | -/// -/// @return AddOn property as a string -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string addonName = kodi::GetAddonInfo("name"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetAddonInfo(const std::string& id) -{ - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - - std::string strReturn; - char* strMsg = toKodi->kodi->get_addon_info(toKodi->kodiBase, id.c_str()); - if (strMsg != nullptr) - { - if (std::strlen(strMsg)) - strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); - } - return strReturn; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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::OpenSettings(); -/// .. -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN OpenSettings() -{ - using namespace kodi::addon; - return CAddonBase::m_interface->toKodi->kodi->open_settings_dialog( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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 (default is -/// empty) -/// @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 -/// ./resources/language/resource.language.??_??/strings.po -/// All other strings are from Kodi core language files. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string str = kodi::GetLocalizedString(30005, "Use me as default"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetLocalizedString(uint32_t labelId, - const std::string& defaultStr = "") -{ - using namespace kodi::addon; - - std::string retString = defaultStr; - char* strMsg = CAddonBase::m_interface->toKodi->kodi->get_localized_string( - CAddonBase::m_interface->toKodi->kodiBase, labelId); - if (strMsg != nullptr) - { - if (std::strlen(strMsg)) - retString = strMsg; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, strMsg); - } - return retString; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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 (default is false) -/// @return true if OK -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string ret; -/// if (!kodi::UnknownToUTF8("test string", ret, true)) -/// fprintf(stderr, "Translation to UTF8 failed!\n"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN UnknownToUTF8(const std::string& stringSrc, - std::string& utf8StringDst, - bool failOnBadChar = false) -{ - using namespace kodi::addon; - - bool ret = false; - char* retString = CAddonBase::m_interface->toKodi->kodi->unknown_to_utf8( - CAddonBase::m_interface->toKodi->kodiBase, stringSrc.c_str(), &ret, failOnBadChar); - if (retString != nullptr) - { - if (ret) - utf8StringDst = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); - } - return ret; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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 (default is false) -/// @return active language -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string language = kodi::GetLanguage(LANG_FMT_ISO_639_1, false); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME, - bool region = false) +inline void QueueFormattedNotification(QueueMsg type, const char* format, ...) { - using namespace kodi::addon; - - std::string language; - char* retString = CAddonBase::m_interface->toKodi->kodi->get_language( - CAddonBase::m_interface->toKodi->kodiBase, format, region); - if (retString != nullptr) - { - if (std::strlen(retString)) - language = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); - } - return language; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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 | | | | | -/// Note: 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::QueueFormattedNotification(QUEUE_WARNING, "I'm want to inform you, here with a test call to show '%s'", "this"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN QueueFormattedNotification(QueueMsg type, const char* format, ...) -{ - using namespace kodi::addon; - va_list args; va_start(args, format); const std::string str = kodi::tools::StringUtils::FormatV(format, args); va_end(args); - CAddonBase::m_interface->toKodi->kodi->queue_notification( - CAddonBase::m_interface->toKodi->kodiBase, type, "", str.c_str(), "", 5000, false, 1000); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \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 (default 5 sec) (to use must be type set to QUEUE_OWN_STYLE) -/// @param[in] withSound [opt] if true also warning sound becomes played (default with sound) (to use must be type set to QUEUE_OWN_STYLE) -/// @param[in] messageTime [opt] how many milli seconds start show of notification (default 1 sec) (to use must be type set to QUEUE_OWN_STYLE) -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi::QueueNotification(QUEUE_OWN_STYLE, "I'm want to inform you", "Here with a test call", "", 3000, false, 1000); -/// ... -/// ~~~~~~~~~~~~~ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi::QueueNotification(QUEUE_WARNING, "I'm want to inform you", "Here with a test call"); -/// ... -/// ~~~~~~~~~~~~~ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi::QueueNotification(QUEUE_OWN_STYLE, "", "Here with a test call", "./myImage.png"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN 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) -{ - using namespace kodi::addon; - - CAddonBase::m_interface->toKodi->kodi->queue_notification( - CAddonBase::m_interface->toKodi->kodiBase, type, header.c_str(), message.c_str(), - imageFile.c_str(), displayTime, withSound, messageTime); -} -//------------------------------------------------------------------------------ - -//============================================================================ -/// \ingroup cpp_kodi -/// @brief Get the MD5 digest of the given text -/// -/// @param[in] text text to compute the MD5 for -/// @return Returned MD5 digest -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string md5 = kodi::GetMD5("Make me as md5"); -/// fprintf(stderr, "My md5 digest is: '%s'\n", md5.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetMD5(const std::string& text) -{ - using namespace kodi::addon; - - char* md5ret = static_cast(malloc(40 * sizeof(char))); // md5 size normally 32 bytes - CAddonBase::m_interface->toKodi->kodi->get_md5(CAddonBase::m_interface->toKodi->kodiBase, - text.c_str(), md5ret); - std::string md5 = md5ret; - free(md5ret); - return md5; -} -//---------------------------------------------------------------------------- - -//============================================================================== -/// \ingroup cpp_kodi -/// @brief To get a temporary path for the addon -/// -/// This gives a temporary path which the addon can use individually for its things. -/// -/// The content of this folder will be deleted when Kodi is finished! -/// -/// @param[in] append A string to append to returned temporary path -/// @return Individual path for the addon -/// -inline std::string ATTRIBUTE_HIDDEN GetTempAddonPath(const std::string& append = "") -{ - using namespace kodi::addon; - - char* str = CAddonBase::m_interface->toKodi->kodi->get_temp_path( - CAddonBase::m_interface->toKodi->kodiBase); - std::string ret = str; - CAddonBase::m_interface->toKodi->free_string(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; + kodi::dl::api.kodi_queue_notification(type, "", str.c_str(), "", 5000, false, 1000); } -//------------------------------------------------------------------------------ -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Returns your regions setting as a string for the specified id -/// -/// @param[in] id id of setting to return -/// | | Choices are | | -/// |:------------:|:------------:|:------------:| -/// | dateshort | time | tempunit | -/// | datelong | meridiem | speedunit | -/// -/// @return settings string -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string timeFormat = kodi::GetRegion("time"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetRegion(const std::string& id) +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) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - - std::string strReturn; - char* strMsg = toKodi->kodi->get_region(toKodi->kodiBase, id.c_str()); - if (strMsg != nullptr) - { - if (std::strlen(strMsg)) - strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); - } - return strReturn; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Returns the amount of free memory in MByte (or as bytes) as an long -/// integer -/// -/// @param[out] free free memory -/// @param[out] total total memory -/// @param[in] asBytes [opt] if set to true becomes returned as bytes, otherwise -/// as mega bytes -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// long freeMem; -/// long totalMem; -/// kodi::GetFreeMem(freeMem, totalMem); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN GetFreeMem(long& free, long& total, bool asBytes = false) -{ - using namespace kodi::addon; - - free = -1; - total = -1; - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - toKodi->kodi->get_free_mem(toKodi->kodiBase, &free, &total, asBytes); + kodi::dl::api.kodi_queue_notification(type, header.c_str(), message.c_str(), imageFile.c_str(), displayTime, + withSound, messageTime); } -//------------------------------------------------------------------------------ -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Returns the elapsed idle time in seconds as an integer -/// -/// @return idle time -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// int time = kodi::GetGlobalIdleTime(); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline int ATTRIBUTE_HIDDEN GetGlobalIdleTime() +inline std::string GetLocalizedString(uint32_t labelId, const std::string& defaultStr = "") { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - return toKodi->kodi->get_global_idle_time(toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Get the currently used skin identification name from Kodi -/// -/// @return The active skin id name as a string -/// -/// -/// @note This is not the full path like 'special://home/addons/MediaCenter', -/// but only 'MediaCenter'. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// .. -/// std::string skinid = kodi::GetCurrentSkinId(); -/// .. -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetCurrentSkinId() -{ - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - - std::string strReturn; - char* strMsg = toKodi->kodi->get_current_skin_id(toKodi->kodiBase); + std::string retString = defaultStr; + char* strMsg = kodi::dl::api.kodi_get_localized_string(labelId); if (strMsg != nullptr) { if (std::strlen(strMsg)) - strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); - } - return strReturn; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @brief To check another addon is available and usable inside Kodi. -/// -/// @param[in] id The wanted addon identification string to check -/// @param[out] version Version string of addon if **installed** inside Kodi -/// @param[out] enabled Set to true `true* if addon is enabled -/// @return Returns `true* if addon is installed -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// bool enabled = false; -/// std::string version; -/// bool ret = kodi::IsAddonAvailable("inputstream.adaptive", version, enabled); -/// fprintf(stderr, "Available inputstream.adaptive version '%s' and enabled '%s'\n", -/// ret ? version.c_str() : "not installed", enabled ? "yes" : "no"); -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsAddonAvailable(const std::string& id, - std::string& version, - bool& enabled) -{ - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - - char* cVersion = nullptr; - bool ret = toKodi->kodi->is_addon_avilable(toKodi->kodiBase, id.c_str(), &cVersion, &enabled); - if (cVersion) - { - version = cVersion; - toKodi->free_string(toKodi->kodiBase, cVersion); - } - return ret; -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// \ingroup cpp_kodi -/// @brief Get current Kodi informations and versions, returned data from the following -/// kodi_version_t version; kodi::KodiVersion(version); -/// is e.g.: -/// ~~~~~~~~~~~~~{.cpp} -/// version.compile_name = Kodi -/// version.major = 18 -/// version.minor = 0 -/// version.revision = 20170706-c6b22fe217-di -/// version.tag = alpha -/// version.tag_revision = 1 -/// ~~~~~~~~~~~~~ -/// -/// @param[out] version structure to store data from kodi -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// kodi_version_t version; -/// kodi::KodiVersion(version); -/// fprintf(stderr, -/// "kodi_version_t version;\n" -/// "kodi::KodiVersion(version);\n" -/// " - version.compile_name = %s\n" -/// " - version.major = %i\n" -/// " - version.minor = %i\n" -/// " - version.revision = %s\n" -/// " - version.tag = %s\n" -/// " - version.tag_revision = %s\n", -/// version.compile_name.c_str(), version.major, version.minor, -/// version.revision.c_str(), version.tag.c_str(), version.tag_revision.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline void ATTRIBUTE_HIDDEN KodiVersion(kodi_version_t& version) -{ - using namespace kodi::addon; - - char* compile_name = nullptr; - char* revision = nullptr; - char* tag = nullptr; - char* tag_revision = nullptr; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - toKodi->kodi->kodi_version(toKodi->kodiBase, &compile_name, &version.major, &version.minor, - &revision, &tag, &tag_revision); - if (compile_name != nullptr) - { - version.compile_name = compile_name; - toKodi->free_string(toKodi->kodiBase, compile_name); - } - if (revision != nullptr) - { - version.revision = revision; - toKodi->free_string(toKodi->kodiBase, revision); - } - if (tag != nullptr) - { - version.tag = tag; - toKodi->free_string(toKodi->kodiBase, tag); - } - if (tag_revision != nullptr) - { - version.tag_revision = tag_revision; - toKodi->free_string(toKodi->kodiBase, tag_revision); + retString = strMsg; + free(strMsg); } + return retString; } -//------------------------------------------------------------------------------ -//============================================================================== -/// \ingroup cpp_kodi -/// @brief To get keyboard layout characters -/// -/// This is used to get the keyboard layout currently used from Kodi by the -/// there set language. -/// -/// @param[in] modifierKey the key to define the needed layout (uppercase, symbols...) -/// @param[out] layout_name name of used layout -/// @param[out] layout list of selected keyboard layout -/// @return true if request successed -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string layout_name; -/// std::vector> layout; -/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout); -/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str()); -/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) -/// { -/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) -/// { -/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str()); -/// } -/// } -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN GetKeyboardLayout(int modifierKey, - std::string& layout_name, - std::vector>& layout) +inline void ATTR_DLL_LOCAL PlaySFX(const std::string& filename, bool use_cached) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - AddonKeyboardKeyTable c_layout; - char* c_layout_name = nullptr; - bool ret = - toKodi->kodi->get_keyboard_layout(toKodi->kodiBase, &c_layout_name, modifierKey, &c_layout); - if (ret) - { - if (c_layout_name) - { - layout_name = c_layout_name; - toKodi->free_string(toKodi->kodiBase, c_layout_name); - } - - layout.resize(STD_KB_BUTTONS_MAX_ROWS); - for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) - { - layout[row].resize(STD_KB_BUTTONS_PER_ROW); - for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) - { - char* button = c_layout.keys[row][column]; - if (button) - { - layout[row][column] = button; - toKodi->free_string(toKodi->kodiBase, button); - } - } - } - } - return ret; + kodi::dl::api.kodi_play_sfx(filename.c_str(), use_cached); } -//------------------------------------------------------------------------------ -//============================================================================== -/// \ingroup cpp_kodi -/// @brief To change keyboard layout characters -/// -/// This is used to change the keyboard layout currently used from Kodi -/// -/// @param[out] layout_name new name of used layout (input string not used!) -/// @return true if request successed -/// -/// @note @ref GetKeyboardLayout must be called afterwards. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string layout_name; -/// kodi::ChangeKeyboardLayout(layout_name); -/// -/// std::vector> layout; -/// kodi::GetKeyboardLayout(STD_KB_MODIFIER_KEY_SHIFT | STD_KB_MODIFIER_KEY_SYMBOL, layout_name, layout); -/// fprintf(stderr, "Layout: '%s'\n", layout_name.c_str()); -/// for (unsigned int row = 0; row < STD_KB_BUTTONS_MAX_ROWS; row++) -/// { -/// for (unsigned int column = 0; column < STD_KB_BUTTONS_PER_ROW; column++) -/// { -/// fprintf(stderr, " - Row: '%02i'; Column: '%02i'; Text: '%s'\n", row, column, layout[row][column].c_str()); -/// } -/// } -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN ChangeKeyboardLayout(std::string& layout_name) +inline void ATTR_DLL_LOCAL StopSFX() { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CAddonBase::m_interface->toKodi; - char* c_layout_name = nullptr; - bool ret = toKodi->kodi->change_keyboard_layout(toKodi->kodiBase, &c_layout_name); - if (c_layout_name) - { - layout_name = c_layout_name; - toKodi->free_string(toKodi->kodiBase, c_layout_name); - } - - return ret; + kodi::dl::api.kodi_stop_sfx(); } -//------------------------------------------------------------------------------ } /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/Monitor.h b/xbmc/addons/kodi-dev-kit/include/kodi/Monitor.h new file mode 100644 index 0000000000000..73ffcf88ad920 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/Monitor.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "AddonBase.h" +#include "c-api/monitor.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace monitor +{ + +inline bool ATTR_DLL_LOCAL WaitForAbort(double timeout) +{ + return kodi::dl::api.kodi_monitor_wait_for_abort(timeout); +} + +inline bool ATTR_DLL_LOCAL AbortRequested() +{ + return kodi::dl::api.kodi_monitor_abort_requested(); +} + +} /* namespace monitor */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/Network.h b/xbmc/addons/kodi-dev-kit/include/kodi/Network.h deleted file mode 100644 index 910385f9ac131..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/Network.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "AddonBase.h" -#include "c-api/network.h" - -#ifdef __cplusplus - -//============================================================================== -/// @defgroup cpp_kodi_network Interface - kodi::network -/// @ingroup cpp -/// @brief **Network functions**\n -/// The network module offers functions that allow you to control it. -/// -/// It has the header @ref Network.h "#include " be included -/// to enjoy it. -/// -//------------------------------------------------------------------------------ - -namespace kodi -{ -namespace network -{ - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief Send WakeOnLan magic packet. -/// -/// @param[in] mac Network address of the host to wake. -/// @return True if the magic packet was successfully sent, false otherwise. -/// -inline bool ATTRIBUTE_HIDDEN WakeOnLan(const std::string& mac) -{ - using namespace ::kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_network->wake_on_lan( - CAddonBase::m_interface->toKodi->kodiBase, mac.c_str()); -} -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief To the current own ip address as a string. -/// -/// @return Own system ip. -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string ipAddress = kodi::network::GetIPAddress(); -/// fprintf(stderr, "My IP is '%s'\n", ipAddress.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetIPAddress() -{ - using namespace ::kodi::addon; - - std::string ip; - char* string = CAddonBase::m_interface->toKodi->kodi_network->get_ip_address( - CAddonBase::m_interface->toKodi->kodiBase); - if (string != nullptr) - { - ip = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string); - } - return ip; -} -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief Return our hostname. -/// -/// @return String about hostname, empty in case of error -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string hostname = kodi::network::GetHostname(); -/// fprintf(stderr, "My hostname is '%s'\n", hostname.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline std::string ATTRIBUTE_HIDDEN GetHostname() -{ - using namespace ::kodi::addon; - - std::string ip; - char* string = CAddonBase::m_interface->toKodi->kodi_network->get_hostname( - CAddonBase::m_interface->toKodi->kodiBase); - if (string != nullptr) - { - ip = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string); - } - return ip; -} -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief Returns Kodi's HTTP UserAgent string. -/// -/// @return HTTP user agent -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.py} -/// .. -/// std::string agent = kodi::network::GetUserAgent() -/// .. -/// ~~~~~~~~~~~~~ -/// -/// example output: -/// Kodi/19.0-ALPHA1 (X11; Linux x86_64) Ubuntu/20.04 App_Bitness/64 Version/19.0-ALPHA1-Git:20200522-0076d136d3-dirty -/// -inline std::string ATTRIBUTE_HIDDEN GetUserAgent() -{ - using namespace ::kodi::addon; - - std::string agent; - char* string = CAddonBase::m_interface->toKodi->kodi_network->get_user_agent( - CAddonBase::m_interface->toKodi->kodiBase); - if (string != nullptr) - { - agent = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string); - } - return agent; -} -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief Check given name or ip address corresponds to localhost. -/// -/// @param[in] hostname Hostname to check -/// @return Return true if given name or ip address corresponds to localhost -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// if (kodi::network::IsLocalHost("127.0.0.1")) -/// fprintf(stderr, "Is localhost\n"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN IsLocalHost(const std::string& hostname) -{ - using namespace ::kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_network->is_local_host( - CAddonBase::m_interface->toKodi->kodiBase, hostname.c_str()); -} -//---------------------------------------------------------------------------- - -//============================================================================== -/// @ingroup cpp_kodi_network -/// @brief Checks whether the specified path refers to a local network. -/// -/// @param[in] hostname Hostname to check -/// @param[in] offLineCheck Check if in private range, see https://en.wikipedia.org/wiki/Private_network -/// @return True if host is on a LAN, false otherwise -/// -inline bool ATTRIBUTE_HIDDEN IsHostOnLAN(const std::string& hostname, bool offLineCheck = false) -{ - using namespace kodi::addon; - - return CAddonBase::m_interface->toKodi->kodi_network->is_host_on_lan( - CAddonBase::m_interface->toKodi->kodiBase, hostname.c_str(), offLineCheck); -} -//------------------------------------------------------------------------------ - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief URL encodes the given string -/// -/// This function converts the given input string to a URL encoded string and -/// returns that as a new allocated string. All input characters that are -/// not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" -/// version (%NN where NN is a two-digit hexadecimal number). -/// -/// @param[in] url The code of the message to get. -/// @return Encoded URL string -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string encodedUrl = kodi::network::URLEncode("François"); -/// fprintf(stderr, "Encoded URL is '%s'\n", encodedUrl.c_str()); -/// ... -/// ~~~~~~~~~~~~~ -/// For example, the string: François ,would be encoded as: Fran%C3%A7ois -/// -inline std::string ATTRIBUTE_HIDDEN URLEncode(const std::string& url) -{ - using namespace ::kodi::addon; - - std::string retString; - char* string = CAddonBase::m_interface->toKodi->kodi_network->url_encode( - CAddonBase::m_interface->toKodi->kodiBase, url.c_str()); - if (string != nullptr) - { - retString = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string); - } - return retString; -} -//---------------------------------------------------------------------------- - -//============================================================================ -/// @ingroup cpp_kodi_network -/// @brief Lookup URL in DNS cache -/// -/// This test will get DNS record for a domain. The DNS lookup is done directly -/// against the domain's authoritative name server, so changes to DNS Records -/// should show up instantly. By default, the DNS lookup tool will return an -/// IP address if you give it a name (e.g. www.example.com) -/// -/// @param[in] hostName The code of the message to get. -/// @param[out] ipAddress Returned address -/// @return true if successfull -/// -/// -/// ------------------------------------------------------------------------ -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// ... -/// std::string ipAddress; -/// bool ret = kodi::network::DNSLookup("www.google.com", ipAddress); -/// fprintf(stderr, "DNSLookup returned for www.google.com the IP '%s', call was %s\n", ipAddress.c_str(), ret ? "ok" : "failed"); -/// ... -/// ~~~~~~~~~~~~~ -/// -inline bool ATTRIBUTE_HIDDEN DNSLookup(const std::string& hostName, std::string& ipAddress) -{ - using namespace ::kodi::addon; - - bool ret = false; - char* string = CAddonBase::m_interface->toKodi->kodi_network->dns_lookup( - CAddonBase::m_interface->toKodi->kodiBase, hostName.c_str(), &ret); - if (string != nullptr) - { - ipAddress = string; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, string); - } - return ret; -} -//---------------------------------------------------------------------------- - -} /* namespace network */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h index 747225fb35df6..143569ab574af 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h @@ -10,9 +10,13 @@ #include "../AddonBase.h" #include "../AudioEngine.h" -#include "../c-api/addon-instance/audio_decoder.h" +#include "../c-api/addon-instance/audiodecoder.h" #ifdef __cplusplus + +#include +#include + namespace kodi { namespace addon @@ -34,16 +38,11 @@ class CInstanceAudioDecoder; /// @copydetails cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag_Help /// ///@{ -class AudioDecoderInfoTag : public CStructHdl +class ATTR_DLL_LOCAL AudioDecoderInfoTag { - /*! \cond PRIVATE */ - friend class CInstanceAudioDecoder; - /*! \endcond */ - public: /*! \cond PRIVATE */ - AudioDecoderInfoTag() { memset(m_cStructure, 0, sizeof(AUDIO_DECODER_INFO_TAG)); } - AudioDecoderInfoTag(const AudioDecoderInfoTag& tag) : CStructHdl(tag) {} + AudioDecoderInfoTag() = default; /*! \endcond */ /// @defgroup cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag_Help Value Help @@ -69,47 +68,36 @@ class AudioDecoderInfoTag : public CStructHdltitle, title.c_str(), sizeof(m_cStructure->title) - 1); - } + void SetTitle(const std::string& title) { m_title = title; } /// @brief Get title name - std::string GetTitle() const { return m_cStructure->title; } + std::string GetTitle() const { return m_title; } /// @brief Set artist name - void SetArtist(const std::string& artist) - { - strncpy(m_cStructure->artist, artist.c_str(), sizeof(m_cStructure->artist) - 1); - } + void SetArtist(const std::string& artist) { m_artist = artist; } /// @brief Get artist name - std::string GetArtist() const { return m_cStructure->artist; } + std::string GetArtist() const { return m_artist; } /// @brief Set album name - void SetAlbum(const std::string& album) - { - strncpy(m_cStructure->album, album.c_str(), sizeof(m_cStructure->album) - 1); - } + void SetAlbum(const std::string& album) { m_album = album; } /// @brief Set album name - std::string GetAlbum() const { return m_cStructure->album; } + std::string GetAlbum() const { return m_album; } /// @brief Set album artist name - void SetAlbumArtist(const std::string& albumArtist) - { - strncpy(m_cStructure->album_artist, albumArtist.c_str(), - sizeof(m_cStructure->album_artist) - 1); - } + void SetAlbumArtist(const std::string& albumArtist) { m_album_artist = albumArtist; } /// @brief Get album artist name - std::string GetAlbumArtist() const { return m_cStructure->album_artist; } + std::string GetAlbumArtist() const { return m_album_artist; } /// @brief Set the media type of the music item. /// @@ -121,109 +109,169 @@ class AudioDecoderInfoTag : public CStructHdlmedia_type, mediaType.c_str(), sizeof(m_cStructure->media_type) - 1); - } + void SetMediaType(const std::string& mediaType) { m_media_type = mediaType; } /// @brief Get the media type of the music item. - std::string GetMediaType() const { return m_cStructure->media_type; } + std::string GetMediaType() const { return m_media_type; } /// @brief Set genre name from music as string if present. - void SetGenre(const std::string& genre) - { - strncpy(m_cStructure->genre, genre.c_str(), sizeof(m_cStructure->genre) - 1); - } + void SetGenre(const std::string& genre) { m_genre = genre; } /// @brief Get genre name from music as string if present. - std::string GetGenre() const { return m_cStructure->genre; } + std::string GetGenre() const { return m_genre; } /// @brief Set the duration of music as integer from info. - void SetDuration(int duration) { m_cStructure->duration = duration; } + void SetDuration(int duration) { m_duration = duration; } /// @brief Get the duration of music as integer from info. - int GetDuration() const { return m_cStructure->duration; } + int GetDuration() const { return m_duration; } /// @brief Set track number (if present) from music info as integer. - void SetTrack(int track) { m_cStructure->track = track; } + void SetTrack(int track) { m_track = track; } /// @brief Get track number (if present). - int GetTrack() const { return m_cStructure->track; } + int GetTrack() const { return m_track; } /// @brief Set disk number (if present) from music info as integer. - void SetDisc(int disc) { m_cStructure->disc = disc; } + void SetDisc(int disc) { m_disc = disc; } /// @brief Get disk number (if present) - int GetDisc() const { return m_cStructure->disc; } + int GetDisc() const { return m_disc; } /// @brief Set disk subtitle name (if present) from music info. - void SetDiscSubtitle(const std::string& discSubtitle) - { - strncpy(m_cStructure->disc_subtitle, discSubtitle.c_str(), - sizeof(m_cStructure->disc_subtitle) - 1); - } + void SetDiscSubtitle(const std::string& discSubtitle) { m_disc_subtitle = discSubtitle; } /// @brief Get disk subtitle name (if present) from music info. - std::string GetDiscSubtitle() const { return m_cStructure->disc_subtitle; } + std::string GetDiscSubtitle() const { return m_disc_subtitle; } /// @brief Set disks amount quantity (if present) from music info as integer. - void SetDiscTotal(int discTotal) { m_cStructure->disc_total = discTotal; } + void SetDiscTotal(int discTotal) { m_disc_total = discTotal; } /// @brief Get disks amount quantity (if present) - int GetDiscTotal() const { return m_cStructure->disc_total; } + int GetDiscTotal() const { return m_disc_total; } /// @brief Set release date as string from music info (if present).\n /// [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) date YYYY, YYYY-MM or YYYY-MM-DD - void SetReleaseDate(const std::string& releaseDate) - { - strncpy(m_cStructure->release_date, releaseDate.c_str(), - sizeof(m_cStructure->release_date) - 1); - } + void SetReleaseDate(const std::string& releaseDate) { m_release_date = releaseDate; } /// @brief Get release date as string from music info (if present). - std::string GetReleaseDate() const { return m_cStructure->release_date; } + std::string GetReleaseDate() const { return m_release_date; } /// @brief Set string from lyrics. - void SetLyrics(const std::string& lyrics) - { - strncpy(m_cStructure->lyrics, lyrics.c_str(), sizeof(m_cStructure->lyrics) - 1); - } + void SetLyrics(const std::string& lyrics) { m_lyrics = lyrics; } /// @brief Get string from lyrics. - std::string GetLyrics() const { return m_cStructure->lyrics; } + std::string GetLyrics() const { return m_lyrics; } /// @brief Set related stream samplerate. - void SetSamplerate(int samplerate) { m_cStructure->samplerate = samplerate; } + void SetSamplerate(int samplerate) { m_samplerate = samplerate; } /// @brief Get related stream samplerate. - int GetSamplerate() const { return m_cStructure->samplerate; } + int GetSamplerate() const { return m_samplerate; } /// @brief Set related stream channels amount. - void SetChannels(int channels) { m_cStructure->channels = channels; } + void SetChannels(int channels) { m_channels = channels; } /// @brief Get related stream channels amount. - int GetChannels() const { return m_cStructure->channels; } + int GetChannels() const { return m_channels; } /// @brief Set related stream bitrate. - void SetBitrate(int bitrate) { m_cStructure->bitrate = bitrate; } + void SetBitrate(int bitrate) { m_bitrate = bitrate; } /// @brief Get related stream bitrate. - int GetBitrate() const { return m_cStructure->bitrate; } + int GetBitrate() const { return m_bitrate; } /// @brief Set additional information comment (if present). - void SetComment(const std::string& comment) + void SetComment(const std::string& comment) { m_comment = comment; } + + /// @brief Get additional information comment (if present). + std::string GetComment() const { return m_comment; } + + /// @brief Set cover art image by path. + /// + /// @param[in] path Image position path + /// + /// @note Cannot be combined with @ref SetCoverArtByMem and @ref GetCoverArtByMem. + void SetCoverArtByPath(const std::string& path) { m_cover_art_path = path; } + + /// @brief Get cover art image path. + /// + /// @return Image position path + /// + /// @note Only be available if set before by @ref SetCoverArtByPath. + /// Cannot be combined with @ref SetCoverArtByMem and @ref GetCoverArtByMem. + /// + std::string GetCoverArtByPath() const { return m_cover_art_path; } + + /// @brief Set cover art image by memory. + /// + /// @param[in] data Image data + /// @param[in] size Image data size + /// @param[in] mimetype Image format mimetype + /// Possible mimetypes: + /// - "image/jpeg" + /// - "image/png" + /// - "image/gif" + /// - "image/bmp" + /// + void SetCoverArtByMem(const uint8_t* data, size_t size, const std::string& mimetype) { - strncpy(m_cStructure->comment, comment.c_str(), sizeof(m_cStructure->comment) - 1); + if (size > 0) + { + m_cover_art_mem_mimetype = mimetype; + m_cover_art_mem.resize(size); + m_cover_art_mem.assign(data, data + size); + } } - /// @brief Get additional information comment (if present). - std::string GetComment() const { return m_cStructure->comment; } + /// @brief Get cover art data by memory. + /// + /// @param[out] size Stored size about art image + /// @param[in] mimetype Related image mimetype to stored data + /// @return Image data + /// + /// @note This only works if @ref SetCoverArtByMem was used before + /// + /// @warning This function is not thread safe and related data should never be + /// changed by @ref SetCoverArtByMem, if data from here is used without copy! + const uint8_t* GetCoverArtByMem(size_t& size, std::string& mimetype) const + { + if (!m_cover_art_mem.empty()) + { + mimetype = m_cover_art_mem_mimetype; + size = m_cover_art_mem.size(); + return m_cover_art_mem.data(); + } + else + { + size = 0; + return nullptr; + } + } ///@} private: - AudioDecoderInfoTag(const AUDIO_DECODER_INFO_TAG* tag) : CStructHdl(tag) {} - AudioDecoderInfoTag(AUDIO_DECODER_INFO_TAG* tag) : CStructHdl(tag) {} + std::string m_title; + std::string m_artist; + std::string m_album; + std::string m_album_artist; + std::string m_media_type; + std::string m_genre; + int m_duration{0}; + int m_track{0}; + int m_disc{0}; + std::string m_disc_subtitle; + int m_disc_total{0}; + std::string m_release_date; + std::string m_lyrics; + int m_samplerate{0}; + int m_channels{0}; + int m_bitrate{0}; + std::string m_comment; + std::string m_cover_art_path; + std::string m_cover_art_mem_mimetype; + std::vector m_cover_art_mem; }; ///@} //------------------------------------------------------------------------------ @@ -273,9 +321,16 @@ class AudioDecoderInfoTag : public CStructHdl +/// library_@PLATFORM@="@LIBRARY_FILENAME@"> +/// +/// +/// 30100 +/// resources/file_format_music_sound.png +/// +/// +/// +/// /// ///

My audio decoder addon addon /// My audio decoder addon description @@ -285,15 +340,15 @@ class AudioDecoderInfoTag : public CStructHdl`point` | Addon type specification
At all addon types and for this kind always "kodi.audiodecoder". -/// | `library_@PLATFORM@` | Sets the used library name, which is automatically set by cmake at addon build. -/// | `extension` | The file extensions / styles supported by this addon. -/// | `mimetype` | A stream URL mimetype where can be used to force to this addon. -/// | `name` | The name of the decoder used in Kodi for display. -/// | `tags` | Boolean to point out that addon can bring own information to replayed file, if `false` only the file name is used as info.
If `true`, @ref CInstanceAudioDecoder::ReadTag is used and must be implemented. -/// | `tracks` | Boolean to in inform one file can contains several different streams. +/// | Name | Description +/// |:------------------------------------------------------|---------------------------------------- +/// | `point` | Addon type specification
At all addon types and for this kind always "kodi.audiodecoder". +/// | `library_@PLATFORM@` | Sets the used library name, which is automatically set by cmake at addon build. +/// | `name` | The name of the decoder used in Kodi for display. +/// | `tags` | Boolean to point out that addon can bring own information to replayed file, if `false` only the file name is used as info.
If `true`, @ref CInstanceAudioDecoder::ReadTag is used and must be implemented. +/// | `tracks` | Boolean to in inform one file can contains several different streams. +/// | `` | The file extensions / styles supported by this addon.\nOptional can be with `` and ``additional info added where used for list views in Kodi. +/// | `` | A stream URL mimetype where can be used to force to this addon.\nOptional can be with ``` and ``additional info added where used for list views in Kodi. /// /// -------------------------------------------------------------------------- /// @@ -334,7 +389,7 @@ class AudioDecoderInfoTag : public CStructHdlglobalSingleInstance != nullptr) + if (CAddonBase::ifc.m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation of multiple together with single instance way is not allowed!"); SetAddonStruct(instance); } //-------------------------------------------------------------------------- + //========================================================================== + /// @ingroup cpp_kodi_addon_audiodecoder + /// @brief Checks addon support given file path. + /// + /// @param[in] filename The file to read + /// @return true if successfully done and supported, otherwise false + /// + /// @note Optional to add, as default becomes `true` used. + /// + virtual bool CanOperateFile(const std::string& filename) { return true; } + //-------------------------------------------------------------------------- + //========================================================================== /// @ingroup cpp_kodi_addon_audiodecoder /// @brief Initialize a decoder. @@ -471,14 +536,9 @@ class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance /// @param[in] buffer Output buffer /// @param[in] size Size of output buffer /// @param[out] actualsize Actual number of bytes written to output buffer - /// @return Return with following possible values: - /// | Value | Description - /// |:-----:|:------------ - /// | 0 | on success - /// | -1 | on end of stream - /// | 1 | on failure - /// - virtual int ReadPCM(uint8_t* buffer, int size, int& actualsize) = 0; + /// @return @copydetails cpp_kodi_addon_audiodecoder_Defs_AUDIODECODER_READ_RETURN + /// + virtual int ReadPCM(uint8_t* buffer, size_t size, size_t& actualsize) = 0; //-------------------------------------------------------------------------- //========================================================================== @@ -519,23 +579,70 @@ class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance virtual int TrackCount(const std::string& file) { return 1; } //-------------------------------------------------------------------------- + //========================================================================== + /// @ingroup cpp_kodi_addon_audiodecoder + /// @brief Static auxiliary function to read the track number used from the + /// given path. + /// + /// If track number is not found in file name, the originally given file + /// name is returned, track number then remains at "0". + /// + /// @param[in] name The value specified in addon.xml extension under `name="???"` + /// @param[in] trackPath The full path to evaluate + /// @param[out] track The track number read out in the path, 0 if not + /// identified as a track path. + /// @return Path to the associated file + /// + inline static std::string GetTrack(const std::string& name, + const std::string& trackPath, + int& track) + { + /* + * get the track name from path + */ + track = 0; + std::string toLoad(trackPath); + const std::string ext = "." + name + KODI_ADDON_AUDIODECODER_TRACK_EXT; + if (toLoad.find(ext) != std::string::npos) + { + size_t iStart = toLoad.rfind('-') + 1; + track = atoi(toLoad.substr(iStart, toLoad.size() - iStart - ext.size()).c_str()); + // The directory we are in, is the file + // that contains the bitstream to play, + // so extract it + size_t slash = trackPath.rfind('\\'); + if (slash == std::string::npos) + slash = trackPath.rfind('/'); + toLoad = trackPath.substr(0, slash); + } + + return toLoad; + } + //-------------------------------------------------------------------------- + private: - void SetAddonStruct(KODI_HANDLE instance) + void SetAddonStruct(KODI_HANDLE instance) override { if (instance == nullptr) throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation with empty addon structure not allowed, table must be given from Kodi!"); - m_instanceData = static_cast(instance); + KODI_INSTANCE_HDL* instanceKodi = static_cast(instance); + instanceKodi->type = ADDON_INSTANCE_AUDIODECODER; + instanceKodi->instance = this; + instanceKodi->audiodecoder->can_operate_file = ADDON_can_operate_file; + instanceKodi->audiodecoder->init = ADDON_init; + instanceKodi->audiodecoder->read_pcm = ADDON_read_pcm; + instanceKodi->audiodecoder->seek = ADDON_seek; + instanceKodi->audiodecoder->read_tag = ADDON_read_tag; + instanceKodi->audiodecoder->track_count = ADDON_track_count; + } - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->init = ADDON_Init; - m_instanceData->toAddon->read_pcm = ADDON_ReadPCM; - m_instanceData->toAddon->seek = ADDON_Seek; - m_instanceData->toAddon->read_tag = ADDON_ReadTag; - m_instanceData->toAddon->track_count = ADDON_TrackCount; + inline static bool ADDON_can_operate_file(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) + { + return static_cast(hdl)->CanOperateFile(file); } - inline static bool ADDON_Init(const AddonInstance_AudioDecoder* instance, + inline static bool ADDON_init(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, unsigned int filecache, int* channels, @@ -544,52 +651,87 @@ class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance int64_t* totaltime, int* bitrate, AudioEngineDataFormat* format, - const AudioEngineChannel** info) + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]) { - CInstanceAudioDecoder* thisClass = - static_cast(instance->toAddon->addonInstance); + CInstanceAudioDecoder* thisClass = static_cast(hdl); + + std::vector channelList; - thisClass->m_channelList.clear(); bool ret = thisClass->Init(file, filecache, *channels, *samplerate, *bitspersample, *totaltime, - *bitrate, *format, thisClass->m_channelList); - if (!thisClass->m_channelList.empty()) + *bitrate, *format, channelList); + if (!channelList.empty()) { - if (thisClass->m_channelList.back() != AUDIOENGINE_CH_NULL) - thisClass->m_channelList.push_back(AUDIOENGINE_CH_NULL); - *info = thisClass->m_channelList.data(); + if (channelList.back() != AUDIOENGINE_CH_NULL) + channelList.push_back(AUDIOENGINE_CH_NULL); + + for (unsigned int i = 0; i < channelList.size(); ++i) + { + info[i] = channelList[i]; + } } - else - *info = nullptr; return ret; } - inline static int ADDON_ReadPCM(const AddonInstance_AudioDecoder* instance, uint8_t* buffer, int size, int* actualsize) + inline static int ADDON_read_pcm(const KODI_ADDON_AUDIODECODER_HDL hdl, + uint8_t* buffer, + size_t size, + size_t* actualsize) { - return static_cast(instance->toAddon->addonInstance) - ->ReadPCM(buffer, size, *actualsize); + return static_cast(hdl)->ReadPCM(buffer, size, *actualsize); } - inline static int64_t ADDON_Seek(const AddonInstance_AudioDecoder* instance, int64_t time) + inline static int64_t ADDON_seek(const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time) { - return static_cast(instance->toAddon->addonInstance)->Seek(time); + return static_cast(hdl)->Seek(time); } - inline static bool ADDON_ReadTag(const AddonInstance_AudioDecoder* instance, - const char* file, - struct AUDIO_DECODER_INFO_TAG* tag) + inline static bool ADDON_read_tag(const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag) { - kodi::addon::AudioDecoderInfoTag cppTag(tag); - return static_cast(instance->toAddon->addonInstance) - ->ReadTag(file, cppTag); + kodi::addon::AudioDecoderInfoTag cppTag; + memset(tag, 0, sizeof(KODI_ADDON_AUDIODECODER_INFO_TAG)); + bool ret = static_cast(hdl)->ReadTag(file, cppTag); + if (ret) + { + tag->title = strdup(cppTag.GetTitle().c_str()); + tag->artist = strdup(cppTag.GetArtist().c_str()); + tag->album = strdup(cppTag.GetAlbum().c_str()); + tag->album_artist = strdup(cppTag.GetAlbumArtist().c_str()); + tag->media_type = strdup(cppTag.GetMediaType().c_str()); + tag->genre = strdup(cppTag.GetGenre().c_str()); + tag->duration = cppTag.GetDuration(); + tag->track = cppTag.GetTrack(); + tag->disc = cppTag.GetDisc(); + tag->disc_subtitle = strdup(cppTag.GetDiscSubtitle().c_str()); + tag->disc_total = cppTag.GetDiscTotal(); + tag->release_date = strdup(cppTag.GetReleaseDate().c_str()); + tag->lyrics = strdup(cppTag.GetLyrics().c_str()); + tag->samplerate = cppTag.GetSamplerate(); + tag->channels = cppTag.GetChannels(); + tag->bitrate = cppTag.GetBitrate(); + tag->comment = strdup(cppTag.GetComment().c_str()); + std::string mimetype; + size_t size = 0; + const uint8_t* mem = cppTag.GetCoverArtByMem(size, mimetype); + if (mem) + { +// tag->cover_art_mem_mimetype = strdup(mimetype.c_str()); +// tag->cover_art_mem_size = size; +// tag->cover_art_mem = static_cast(malloc(size)); + } + else + { + tag->cover_art_path = strdup(cppTag.GetCoverArtByPath().c_str()); + } + } + return ret; } - inline static int ADDON_TrackCount(const AddonInstance_AudioDecoder* instance, const char* file) + inline static int ADDON_track_count(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) { - return static_cast(instance->toAddon->addonInstance)->TrackCount(file); + return static_cast(hdl)->TrackCount(file); } - - std::vector m_channelList; - AddonInstance_AudioDecoder* m_instanceData; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h index 9a869c170590e..4b0b1bb233439 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h @@ -9,342 +9,217 @@ #pragma once #include "../AddonBase.h" -#include "../c-api/addon-instance/audio_encoder.h" +#include "../c-api/addon-instance/audioencoder.h" #ifdef __cplusplus + +#include + namespace kodi { namespace addon { -//============================================================================== -/// @addtogroup cpp_kodi_addon_audioencoder -/// @brief \cpp_class{ kodi::addon::CInstanceAudioEncoder } -/// **Audio encoder add-on instance.**\n -/// For audio encoders as binary add-ons. This class implements a way to handle -/// the encode of given stream to a new format. -/// -/// The addon.xml defines the capabilities of this add-on. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Here's an example on addon.xml:** -/// ~~~~~~~~~~~~~{.xml} -/// -/// ~~~~~~~~~~~~~ -/// -/// Description to audio encoder related addon.xml values: -/// | Name | Description -/// |:------------------------------|---------------------------------------- -/// | `point` | Addon type specification
At all addon types and for this kind always "kodi.audioencoder". -/// | `library_@PLATFORM@` | Sets the used library name, which is automatically set by cmake at addon build. -/// | `extension` | The file extensions / styles supported by this addon. -/// -/// -------------------------------------------------------------------------- -/// -/// -------------------------------------------------------------------------- -/// -/// **Here is a code example how this addon is used:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class ATTRIBUTE_HIDDEN CMyAudioEncoder : public kodi::addon::CInstanceAudioEncoder -/// { -/// public: -/// CMyAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion) -/// : kodi::addon::CInstanceAudioEncoder(instance, kodiVersion) -/// -/// bool Init(const std::string& filename, unsigned int filecache, -/// int& channels, int& samplerate, -/// int& bitspersample, int64_t& totaltime, -/// int& bitrate, AEDataFormat& format, -/// std::vector& channellist) override; -/// int Encode(int numBytesRead, const uint8_t* pbtStream) override; -/// bool Finish() override; // Optional -/// }; -/// -/// CMyAudioEncoder::CMyAudioEncoder(KODI_HANDLE instance) -/// : kodi::addon::CInstanceAudioEncoder(instance) -/// { -/// ... -/// } -/// -/// bool CMyAudioEncoder::Start(int inChannels, -/// int inRate, -/// int inBits, -/// const std::string& title, -/// const std::string& artist, -/// const std::string& albumartist, -/// const std::string& album, -/// const std::string& year, -/// const std::string& track, -/// const std::string& genre, -/// const std::string& comment, -/// int trackLength) -/// { -/// ... -/// return true; -/// } -/// -/// int CMyAudioEncoder::Encode(int numBytesRead, const uint8_t* pbtStream) -/// { -/// uint8_t* data = nullptr; -/// int length = 0; -/// ... -/// kodi::addon::CInstanceAudioEncoder::Write(data, length); -/// -/// return 0; -/// } -/// -/// -/// bool CMyAudioEncoder::Finish() -/// { -/// ... -/// return true; -/// } -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() = default; -/// ADDON_STATUS CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_AUDIOENCODER) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Creating my audio encoder instance"); -/// addonInstance = new CMyAudioEncoder(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyAudioEncoder` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -class ATTRIBUTE_HIDDEN CInstanceAudioEncoder : public IAddonInstance +class CInstanceAudioEncoder; + +class ATTR_DLL_LOCAL AudioEncoderInfoTag +{ +public: + AudioEncoderInfoTag() = default; + + void SetTitle(const std::string& title) + { + m_title = title; + } + const std::string& GetTitle() const { return m_title; } + + void SetArtist(const std::string& artist) + { + m_artist = artist; + } + const std::string& GetArtist() const { return m_artist; } + + void SetAlbum(const std::string& album) + { + m_album = album; + } + const std::string& GetAlbum() const { return m_album; } + + void SetAlbumArtist(const std::string& albumArtist) + { + m_album_artist = albumArtist; + } + const std::string& GetAlbumArtist() const { return m_album_artist; } + + void SetMediaType(const std::string& mediaType) + { + m_media_type = mediaType; + } + const std::string& GetMediaType() const { return m_media_type; } + + void SetGenre(const std::string& genre) + { + m_genre = genre; + } + const std::string& GetGenre() const { return m_genre; } + + void SetDuration(int duration) { m_duration = duration; } + int GetDuration() const { return m_duration; } + + void SetTrack(int track) { m_track = track; } + int GetTrack() const { return m_track; } + + void SetDisc(int disc) { m_disc = disc; } + int GetDisc() const { return m_disc; } + + void SetDiscSubtitle(const std::string& discSubtitle) + { + m_disc_subtitle = discSubtitle; + } + const std::string& GetDiscSubtitle() const { return m_disc_subtitle; } + + void SetDiscTotal(int discTotal) { m_disc_total = discTotal; } + int GetDiscTotal() const { return m_disc_total; } + + void SetReleaseDate(const std::string& releaseDate) + { + m_release_date = releaseDate; + } + const std::string& GetReleaseDate() const { return m_release_date; } + + void SetLyrics(const std::string& lyrics) + { + m_lyrics = lyrics; + } + const std::string& GetLyrics() const { return m_lyrics; } + + void SetSamplerate(int samplerate) { m_samplerate = samplerate; } + int GetSamplerate() const { return m_samplerate; } + + void SetChannels(int channels) { m_channels = channels; } + int GetChannels() const { return m_channels; } + + void SetBitsPerSample(int bits_per_sample) { m_bits_per_sample = bits_per_sample; } + int GetBitsPerSample() const { return m_bits_per_sample; } + + void SetTrackLength(int track_length) { m_track_length = track_length; } + int GetTrackLength() const { return m_track_length; } + + void SetComment(const std::string& comment) + { + m_comment = comment; + } + const std::string& GetComment() const { return m_comment; } + +private: + friend class CInstanceAudioEncoder; + + AudioEncoderInfoTag(const struct AUDIOENCODER_INFO_TAG* tag) + { + m_title = tag->title; + m_artist = tag->artist; + m_album = tag->album; + m_album_artist = tag->album_artist; + m_media_type = tag->media_type; + m_genre = tag->genre; + m_duration = tag->duration; + m_track = tag->track; + m_disc = tag->disc; + m_disc_subtitle = tag->artist; + m_disc_total = tag->disc_total; + m_release_date = tag->release_date; + m_lyrics = tag->lyrics; + m_samplerate = tag->samplerate; + m_channels = tag->channels; + m_bits_per_sample = tag->bits_per_sample; + m_track_length = tag->track_length; + m_comment = tag->comment; + } + + std::string m_title; + std::string m_artist; + std::string m_album; + std::string m_album_artist; + std::string m_media_type; + std::string m_genre; + int m_duration{0}; + int m_track{0}; + int m_disc{0}; + std::string m_disc_subtitle; + int m_disc_total{0}; + std::string m_release_date; + std::string m_lyrics; + int m_samplerate{0}; + int m_channels{0}; + int m_bits_per_sample{0}; + int m_track_length{0}; + std::string m_comment; +}; + +class ATTR_DLL_LOCAL CInstanceAudioEncoder : public IAddonInstance { public: - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Audio encoder class constructor used to support multiple instances. - /// - /// @param[in] instance The instance value given to - /// `kodi::addon::CAddonBase::CreateInstance(...)`. - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - /// @note Recommended to set `kodiVersion`. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// class CMyAudioEncoder : public kodi::addon::CInstanceAudioEncoder - /// { - /// public: - /// CMyAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion) - /// : kodi::addon::CInstanceAudioEncoder(instance, kodiVersion) - /// { - /// ... - /// } - /// - /// ... - /// }; - /// - /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, - /// const std::string& instanceID, - /// KODI_HANDLE instance, - /// const std::string& version, - /// KODI_HANDLE& addonInstance) - /// { - /// kodi::Log(ADDON_LOG_INFO, "Creating my audio encoder instance"); - /// addonInstance = new CMyAudioEncoder(instance, version); - /// return ADDON_STATUS_OK; - /// } - /// ~~~~~~~~~~~~~ - /// - explicit CInstanceAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_AUDIOENCODER, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_AUDIOENCODER)) + explicit CInstanceAudioEncoder(KODI_HANDLE instance) + : IAddonInstance(ADDON_INSTANCE_AUDIOENCODER) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation of multiple together " "with single instance way is not allowed!"); SetAddonStruct(instance); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Start encoder (**required**) - /// - /// @param[in] inChannels Number of channels - /// @param[in] inRate Sample rate of input data - /// @param[in] inBits Bits per sample in input data - /// @param[in] title The title of the song - /// @param[in] artist The artist of the song - /// @param[in] albumartist The albumartist of the song - /// @param[in] year The year of the song - /// @param[in] track The track number of the song - /// @param[in] genre The genre of the song - /// @param[in] comment A comment to attach to the song - /// @param[in] trackLength Total track length in seconds - /// @return True on success, false on failure. - /// - virtual bool Start(int inChannels, - int inRate, - int inBits, - const std::string& title, - const std::string& artist, - const std::string& albumartist, - const std::string& album, - const std::string& year, - const std::string& track, - const std::string& genre, - const std::string& comment, - int trackLength) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Encode a chunk of audio (**required**) - /// - /// @param[in] numBytesRead Number of bytes in input buffer - /// @param[in] pbtStream The input buffer - /// @return Number of bytes consumed - /// - virtual int Encode(int numBytesRead, const uint8_t* pbtStream) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Finalize encoding (**optional**) - /// - /// @return True on success, false on failure. - /// + + virtual bool Start(const AudioEncoderInfoTag& tag) = 0; + + virtual ssize_t Encode(const uint8_t* pbtStream, size_t numBytesRead) = 0; + virtual bool Finish() { return true; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Write block of data - /// - /// @param[in] data Pointer to the array of elements to be written - /// @param[in] length Size in bytes to be written. - /// @return The total number of bytes successfully written is returned. - /// - /// @remarks Only called from addon itself. - /// - int Write(const uint8_t* data, int length) + + inline ssize_t Write(const uint8_t* data, size_t length) { - return m_instanceData->toKodi->write(m_instanceData->toKodi->kodiInstance, data, length); + return kodi_addon_audioencoder_write(m_kodi, data, length); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_audioencoder - /// @brief Set the file's current position. - /// - /// The whence argument is optional and defaults to SEEK_SET (0) - /// - /// @param[in] position The position that you want to seek to - /// @param[in] whence [optional] offset relative to\n - /// You can set the value of whence to one - /// of three things: - /// | Value | int | Description | - /// |:--------:|:---:|:---------------------------------------------------| - /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// - /// @return Returns the resulting offset location as measured in bytes from - /// the beginning of the file. On error, the value -1 is returned. - /// - /// @remarks Only called from addon itself. - /// - int64_t Seek(int64_t position, int whence = SEEK_SET) + + inline ssize_t Seek(int64_t position, size_t whence = SEEK_SET) { - return m_instanceData->toKodi->seek(m_instanceData->toKodi->kodiInstance, position, whence); + return kodi_addon_audioencoder_seek(m_kodi, position, whence); } - //---------------------------------------------------------------------------- private: - void SetAddonStruct(KODI_HANDLE instance) + void SetAddonStruct(KODI_HANDLE instance) override { if (instance == nullptr) throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation with empty addon " "structure not allowed, table must be given from Kodi!"); - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->start = ADDON_Start; - m_instanceData->toAddon->encode = ADDON_Encode; - m_instanceData->toAddon->finish = ADDON_Finish; + KODI_INSTANCE_HDL* instanceKodi = static_cast(instance); + instanceKodi->type = ADDON_INSTANCE_AUDIOENCODER; + instanceKodi->instance = this; + instanceKodi->audioencoder->start = ADDON_start; + instanceKodi->audioencoder->encode = ADDON_encode; + instanceKodi->audioencoder->finish = ADDON_finish; + m_kodi = instanceKodi->kodi; } - inline static bool ADDON_Start(const AddonInstance_AudioEncoder* instance, - int inChannels, - int inRate, - int inBits, - const char* title, - const char* artist, - const char* albumartist, - const char* album, - const char* year, - const char* track, - const char* genre, - const char* comment, - int trackLength) + inline static bool ADDON_start(const KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct AUDIOENCODER_INFO_TAG* tag) { - return static_cast(instance->toAddon->addonInstance) - ->Start(inChannels, inRate, inBits, title, artist, albumartist, album, year, track, genre, - comment, trackLength); + return static_cast(hdl)->Start(tag); } - inline static int ADDON_Encode(const AddonInstance_AudioEncoder* instance, - int numBytesRead, - const uint8_t* pbtStream) + inline static ssize_t ADDON_encode(const KODI_ADDON_AUDIOENCODER_HDL hdl, + const uint8_t* pbtStream, + size_t numBytesRead) { - return static_cast(instance->toAddon->addonInstance) - ->Encode(numBytesRead, pbtStream); + return static_cast(hdl)->Encode(pbtStream, numBytesRead); } - inline static bool ADDON_Finish(const AddonInstance_AudioEncoder* instance) + inline static bool ADDON_finish(const KODI_ADDON_AUDIOENCODER_HDL hdl) { - return static_cast(instance->toAddon->addonInstance)->Finish(); + return static_cast(hdl)->Finish(); } - AddonInstance_AudioEncoder* m_instanceData; + KODI_OWN_HDL m_kodi; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt index a57def3add85f..27296a47767ab 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt @@ -1,15 +1,14 @@ -set(HEADERS AudioDecoder.h - AudioEncoder.h - Game.h - ImageDecoder.h - Inputstream.h - Peripheral.h - PVR.h - Screensaver.h - VFS.h - VideoCodec.h - Visualization.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance) +set(HEADERS + AudioDecoder.h + AudioEncoder.h + ImageDecoder.h + Peripheral.h + Screensaver.h +) + +if(HEADERS) + core_add_devkit_header(kodi_addon-instance) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h deleted file mode 100644 index 3dca94d022a0e..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h +++ /dev/null @@ -1,1190 +0,0 @@ -/* - * Copyright (C) 2014-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/addon-instance/game.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @addtogroup cpp_kodi_addon_game -/// -/// To use on Libretro and for stand-alone games or emulators that does not use -/// the Libretro API. -/// -/// Possible examples could be, Nvidia GameStream via Limelight or WINE capture -/// could possible through the Game API. -/// - -//============================================================================== -/// @defgroup cpp_kodi_addon_game_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_game -/// @brief **Game add-on instance definition values** -/// - -//============================================================================== -/// @defgroup cpp_kodi_addon_game_Defs_InputTypes_GameControllerLayout class GameControllerLayout -/// @ingroup cpp_kodi_addon_game_Defs_InputTypes -/// @brief Data of layouts for known controllers. -/// -/// Used on @ref kodi::addon::CInstanceGame::SetControllerLayouts(). -///@{ -class GameControllerLayout -{ -public: - /*! @cond PRIVATE */ - explicit GameControllerLayout() = default; - GameControllerLayout(const game_controller_layout& layout) - { - controller_id = layout.controller_id; - provides_input = layout.provides_input; - for (unsigned int i = 0; i < layout.digital_button_count; ++i) - digital_buttons.push_back(layout.digital_buttons[i]); - for (unsigned int i = 0; i < layout.analog_button_count; ++i) - analog_buttons.push_back(layout.analog_buttons[i]); - for (unsigned int i = 0; i < layout.analog_stick_count; ++i) - analog_sticks.push_back(layout.analog_sticks[i]); - for (unsigned int i = 0; i < layout.accelerometer_count; ++i) - accelerometers.push_back(layout.accelerometers[i]); - for (unsigned int i = 0; i < layout.key_count; ++i) - keys.push_back(layout.keys[i]); - for (unsigned int i = 0; i < layout.rel_pointer_count; ++i) - rel_pointers.push_back(layout.rel_pointers[i]); - for (unsigned int i = 0; i < layout.abs_pointer_count; ++i) - abs_pointers.push_back(layout.abs_pointers[i]); - for (unsigned int i = 0; i < layout.motor_count; ++i) - motors.push_back(layout.motors[i]); - } - /*! @endcond */ - - /// @brief Controller identifier. - std::string controller_id; - - /// @brief Provides input. - /// - /// False for multitaps - bool provides_input; - - /// @brief Digital buttons. - std::vector digital_buttons; - - /// @brief Analog buttons. - std::vector analog_buttons; - - /// @brief Analog sticks. - std::vector analog_sticks; - - /// @brief Accelerometers. - std::vector accelerometers; - - /// @brief Keys. - std::vector keys; - - /// @brief Relative pointers. - std::vector rel_pointers; - - /// @brief Absolute pointers. - std::vector abs_pointers; - - /// @brief Motors. - std::vector motors; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @addtogroup cpp_kodi_addon_game -/// @brief @cpp_class{ kodi::addon::CInstanceGame } -/// **Game add-on instance**\n -/// This class provides the basic game processing system for use as an add-on in -/// Kodi. -/// -/// This class is created at addon by Kodi. -/// -class ATTRIBUTE_HIDDEN CInstanceGame : public IAddonInstance -{ -public: - //============================================================================ - /// @defgroup cpp_kodi_addon_game_Base 1. Basic functions - /// @ingroup cpp_kodi_addon_game - /// @brief **Functions to manage the addon and get basic information about it** - /// - ///@{ - - //============================================================================ - /// @brief Game class constructor - /// - /// Used by an add-on that only supports only Game and only in one instance. - /// - /// This class is created at addon by Kodi. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// ... - /// - /// class ATTRIBUTE_HIDDEN CGameExample - /// : public kodi::addon::CAddonBase, - /// public kodi::addon::CInstanceGame - /// { - /// public: - /// CGameExample() - /// { - /// } - /// - /// virtual ~CGameExample(); - /// { - /// } - /// - /// ... - /// }; - /// - /// ADDONCREATOR(CGameExample) - /// ~~~~~~~~~~~~~ - /// - CInstanceGame() : IAddonInstance(ADDON_INSTANCE_GAME, GetKodiTypeVersion(ADDON_INSTANCE_GAME)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceGame: Creation of more as one in single " - "instance way is not allowed!"); - - SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); - CAddonBase::m_interface->globalSingleInstance = this; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Destructor - /// - ~CInstanceGame() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// The path of the game client being loaded. - /// - /// @return the used game client Dll path - /// - /// @remarks Only called from addon itself - /// - std::string GameClientDllPath() const { return m_instanceData->props->game_client_dll_path; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Paths to proxy DLLs used to load the game client. - /// - /// @param[out] paths vector list to store available dll paths - /// @return true if success and dll paths present - /// - /// @remarks Only called from addon itself - /// - bool ProxyDllPaths(std::vector& paths) - { - for (unsigned int i = 0; i < m_instanceData->props->proxy_dll_count; ++i) - { - if (m_instanceData->props->proxy_dll_paths[i] != nullptr) - paths.push_back(m_instanceData->props->proxy_dll_paths[i]); - } - return !paths.empty(); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// The "system" directories of the frontend. - /// - /// These directories can be used to store system-specific ROMs such as - /// BIOSes, configuration data, etc. - /// - /// @return the used resource directory - /// - /// @remarks Only called from addon itself - /// - bool ResourceDirectories(std::vector& dirs) - { - for (unsigned int i = 0; i < m_instanceData->props->resource_directory_count; ++i) - { - if (m_instanceData->props->resource_directories[i] != nullptr) - dirs.push_back(m_instanceData->props->resource_directories[i]); - } - return !dirs.empty(); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// The writable directory of the frontend. - /// - /// This directory can be used to store SRAM, memory cards, high scores, - /// etc, if the game client cannot use the regular memory interface, - /// GetMemoryData(). - /// - /// @return the used profile directory - /// - /// @remarks Only called from addon itself - /// - std::string ProfileDirectory() const { return m_instanceData->props->profile_directory; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// The value of the property from addon.xml. - /// - /// @return true if VFS is supported - /// - /// @remarks Only called from addon itself - /// - bool SupportsVFS() const { return m_instanceData->props->supports_vfs; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// The extensions in the property from addon.xml. - /// - /// @param[out] extensions vector list to store available extension - /// @return true if success and extensions present - /// - /// @remarks Only called from addon itself - /// - bool Extensions(std::vector& extensions) - { - for (unsigned int i = 0; i < m_instanceData->props->extension_count; ++i) - { - if (m_instanceData->props->extensions[i] != nullptr) - extensions.push_back(m_instanceData->props->extensions[i]); - } - return !extensions.empty(); - } - //---------------------------------------------------------------------------- - - ///@} - -//--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - //============================================================================ - /// - /// @defgroup cpp_kodi_addon_game_Operation 2. Game operations - /// @ingroup cpp_kodi_addon_game - /// @brief **Game operations** - /// - /// These are mandatory functions for using this addon to get the available - /// channels. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Game operation parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_game_Operation_header_addon_auto_check - /// @copydetails cpp_kodi_addon_game_Operation_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Load a game - /// - /// @param[in] url The URL to load - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded - /// - virtual GAME_ERROR LoadGame(const std::string& url) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Load a game that requires multiple files - /// - /// @param[in] type The game type - /// @param[in] urls An array of urls - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded - /// - virtual GAME_ERROR LoadGameSpecial(SPECIAL_GAME_TYPE type, const std::vector& urls) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Begin playing without a game file - /// - /// If the add-on supports standalone mode, it must add the - /// tag to the extension point in addon.xml: - /// - /// false - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game add-on was loaded - /// - virtual GAME_ERROR LoadStandalone() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Unload the current game - /// - /// Unloads a currently loaded game - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was unloaded - /// - virtual GAME_ERROR UnloadGame() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get timing information about the loaded game - /// - /// @param[out] timing_info The info structure to fill - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if info was filled - /// - virtual GAME_ERROR GetGameTiming(game_system_timing& timing_info) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get region of the loaded game - /// - /// @return the region, or @ref GAME_REGION_UNKNOWN if unknown or no game is loaded - /// - virtual GAME_REGION GetRegion() - { - return GAME_REGION_UNKNOWN; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Return true if the client requires the frontend to provide a game loop - /// - /// The game loop is a thread that calls RunFrame() in a loop at a rate - /// determined by the playback speed and the client's FPS. - /// - /// @return true if the frontend should provide a game loop, false otherwise - /// - virtual bool RequiresGameLoop() - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Run a single frame for add-ons that use a game loop - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if there was no error - /// - virtual GAME_ERROR RunFrame() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Reset the current game - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was reset - /// - virtual GAME_ERROR Reset() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Requests the frontend to stop the current game - /// - /// @remarks Only called from addon itself - /// - void CloseGame(void) { m_instanceData->toKodi->CloseGame(m_instanceData->toKodi->kodiInstance); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_game_Operation_CStream Class: CStream - /// @ingroup cpp_kodi_addon_game_Operation - /// @brief @cpp_class{ kodi::addon::CInstanceGame::CStream } - /// **Game stream handler** - /// - /// This class will be integrated into the addon, which can then open it if - /// necessary for the processing of an audio or video stream. - /// - /// - /// @note Callback to Kodi class - ///@{ - class CStream - { - public: - CStream() = default; - - CStream(const game_stream_properties& properties) - { - Open(properties); - } - - ~CStream() - { - Close(); - } - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief Create a stream for gameplay data - /// - /// @param[in] properties The stream properties - /// @return A stream handle, or `nullptr` on failure - /// - /// @remarks Only called from addon itself - /// - bool Open(const game_stream_properties& properties) - { - if (!CAddonBase::m_interface->globalSingleInstance) - return false; - - if (m_handle) - { - kodi::Log(ADDON_LOG_INFO, "kodi::addon::CInstanceGame::CStream already becomes reopened"); - Close(); - } - - AddonToKodiFuncTable_Game& cb = - *static_cast(CAddonBase::m_interface->globalSingleInstance) - ->m_instanceData->toKodi; - m_handle = cb.OpenStream(cb.kodiInstance, &properties); - return m_handle != nullptr; - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief Free the specified stream - /// - /// @remarks Only called from addon itself - /// - void Close() - { - if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) - return; - - AddonToKodiFuncTable_Game& cb = - *static_cast(CAddonBase::m_interface->globalSingleInstance) - ->m_instanceData->toKodi; - cb.CloseStream(cb.kodiInstance, m_handle); - m_handle = nullptr; - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief Get a buffer for zero-copy stream data - /// - /// @param[in] width The framebuffer width, or 0 for no width specified - /// @param[in] height The framebuffer height, or 0 for no height specified - /// @param[out] buffer The buffer, or unmodified if false is returned - /// @return True if buffer was set, false otherwise - /// - /// @note If this returns true, buffer must be freed using @ref ReleaseBuffer(). - /// - /// @remarks Only called from addon itself - /// - bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer& buffer) - { - if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) - return false; - - AddonToKodiFuncTable_Game& cb = - *static_cast(CAddonBase::m_interface->globalSingleInstance) - ->m_instanceData->toKodi; - return cb.GetStreamBuffer(cb.kodiInstance, m_handle, width, height, &buffer); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief Add a data packet to a stream - /// - /// @param[in] packet The data packet - /// - /// @remarks Only called from addon itself - /// - void AddData(const game_stream_packet& packet) - { - if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) - return; - - AddonToKodiFuncTable_Game& cb = - *static_cast(CAddonBase::m_interface->globalSingleInstance) - ->m_instanceData->toKodi; - cb.AddStreamData(cb.kodiInstance, m_handle, &packet); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief Free an allocated buffer - /// - /// @param[in] buffer The buffer returned from GetStreamBuffer() - /// - /// @remarks Only called from addon itself - /// - void ReleaseBuffer(game_stream_buffer& buffer) - { - if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) - return; - - AddonToKodiFuncTable_Game& cb = - *static_cast(CAddonBase::m_interface->globalSingleInstance) - ->m_instanceData->toKodi; - cb.ReleaseStreamBuffer(cb.kodiInstance, m_handle, &buffer); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_game_Operation_CStream - /// @brief To check stream open was OK, e.g. after use of constructor - /// - /// @return true if stream was successfully opened - /// - /// @remarks Only called from addon itself - /// - bool IsOpen() const { return m_handle != nullptr; } - //-------------------------------------------------------------------------- - - private: - KODI_GAME_STREAM_HANDLE m_handle = nullptr; - }; - ///@} - - ///@} - -//--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - //============================================================================ - /// - /// @defgroup cpp_kodi_addon_game_HardwareRendering 3. Hardware rendering operations - /// @ingroup cpp_kodi_addon_game - /// @brief **Hardware rendering operations** - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Hardware rendering operation parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_game_HardwareRendering_header_addon_auto_check - /// @copydetails cpp_kodi_addon_game_HardwareRendering_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Invalidates the current HW context and reinitializes GPU resources - /// - /// Any GL state is lost, and must not be deinitialized explicitly. - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was reset - /// - virtual GAME_ERROR HwContextReset() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Called before the context is destroyed - /// - /// Resources can be deinitialized at this step. - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was destroyed - /// - virtual GAME_ERROR HwContextDestroy() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - - //============================================================================ - /// @brief **Callback to Kodi Function**
Get a symbol from the hardware context - /// - /// @param[in] sym The symbol's name - /// - /// @return A function pointer for the specified symbol - /// - /// @remarks Only called from addon itself - /// - game_proc_address_t HwGetProcAddress(const char* sym) - { - return m_instanceData->toKodi->HwGetProcAddress(m_instanceData->toKodi->kodiInstance, sym); - } - //---------------------------------------------------------------------------- - - ///@} - -//--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - //============================================================================ - /// @defgroup cpp_kodi_addon_game_InputOperations 4. Input operations - /// @ingroup cpp_kodi_addon_game - /// @brief **Input operations** - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Hardware rendering operation parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_game_InputOperations_header_addon_auto_check - /// @copydetails cpp_kodi_addon_game_InputOperations_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Check if input is accepted for a feature on the controller - /// - /// If only a subset of the controller profile is used, this can return false - /// for unsupported features to not absorb their input. - /// - /// If the entire controller profile is used, this should always return true. - /// - /// @param[in] controller_id The ID of the controller profile - /// @param[in] feature_name The name of a feature in that profile - /// @return true if input is accepted for the feature, false otherwise - /// - virtual bool HasFeature(const std::string& controller_id, const std::string& feature_name) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the input topology that specifies which controllers can be connected - /// - /// @return The input topology, or null to use the default - /// - /// If this returns non-null, topology must be freed using FreeTopology(). - /// - /// If this returns null, the topology will default to a single port that can - /// accept all controllers imported by addon.xml. The port ID is set to - /// the @ref DEFAULT_PORT_ID constant. - /// - virtual game_input_topology* GetTopology() - { - return nullptr; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Free the topology's resources - /// - /// @param[in] topology The topology returned by GetTopology() - /// - virtual void FreeTopology(game_input_topology* topology) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the layouts for known controllers - /// - /// @param[in] controllers The controller layouts - /// - /// After loading the input topology, the frontend will call this with - /// controller layouts for all controllers discovered in the topology. - /// - virtual void SetControllerLayouts(const std::vector& controllers) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Enable/disable keyboard input using the specified controller - /// - /// @param[in] enable True to enable input, false otherwise - /// @param[in] controller_id The controller ID if enabling, or unused if disabling - /// - /// @return True if keyboard input was enabled, false otherwise - /// - virtual bool EnableKeyboard(bool enable, const std::string& controller_id) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Enable/disable mouse input using the specified controller - /// - /// @param[in] enable True to enable input, false otherwise - /// @param[in] controller_id The controller ID if enabling, or unused if disabling - /// - /// @return True if mouse input was enabled, false otherwise - /// - virtual bool EnableMouse(bool enable, const std::string& controller_id) - { - return false; - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @brief Connect/disconnect a controller to a port on the virtual game console - /// - /// @param[in] connect True to connect a controller, false to disconnect - /// @param[in] port_address The address of the port - /// @param[in] controller_id The controller ID if connecting, or unused if disconnecting - /// @return True if the \p controller was (dis-)connected to the port, false otherwise - /// - /// The address is a string that allows traversal of the controller topology. - /// It is formed by alternating port IDs and controller IDs separated by "/". - /// - /// For example, assume that the topology represented in XML for Snes9x is: - /// - /// ~~~~~~~~~~~~~{.xml} - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// ... - /// - /// - /// - /// ~~~~~~~~~~~~~ - /// - /// To connect a multitap to the console's first port, the multitap's controller - /// info is set using the port address: - /// - /// 1 - /// - /// To connect a SNES controller to the second port of the multitap, the - /// controller info is next set using the address: - /// - /// 1/game.controller.multitap/2 - /// - /// Any attempts to connect a controller to a port on a disconnected multitap - /// will return false. - /// - virtual bool ConnectController(bool connect, - const std::string& port_address, - const std::string& controller_id) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the add-on of an input event - /// - /// @param[in] event The input event - /// - /// @return true if the event was handled, false otherwise - /// - virtual bool InputEvent(const game_input_event& event) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**
Notify the port of an input event - /// - /// @param[in] event The input event - /// @return true if the event was handled, false otherwise - /// - /// @note Input events can arrive for the following sources: - /// - @ref GAME_INPUT_EVENT_MOTOR - /// - /// @remarks Only called from addon itself - /// - bool KodiInputEvent(const game_input_event& event) - { - return m_instanceData->toKodi->InputEvent(m_instanceData->toKodi->kodiInstance, &event); - } - //---------------------------------------------------------------------------- - - ///@} - -//--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - //============================================================================ - /// @defgroup cpp_kodi_addon_game_SerializationOperations 5. Serialization operations - /// @ingroup cpp_kodi_addon_game - /// @brief **Serialization operations** - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Serialization operation parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_game_SerializationOperations_header_addon_auto_check - /// @copydetails cpp_kodi_addon_game_SerializationOperations_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Get the number of bytes required to serialize the game - /// - /// @return the number of bytes, or 0 if serialization is not supported - /// - virtual size_t SerializeSize() - { - return 0; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Serialize the state of the game - /// - /// @param[in] data The buffer receiving the serialized game data - /// @param[in] size The size of the buffer - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was serialized into the buffer - /// - virtual GAME_ERROR Serialize(uint8_t* data, size_t size) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Deserialize the game from the given state - /// - /// @param[in] data A buffer containing the game's new state - /// @param[in] size The size of the buffer - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game deserialized - /// - virtual GAME_ERROR Deserialize(const uint8_t* data, size_t size) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - ///@} - -//--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - //============================================================================ - /// @defgroup cpp_kodi_addon_game_CheatOperations 6. Cheat operations - /// @ingroup cpp_kodi_addon_game - /// @brief **Cheat operations** - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Cheat operation parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_game_CheatOperations_header_addon_auto_check - /// @copydetails cpp_kodi_addon_game_CheatOperations_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Reset the cheat system - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat system was reset - /// - virtual GAME_ERROR CheatReset() - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get a region of memory - /// - /// @param[in] type The type of memory to retrieve - /// @param[in] data Set to the region of memory; must remain valid until UnloadGame() is called - /// @param[in] size Set to the size of the region of memory - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if data was set to a valid buffer - /// - virtual GAME_ERROR GetMemory(GAME_MEMORY type, uint8_t*& data, size_t& size) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set a cheat code - /// - /// @param[in] index - /// @param[in] enabled - /// @param[in] code - /// - /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat was set - /// - virtual GAME_ERROR SetCheat(unsigned int index, bool enabled, const std::string& code) - { - return GAME_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - ///@} - -private: - void SetAddonStruct(KODI_HANDLE instance) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstanceGame: Creation with empty addon structure not" - "allowed, table must be given from Kodi!"); - - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - - m_instanceData->toAddon->LoadGame = ADDON_LoadGame; - m_instanceData->toAddon->LoadGameSpecial = ADDON_LoadGameSpecial; - m_instanceData->toAddon->LoadStandalone = ADDON_LoadStandalone; - m_instanceData->toAddon->UnloadGame = ADDON_UnloadGame; - m_instanceData->toAddon->GetGameTiming = ADDON_GetGameTiming; - m_instanceData->toAddon->GetRegion = ADDON_GetRegion; - m_instanceData->toAddon->RequiresGameLoop = ADDON_RequiresGameLoop; - m_instanceData->toAddon->RunFrame = ADDON_RunFrame; - m_instanceData->toAddon->Reset = ADDON_Reset; - - m_instanceData->toAddon->HwContextReset = ADDON_HwContextReset; - m_instanceData->toAddon->HwContextDestroy = ADDON_HwContextDestroy; - - m_instanceData->toAddon->HasFeature = ADDON_HasFeature; - m_instanceData->toAddon->GetTopology = ADDON_GetTopology; - m_instanceData->toAddon->FreeTopology = ADDON_FreeTopology; - m_instanceData->toAddon->SetControllerLayouts = ADDON_SetControllerLayouts; - m_instanceData->toAddon->EnableKeyboard = ADDON_EnableKeyboard; - m_instanceData->toAddon->EnableMouse = ADDON_EnableMouse; - m_instanceData->toAddon->ConnectController = ADDON_ConnectController; - m_instanceData->toAddon->InputEvent = ADDON_InputEvent; - - m_instanceData->toAddon->SerializeSize = ADDON_SerializeSize; - m_instanceData->toAddon->Serialize = ADDON_Serialize; - m_instanceData->toAddon->Deserialize = ADDON_Deserialize; - - m_instanceData->toAddon->CheatReset = ADDON_CheatReset; - m_instanceData->toAddon->GetMemory = ADDON_GetMemory; - m_instanceData->toAddon->SetCheat = ADDON_SetCheat; - } - - // --- Game operations --------------------------------------------------------- - - inline static GAME_ERROR ADDON_LoadGame(const AddonInstance_Game* instance, const char* url) - { - return static_cast(instance->toAddon->addonInstance)->LoadGame(url); - } - - inline static GAME_ERROR ADDON_LoadGameSpecial(const AddonInstance_Game* instance, - SPECIAL_GAME_TYPE type, - const char** urls, - size_t urlCount) - { - std::vector urlList; - for (size_t i = 0; i < urlCount; ++i) - { - if (urls[i] != nullptr) - urlList.push_back(urls[i]); - } - - return static_cast(instance->toAddon->addonInstance) - ->LoadGameSpecial(type, urlList); - } - - inline static GAME_ERROR ADDON_LoadStandalone(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->LoadStandalone(); - } - - inline static GAME_ERROR ADDON_UnloadGame(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->UnloadGame(); - } - - inline static GAME_ERROR ADDON_GetGameTiming(const AddonInstance_Game* instance, - game_system_timing* timing_info) - { - return static_cast(instance->toAddon->addonInstance) - ->GetGameTiming(*timing_info); - } - - inline static GAME_REGION ADDON_GetRegion(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetRegion(); - } - - inline static bool ADDON_RequiresGameLoop(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->RequiresGameLoop(); - } - - inline static GAME_ERROR ADDON_RunFrame(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->RunFrame(); - } - - inline static GAME_ERROR ADDON_Reset(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->Reset(); - } - - - // --- Hardware rendering operations ------------------------------------------- - - inline static GAME_ERROR ADDON_HwContextReset(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->HwContextReset(); - } - - inline static GAME_ERROR ADDON_HwContextDestroy(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->HwContextDestroy(); - } - - - // --- Input operations -------------------------------------------------------- - - inline static bool ADDON_HasFeature(const AddonInstance_Game* instance, - const char* controller_id, - const char* feature_name) - { - return static_cast(instance->toAddon->addonInstance) - ->HasFeature(controller_id, feature_name); - } - - inline static game_input_topology* ADDON_GetTopology(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetTopology(); - } - - inline static void ADDON_FreeTopology(const AddonInstance_Game* instance, - game_input_topology* topology) - { - static_cast(instance->toAddon->addonInstance)->FreeTopology(topology); - } - - inline static void ADDON_SetControllerLayouts(const AddonInstance_Game* instance, - const game_controller_layout* controllers, - unsigned int controller_count) - { - if (controllers == nullptr) - return; - - std::vector controllerList; - for (unsigned int i = 0; i < controller_count; ++i) - controllerList.push_back(controllers[i]); - - static_cast(instance->toAddon->addonInstance) - ->SetControllerLayouts(controllerList); - } - - inline static bool ADDON_EnableKeyboard(const AddonInstance_Game* instance, - bool enable, - const char* controller_id) - { - return static_cast(instance->toAddon->addonInstance) - ->EnableKeyboard(enable, controller_id); - } - - inline static bool ADDON_EnableMouse(const AddonInstance_Game* instance, - bool enable, - const char* controller_id) - { - return static_cast(instance->toAddon->addonInstance) - ->EnableMouse(enable, controller_id); - } - - inline static bool ADDON_ConnectController(const AddonInstance_Game* instance, - bool connect, - const char* port_address, - const char* controller_id) - { - return static_cast(instance->toAddon->addonInstance) - ->ConnectController(connect, port_address, controller_id); - } - - inline static bool ADDON_InputEvent(const AddonInstance_Game* instance, - const game_input_event* event) - { - return static_cast(instance->toAddon->addonInstance)->InputEvent(*event); - } - - - // --- Serialization operations ------------------------------------------------ - - inline static size_t ADDON_SerializeSize(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->SerializeSize(); - } - - inline static GAME_ERROR ADDON_Serialize(const AddonInstance_Game* instance, - uint8_t* data, - size_t size) - { - return static_cast(instance->toAddon->addonInstance)->Serialize(data, size); - } - - inline static GAME_ERROR ADDON_Deserialize(const AddonInstance_Game* instance, - const uint8_t* data, - size_t size) - { - return static_cast(instance->toAddon->addonInstance)->Deserialize(data, size); - } - - - // --- Cheat operations -------------------------------------------------------- - - inline static GAME_ERROR ADDON_CheatReset(const AddonInstance_Game* instance) - { - return static_cast(instance->toAddon->addonInstance)->CheatReset(); - } - - inline static GAME_ERROR ADDON_GetMemory(const AddonInstance_Game* instance, - GAME_MEMORY type, - uint8_t** data, - size_t* size) - { - return static_cast(instance->toAddon->addonInstance) - ->GetMemory(type, *data, *size); - } - - inline static GAME_ERROR ADDON_SetCheat(const AddonInstance_Game* instance, - unsigned int index, - bool enabled, - const char* code) - { - return static_cast(instance->toAddon->addonInstance) - ->SetCheat(index, enabled, code); - } - - AddonInstance_Game* m_instanceData; -}; - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h index 7aeef7bf1442e..998fe6e8a2038 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h @@ -9,269 +9,55 @@ #pragma once #include "../AddonBase.h" -#include "../c-api/addon-instance/image_decoder.h" +#include "../c-api/addon-instance/imagedecoder.h" #ifdef __cplusplus + +#include + namespace kodi { namespace addon { -//############################################################################## -/// @defgroup cpp_kodi_addon_imagedecoder_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_imagedecoder -/// @brief **Image decoder add-on general variables** -/// -/// Used to exchange the available options between Kodi and addon. -/// -/// +using ImageFormat = ADDON_IMG_FMT; -//============================================================================== -/// -/// @addtogroup cpp_kodi_addon_imagedecoder -/// @brief @cpp_class{ kodi::addon::CInstanceImageDecoder } -/// **Image decoder add-on instance**\n -/// This instance type is used to allow Kodi various additional image format -/// types. -/// -/// This usage can be requested under various conditions, by a Mimetype protocol -/// defined in `addon.xml` or supported file extensions. -/// -/// Include the header @ref ImageDecoder.h "#include " -/// to use this class. -/// -/// ---------------------------------------------------------------------------- -/// -/// Here is an example of what the `addon.xml.in` would look like for an -/// image decoder addon: -/// -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// @ADDON_DEPENDS@ -/// -/// -/// My image decoder addon summary -/// My image decoder description -/// @PLATFORM@ -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// ### Standard values that can be declared for processing in `addon.xml`. -/// -/// These values are used by Kodi to identify associated images and file -/// extensions and then to select the associated addon. -/// -/// \table_start -/// \table_h3{ Labels, Type, Description } -/// \table_row3{ `point`, -/// @anchor cpp_kodi_addon_imagedecoder_point -/// string, -/// The identification of the addon instance to image decoder is mandatory -/// `kodi.imagedecoder`. In addition\, the instance declared in the -/// first `` is also the main type of addon. -/// } -/// \table_row3{ `extension`, -/// @anchor cpp_kodi_addon_imagedecoder_defaultPort -/// string, -/// The from addon operated and supported image file endings.\n -/// Use a `|` to separate between different ones. -/// } -/// \table_row3{ `defaultPort`, -/// @anchor cpp_kodi_addon_imagedecoder_defaultPort -/// string, -/// The from addon operated image [mimetypes](https://en.wikipedia.org/wiki/Media_type).\n -/// Use a `|` to separate between different ones. -/// } -/// \table_row3{ `library_@PLATFORM@`, -/// @anchor cpp_kodi_addon_imagedecoder_library -/// string, -/// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated `addon.xml`. -/// } -/// \table_end -/// -/// @remark For more detailed description of the `addon.xml`, see also https://kodi.wiki/view/Addon.xml. -/// -/// -/// -------------------------------------------------------------------------- -/// -/// -/// **Example:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class ATTRIBUTE_HIDDEN CMyImageDecoder : public kodi::addon::CInstanceImageDecoder -/// { -/// public: -/// CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion); -/// -/// bool LoadImageFromMemory(unsigned char* buffer, -/// unsigned int bufSize, -/// unsigned int& width, -/// unsigned int& height) override; -/// -/// bool Decode(unsigned char* pixels, -/// unsigned int width, -/// unsigned int height, -/// unsigned int pitch, -/// ImageFormat format) override; -/// -/// ... -/// }; -/// -/// CMyImageDecoder::CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion) -/// : CInstanceImageDecoder(instance, kodiVersion) -/// { -/// ... -/// } -/// -/// bool CMyImageDecoder::LoadImageFromMemory(unsigned char* buffer, -/// unsigned int bufSize, -/// unsigned int& width, -/// unsigned int& height) -/// { -/// ... -/// return true; -/// } -/// -/// bool CMyImageDecoder::Decode(unsigned char* pixels, -/// unsigned int width, -/// unsigned int height, -/// unsigned int pitch, -/// ImageFormat format) override; -/// { -/// ... -/// return true; -/// } -/// -/// //---------------------------------------------------------------------- -/// -/// class ATTRIBUTE_HIDDEN CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() = default; -/// ADDON_STATUS CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_IMAGEDECODER) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Creating my image decoder instance"); -/// addonInstance = new CMyImageDecoder(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyImageDecoder` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -//------------------------------------------------------------------------------ -class ATTRIBUTE_HIDDEN CInstanceImageDecoder : public IAddonInstance +class ATTR_DLL_LOCAL CInstanceImageDecoder : public IAddonInstance { public: - //============================================================================ - /// @ingroup cpp_kodi_addon_imagedecoder - /// @brief Class constructor. - /// - /// @param[in] instance The from Kodi given instance given be add-on - /// CreateInstance call with instance id - /// @ref ADDON_INSTANCE_IMAGEDECODER. - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - /// @note Recommended to set `kodiVersion`. - /// - explicit CInstanceImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_IMAGEDECODER, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_IMAGEDECODER)) + explicit CInstanceImageDecoder(KODI_HANDLE instance) + : IAddonInstance(ADDON_INSTANCE_IMAGEDECODER) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation of multiple together " "with single instance way is not allowed!"); SetAddonStruct(instance); } - //---------------------------------------------------------------------------- ~CInstanceImageDecoder() override = default; - //============================================================================ - /// @ingroup cpp_kodi_addon_imagedecoder - /// @brief Initialize an encoder. - /// - /// @param[in] buffer The data to read from memory - /// @param[in] bufSize The buffer size - /// @param[in,out] width The optimal width of image on entry, obtained width - /// on return - /// @param[in,out] height The optimal height of image, actual obtained height - /// on return - /// @return true if successful done, false on error - /// - virtual bool LoadImageFromMemory(unsigned char* buffer, - unsigned int bufSize, + virtual bool LoadImageFromMemory(const uint8_t* buffer, + size_t bufSize, unsigned int& width, unsigned int& height) = 0; - //---------------------------------------------------------------------------- - //============================================================================ - /// @ingroup cpp_kodi_addon_imagedecoder - /// @brief Decode previously loaded image. - /// - /// @param[in] pixels Output buffer - /// @param[in] width Width of output image - /// @param[in] height Height of output image - /// @param[in] pitch Pitch of output image - /// @param[in] format Format of output image - /// @return true if successful done, false on error - /// - virtual bool Decode(unsigned char* pixels, + virtual bool Decode(uint8_t* pixels, unsigned int width, unsigned int height, unsigned int pitch, - ImageFormat format) = 0; - //---------------------------------------------------------------------------- + kodi::addon::ImageFormat format) = 0; - //============================================================================ - /// @ingroup cpp_kodi_addon_imagedecoder - /// @brief **Callback to Kodi Function**\n - /// Get the wanted mime type from Kodi. - /// - /// @return the mimetype wanted from Kodi - /// - /// @remarks Only called from addon itself. - /// - inline std::string MimeType() { return m_instanceData->props->mimetype; } - //---------------------------------------------------------------------------- + inline std::string MimeType() + { + char* mimetype = kodi_addon_imagedecoder_mimetype(m_kodi); + if (!mimetype) + return ""; + + std::string ret = mimetype; + free(mimetype); + return ret; + } private: void SetAddonStruct(KODI_HANDLE instance) @@ -280,34 +66,34 @@ class ATTRIBUTE_HIDDEN CInstanceImageDecoder : public IAddonInstance throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation with empty addon " "structure not allowed, table must be given from Kodi!"); - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->load_image_from_memory = ADDON_LoadImageFromMemory; - m_instanceData->toAddon->decode = ADDON_Decode; + KODI_INSTANCE_HDL* instanceKodi = static_cast(instance); + instanceKodi->type = ADDON_INSTANCE_IMAGEDECODER; + instanceKodi->instance = this; + instanceKodi->imagedecoder->load_image_from_memory = ADDON_LoadImageFromMemory; + instanceKodi->imagedecoder->decode = ADDON_Decode; } - inline static bool ADDON_LoadImageFromMemory(const AddonInstance_ImageDecoder* instance, - unsigned char* buffer, - unsigned int bufSize, + inline static bool ADDON_LoadImageFromMemory(KODI_ADDON_IMAGEDECODER_HDL hdl, + const uint8_t* buffer, + size_t buf_size, unsigned int* width, unsigned int* height) { - return static_cast(instance->toAddon->addonInstance) - ->LoadImageFromMemory(buffer, bufSize, *width, *height); + return static_cast(hdl)->LoadImageFromMemory(buffer, buf_size, *width, *height); } - inline static bool ADDON_Decode(const AddonInstance_ImageDecoder* instance, - unsigned char* pixels, + inline static bool ADDON_Decode(KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, unsigned int width, unsigned int height, unsigned int pitch, - enum ImageFormat format) + enum ADDON_IMG_FMT format) { - return static_cast(instance->toAddon->addonInstance) - ->Decode(pixels, width, height, pitch, format); + return static_cast(hdl)->Decode(pixels, width, height, pitch, format); } - AddonInstance_ImageDecoder* m_instanceData; + KODI_OWN_HDL m_kodi; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h deleted file mode 100644 index eaa81aabef963..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h +++ /dev/null @@ -1,2038 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/addon-instance/inputstream.h" -#include "inputstream/StreamCodec.h" -#include "inputstream/StreamConstants.h" -#include "inputstream/StreamCrypto.h" -#include "inputstream/TimingConstants.h" - -#ifdef __cplusplus - -#include - -namespace kodi -{ -namespace addon -{ - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Doxygen group set for the definitions -//{{{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_inputstream -/// @brief **Inputstream add-on instance definition values**\n -/// All inputstream functions associated data structures. -/// -/// Used to exchange the available options between Kodi and addon.\n -/// The groups described here correspond to the groups of functions on inputstream -/// instance class. -/// -/// In addition, some of the things described here are also used on the -/// @ref cpp_kodi_addon_videocodec "video codec" addon. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface 1. Interface -/// @ingroup cpp_kodi_addon_inputstream_Defs -/// @brief **Inputstream add-on general variables**\n -/// Used to exchange the available options between Kodi and addon. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_inputstream_Defs_StreamConstants 2. Stream constants -/// @ingroup cpp_kodi_addon_inputstream_Defs -/// @brief **Used to exchange any additional data between the caller and processor.**\n -/// This includes the standardized values, in addition, an addon can also use -/// its own special uses to be exchanged in the same way. -/// -/// These values can be used by other addons (e.g. video addon) or stream files -/// to select the respective inputstream addon and to transfer additional values. -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// -/// This example use the @ref STREAM_PROPERTY_INPUTSTREAM on a `*.strm` -/// file to select needed addon and a additional value where related to selected -/// addon itself. -/// -/// ~~~~~~~~~~~~ -/// #KODIPROP:inputstream=inputstream.adaptive -/// #KODIPROP:inputstream.adaptive.manifest_type=mpd -/// http://rdmedia.bbc.co.uk/dash/ondemand/testcard/1/client_manifest-events-multilang.mpd -/// ~~~~~~~~~~~~ -/// -/// These are then given to Kodi and the respectively selected addon by means of -/// his @ref kodi::addon::CInstanceInputStream::Open "Open" call -/// in @ref kodi::addon::InputstreamProperty::GetProperties. -/// -/// The largest possible amount of these `#KODIPROP` values is defined -/// with @ref STREAM_MAX_PROPERTY_COUNT. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_inputstream_Defs_TimingConstants 3. Stream timing -/// @ingroup cpp_kodi_addon_inputstream_Defs -/// @brief **Timebase and timestamp definitions.**\n -/// Used to exchange the available options between Kodi and addon. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_inputstream_Defs_StreamCodec 4. Stream codec -/// @ingroup cpp_kodi_addon_inputstream_Defs -/// @brief **Inputstream codec control**\n -/// Used to manage stream codec data. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption 5. Stream encryption -/// @ingroup cpp_kodi_addon_inputstream_Defs -/// @brief **Inputstream encryption control**\n -/// Used to manage encrypted streams within addon. -/// - -//}}} -//______________________________________________________________________________ - -class CInstanceInputStream; - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_InputstreamProperty class InputstreamProperty -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief URL and Data of key/value pairs passed to addon on @ref kodi::addon::CInstanceInputStream::Open "Open".\n -/// This is used to have the necessary data of the stream to be opened. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_InputstreamProperty_Help -/// -/// @warning This data are only given from Kodi to addon and can't be used -/// on other places on addon. -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamProperty - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - /*! \endcond */ - -public: - /// @defgroup cpp_kodi_addon_inputstream_Defs_InputstreamProperty_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_InputstreamProperty - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_InputstreamProperty : - /// | Name | Type | Get call - /// |------|------|---------- - /// | **Stream URL** | `std::string` | @ref InputstreamProperty::GetURL "GetURL" - /// | **Mime type** | `std::string` | @ref InputstreamProperty::GetMimeType "GetMimeType" - /// | **Available amount of properties** | `unsigned int` | @ref InputstreamProperty::GetPropertiesAmount "GetPropertiesAmount" - /// | **List of properties** | `std::map` | @ref InputstreamProperty::GetProperties "GetProperties" - /// | **Get addon library folder** | `std::string` | @ref InputstreamProperty::GetLibFolder "GetLibFolder" - /// | **Get addon profile/user folder** | `std::string` | @ref InputstreamProperty::GetProfileFolder "GetProfileFolder" - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_InputstreamProperty - ///@{ - - /// @brief Stream URL to open. - std::string GetURL() const { return m_cStructure->m_strURL; } - - /// @brief Stream mime type. - std::string GetMimeType() const { return m_cStructure->m_mimeType; } - - /// @brief Amount of available properties. - unsigned int GetPropertiesAmount() const - { - return m_cStructure->m_nCountInfoValues; - } - - /// @brief List of available properties- - const std::map GetProperties() const - { - std::map props; - for (unsigned int i = 0; i < m_cStructure->m_nCountInfoValues; ++i) - { - props.emplace(m_cStructure->m_ListItemProperties[i].m_strKey, - m_cStructure->m_ListItemProperties[i].m_strValue); - } - return props; - } - - /// @brief Get addon library folder. - /// - /// @note As alternative can also @ref kodi::GetAddonPath used. - std::string GetLibFolder() const { return m_cStructure->m_libFolder; } - - /// @brief Get addon profile/user folder. - /// - /// @note As alternative can also @ref kodi::GetBaseUserPath used. - std::string GetProfileFolder() const { return m_cStructure->m_profileFolder; } - - ///@} - -private: - InputstreamProperty() = delete; - InputstreamProperty(const InputstreamProperty& stream) = delete; - InputstreamProperty(const INPUTSTREAM_PROPERTY* stream) : CStructHdl(stream) {} - InputstreamProperty(INPUTSTREAM_PROPERTY* stream) : CStructHdl(stream) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities class InputstreamCapabilities -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief **InputStream add-on capabilities. All capabilities are set to "false" as default.**\n -/// Asked to addon on @ref kodi::addon::CInstanceInputStream::GetCapabilities "GetCapabilities". -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities_Help -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamCapabilities - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - InputstreamCapabilities() = default; - InputstreamCapabilities(const InputstreamCapabilities& stream) : CStructHdl(stream) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Capabilities bit mask** | `uint32_t` | @ref InputstreamCapabilities::SetMask "SetMask" | @ref InputstreamCapabilities::GetMask "GetMask" - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities - ///@{ - - /// @brief Set of supported capabilities. - void SetMask(uint32_t mask) const { m_cStructure->m_mask = mask; } - - /// @brief Get of supported capabilities. - uint32_t GetMask() const { return m_cStructure->m_mask; } - - ///@} - -private: - InputstreamCapabilities(const INPUTSTREAM_CAPABILITIES* stream) : CStructHdl(stream) {} - InputstreamCapabilities(INPUTSTREAM_CAPABILITIES* stream) : CStructHdl(stream) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata class InputstreamMasteringMetadata -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief **Mastering metadata.**\n -/// Describes the metadata for [HDR10](https://en.wikipedia.org/wiki/High-dynamic-range_video). -/// -/// Used when video is compressed using [High Efficiency Video Coding (HEVC)](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding). -/// This is used to describe the capabilities of the display used to master the -/// content and the luminance values of the content. -/// -/// Used on @ref kodi::addon::InputstreamInfo::SetMasteringMetadata and @ref kodi::addon::InputstreamInfo::GetMasteringMetadata. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata_Help -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamMasteringMetadata - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - friend class InputstreamInfo; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - InputstreamMasteringMetadata() = default; - InputstreamMasteringMetadata(const InputstreamMasteringMetadata& stream) : CStructHdl(stream) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Chromaticity X coordinates of the red** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryR_ChromaticityX "SetPrimaryR_ChromaticityX" | @ref InputstreamMasteringMetadata::GetPrimaryR_ChromaticityX "GetPrimaryR_ChromaticityX" - /// | **Chromaticity Y coordinates of the red** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryR_ChromaticityY "SetPrimaryR_ChromaticityY" | @ref InputstreamMasteringMetadata::GetPrimaryR_ChromaticityY "GetPrimaryR_ChromaticityY" - /// | **Chromaticity X coordinates of the green** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryG_ChromaticityX "SetPrimaryG_ChromaticityX" | @ref InputstreamMasteringMetadata::GetPrimaryG_ChromaticityX "GetPrimaryG_ChromaticityX" - /// | **Chromaticity Y coordinates of the green** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryG_ChromaticityY "SetPrimaryG_ChromaticityY" | @ref InputstreamMasteringMetadata::GetPrimaryG_ChromaticityY "GetPrimaryG_ChromaticityY" - /// | **Chromaticity X coordinates of the blue** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryB_ChromaticityX "SetPrimaryB_ChromaticityX" | @ref InputstreamMasteringMetadata::GetPrimaryB_ChromaticityX "GetPrimaryB_ChromaticityX" - /// | **Chromaticity Y coordinates of the blue** | `double` | @ref InputstreamMasteringMetadata::SetPrimaryB_ChromaticityY "SetPrimaryB_ChromaticityY" | @ref InputstreamMasteringMetadata::GetPrimaryB_ChromaticityY "GetPrimaryB_ChromaticityY" - /// | **Chromaticity X coordinates of the white point** | `double` | @ref InputstreamMasteringMetadata::SetWhitePoint_ChromaticityX "SetWhitePoint_ChromaticityX" | @ref InputstreamMasteringMetadata::GetWhitePoint_ChromaticityX "GetWhitePoint_ChromaticityX" - /// | **Chromaticity Y coordinates of the white point** | `double` | @ref InputstreamMasteringMetadata::SetWhitePoint_ChromaticityY "SetWhitePoint_ChromaticityY" | @ref InputstreamMasteringMetadata::GetWhitePoint_ChromaticityY "GetWhitePoint_ChromaticityY" - /// | **Maximum number of bits of the display** | `double` | @ref InputstreamMasteringMetadata::SetLuminanceMax "SetLuminanceMax" | @ref InputstreamMasteringMetadata::GetLuminanceMax "GetLuminanceMax" - /// | **Minimum number of bits of the display** | `double` | @ref InputstreamMasteringMetadata::SetLuminanceMin "SetLuminanceMin" | @ref InputstreamMasteringMetadata::GetLuminanceMin "GetLuminanceMin" - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata - ///@{ - - /// @brief Metadata class compare. - /// - /// To compare the metadata with another one. - /// - /// @return true if they equal, false otherwise - bool operator==(const kodi::addon::InputstreamMasteringMetadata& right) const - { - if (memcmp(m_cStructure, right.m_cStructure, sizeof(INPUTSTREAM_MASTERING_METADATA)) == 0) - return true; - return false; - } - - /// @brief Set the chromaticity coordinates of the red value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// X coordinate. The values are normalized to 50,000. - void SetPrimaryR_ChromaticityX(double value) { m_cStructure->primary_r_chromaticity_x = value; } - - /// @brief Get the chromaticity X coordinates of the red value. - double GetPrimaryR_ChromaticityX() { return m_cStructure->primary_r_chromaticity_x; } - - /// @brief The chromaticity coordinates of the red value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// Y coordinate. The values are normalized to 50,000. - void SetPrimaryR_ChromaticityY(double value) { m_cStructure->primary_r_chromaticity_y = value; } - - /// @brief Get the chromaticity Y coordinates of the red value. - double GetPrimaryR_ChromaticityY() { return m_cStructure->primary_r_chromaticity_y; } - - /// @brief Set the chromaticity coordinates of the green value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// X coordinate. The values are normalized to 50,000. - void SetPrimaryG_ChromaticityX(double value) { m_cStructure->primary_g_chromaticity_x = value; } - - /// @brief Get the chromaticity X coordinates of the green value. - double GetPrimaryG_ChromaticityX() { return m_cStructure->primary_g_chromaticity_x; } - - /// @brief Set the chromaticity coordinates of the green value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// Y coordinate. The values are normalized to 50,000. - void SetPrimaryG_ChromaticityY(double value) { m_cStructure->primary_g_chromaticity_y = value; } - - /// @brief Get the chromaticity Y coordinates of the green value. - double GetPrimaryG_ChromaticityY() { return m_cStructure->primary_g_chromaticity_y; } - - /// @brief The chromaticity coordinates of the blue value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// X coordinate. The values are normalized to 50,000. - void SetPrimaryB_ChromaticityX(double value) { m_cStructure->primary_b_chromaticity_x = value; } - - /// @brief Get the chromaticity X coordinates of the blue value. - double GetPrimaryB_ChromaticityX() { return m_cStructure->primary_b_chromaticity_x; } - - /// @brief The chromaticity coordinates of the blue value in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// Y coordinate. The values are normalized to 50,000. - void SetPrimaryB_ChromaticityY(double value) { m_cStructure->primary_b_chromaticity_y = value; } - - /// @brief Get the chromaticity Y coordinates of the blue value. - double GetPrimaryB_ChromaticityY() { return m_cStructure->primary_b_chromaticity_y; } - - /// @brief Set the chromaticity coordinates of the white point in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// X coordinate. The values are normalized to 50,000. - void SetWhitePoint_ChromaticityX(double value) - { - m_cStructure->white_point_chromaticity_x = value; - } - - /// @brief Get the chromaticity X coordinates of the white point - double GetWhitePoint_ChromaticityX() { return m_cStructure->white_point_chromaticity_x; } - - /// @brief Set the chromaticity coordinates of the white point in the - /// [CIE1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space. - /// - /// Y coordinate. The values are normalized to 50,000. - void SetWhitePoint_ChromaticityY(double value) - { - m_cStructure->white_point_chromaticity_y = value; - } - - /// @brief Get the chromaticity Y coordinates of the white point. - double GetWhitePoint_ChromaticityY() { return m_cStructure->white_point_chromaticity_y; } - - /// @brief Set the maximum number of bits of the display used to master the content. - /// - /// Values are normalized to 10,000. - void SetLuminanceMax(double value) { m_cStructure->luminance_max = value; } - - /// @brief Get the maximum number of bits of the display. - double GetLuminanceMax() { return m_cStructure->luminance_max; } - - /// @brief Set the minimum number of bits of the display used to master the content. - /// - /// Values are normalized to 10,000. - void SetLuminanceMin(double value) { m_cStructure->luminance_min = value; } - - /// @brief Get the minimum number of bits of the display. - double GetLuminanceMin() { return m_cStructure->luminance_min; } - - ///@} - -private: - InputstreamMasteringMetadata(const INPUTSTREAM_MASTERING_METADATA* stream) : CStructHdl(stream) {} - InputstreamMasteringMetadata(INPUTSTREAM_MASTERING_METADATA* stream) : CStructHdl(stream) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata class InputstreamContentlightMetadata -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief **Contentlight metadata**\n -/// Describes the metadata for [HDR10](https://en.wikipedia.org/wiki/High-dynamic-range_video). -/// See also @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata "InputstreamMasteringMetadata". -/// -/// Used on @ref kodi::addon::InputstreamInfo::SetContentLightMetadata and @ref kodi::addon::InputstreamInfo::GetContentLightMetadata. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata_Help -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamContentlightMetadata - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - friend class InputstreamInfo; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - InputstreamContentlightMetadata() = default; - InputstreamContentlightMetadata(const InputstreamContentlightMetadata& stream) - : CStructHdl(stream) - { - } - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Maximum content light level** | `double` | @ref InputstreamContentlightMetadata::SetMaxCll "SetMaxCll" | @ref InputstreamContentlightMetadata::GetMaxCll "GetMaxCll" - /// | **Maximum frame average light level** | `double` | @ref InputstreamContentlightMetadata::SetMaxFall "SetMaxFall" | @ref InputstreamContentlightMetadata::GetMaxFall "GetMaxFall" - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata - ///@{ - - /// @brief Metadata class compare. - /// - /// To compare the metadata with another one. - /// - /// @return true if they equal, false otherwise - bool operator==(const kodi::addon::InputstreamContentlightMetadata& right) const - { - if (memcmp(m_cStructure, right.m_cStructure, sizeof(INPUTSTREAM_CONTENTLIGHT_METADATA)) == 0) - return true; - return false; - } - - /// @brief Set the maximum content light level (MaxCLL). - /// - /// This is the bit value corresponding to the brightest pixel used anywhere - /// in the content. - void SetMaxCll(uint64_t value) { m_cStructure->max_cll = value; } - - /// @brief Get the maximum content light level (MaxCLL). - uint64_t GetMaxCll() { return m_cStructure->max_cll; } - - /// @brief Set the maximum frame average light level (MaxFALL). - /// - /// This is the bit value corresponding to the average luminance of the frame - /// which has the brightest average luminance anywhere in the content. - void SetMaxFall(uint64_t value) { m_cStructure->max_fall = value; } - - /// @brief Get the maximum frame average light level (MaxFALL). - uint64_t GetMaxFall() { return m_cStructure->max_fall; } - - ///@} - -private: - InputstreamContentlightMetadata(const INPUTSTREAM_CONTENTLIGHT_METADATA* stream) - : CStructHdl(stream) - { - } - InputstreamContentlightMetadata(INPUTSTREAM_CONTENTLIGHT_METADATA* stream) : CStructHdl(stream) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo class InputstreamInfo -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief **Inputstream add-on stream info**\n -/// This is used to give Kodi the associated and necessary data for an open stream. -/// -/// Used on @ref kodi::addon::CInstanceInputStream::GetStream(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo_Help -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamInfo : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - InputstreamInfo() = default; - InputstreamInfo(const InputstreamInfo& stream) : CStructHdl(stream) - { - SetCryptoSession(stream.GetCryptoSession()); - CopyExtraData(); - } - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo : - /// | Name | Type used | Required | Set call | Get call - /// |------|-----------|----------|----------|--------- - /// | **Stream type** | all | yes | @ref InputstreamInfo::SetStreamType "SetStreamType" | @ref InputstreamInfo::GetStreamType "GetStreamType" - /// | **Feature flags** | all | yes | @ref InputstreamInfo::SetFeatures "SetFeatures" | @ref InputstreamInfo::GetFeatures "GetFeatures" - /// | **Flags** | all | yes | @ref InputstreamInfo::SetFlags "SetFlags" | @ref InputstreamInfo::GetFlags "GetFlags" - /// | **Name** | all | no | @ref InputstreamInfo::SetName "SetName" | @ref InputstreamInfo::GetName "GetName" - /// | **Codec name** | all | yes | @ref InputstreamInfo::SetCodecName "SetCodecName" | @ref InputstreamInfo::GetCodecName "GetCodecName" - /// | **Codec internal name** | all | no | @ref InputstreamInfo::SetCodecInternalName "SetCodecInternalName" | @ref InputstreamInfo::GetCodecInternalName "GetCodecInternalName" - /// | **Codec Profile** | all | no | @ref InputstreamInfo::SetCodecProfile "SetCodecProfile" | @ref InputstreamInfo::GetCodecProfile "GetCodecProfile" - /// | **Physical index** | all | yes | @ref InputstreamInfo::SetPhysicalIndex "SetPhysicalIndex" | @ref InputstreamInfo::GetPhysicalIndex "GetPhysicalIndex" - /// | **Extra data** | Subtitle / all | Type related required | @ref InputstreamInfo::SetExtraData "SetExtraData" | @ref InputstreamInfo::GetExtraData "GetExtraData" - /// | **RFC 5646 language code** | all | no | @ref InputstreamInfo::SetLanguage "SetLanguage" | @ref InputstreamInfo::GetLanguage "GetLanguage" - /// | **FPS scale** | Video | Type related required | @ref InputstreamInfo::SetFpsScale "SetFpsScale" | @ref InputstreamInfo::GetFpsScale "GetFpsScale" - /// | **FPS rate** | Video | Type related required | @ref InputstreamInfo::SetFpsRate "SetFpsRate" | @ref InputstreamInfo::GetFpsRate "GetFpsRate" - /// | **Height** | Video | Type related required | @ref InputstreamInfo::SetHeight "SetHeight" | @ref InputstreamInfo::GetHeight "GetHeight" - /// | **Width** | Video | Type related required | @ref InputstreamInfo::SetWidth "SetWidth" | @ref InputstreamInfo::GetWidth "GetWidth" - /// | **Aspect** | Video | Type related required | @ref InputstreamInfo::SetAspect "SetAspect" | @ref InputstreamInfo::GetAspect "GetAspect" - /// | **Channel quantity** | Audio | Type related required | @ref InputstreamInfo::SetChannels "SetChannels" | @ref InputstreamInfo::GetChannels "GetChannels" - /// | **Sample rate** | Audio | Type related required | @ref InputstreamInfo::SetSampleRate "SetSampleRate" | @ref InputstreamInfo::GetSampleRate "GetSampleRate" - /// | **Bit rate** | Audio | Type related required | @ref InputstreamInfo::SetBitRate "SetBitRate" | @ref InputstreamInfo::GetBitRate "GetBitRate" - /// | **Bits per sample** | Audio | Type related required | @ref InputstreamInfo::SetBitsPerSample "SetBitsPerSample" | @ref InputstreamInfo::GetBitsPerSample "GetBitsPerSample" - /// | **Block align** | | no | @ref InputstreamInfo::SetBlockAlign "SetBlockAlign" | @ref InputstreamInfo::GetBlockAlign "GetBlockAlign" - /// | **Crypto session info** | | no | @ref InputstreamInfo::SetCryptoSession "SetCryptoSession" | @ref InputstreamInfo::GetCryptoSession "GetCryptoSession" - /// | **Four CC code** | | no | @ref InputstreamInfo::SetCodecFourCC "SetCodecFourCC" | @ref InputstreamInfo::GetCodecFourCC "GetCodecFourCC" - /// | **Color space** | | no | @ref InputstreamInfo::SetColorSpace "SetColorSpace" | @ref InputstreamInfo::GetColorSpace "GetColorSpace" - /// | **Color range** | | no | @ref InputstreamInfo::SetColorRange "SetColorRange" | @ref InputstreamInfo::GetColorRange "GetColorRange" - /// | **Color primaries** | | no | @ref InputstreamInfo::SetColorPrimaries "SetColorPrimaries" | @ref InputstreamInfo::GetColorPrimaries "GetColorPrimaries" - /// | **Color transfer characteristic** | | no | @ref InputstreamInfo::SetColorTransferCharacteristic "SetColorTransferCharacteristic" | @ref InputstreamInfo::GetColorTransferCharacteristic "GetColorTransferCharacteristic" - /// | **Mastering metadata** | | no | @ref InputstreamInfo::SetMasteringMetadata "SetMasteringMetadata" | @ref InputstreamInfo::GetMasteringMetadata "GetMasteringMetadata" - /// | **Content light metadata** | | no | @ref InputstreamInfo::SetContentLightMetadata "SetContentLightMetadata" | @ref InputstreamInfo::GetContentLightMetadata "GetContentLightMetadata" - /// - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo - ///@{ - - /// @brief Set the wanted stream type. - /// - /// @param[in] streamType By @ref INPUTSTREAM_TYPE defined type - void SetStreamType(INPUTSTREAM_TYPE streamType) { m_cStructure->m_streamType = streamType; } - - /// @brief To get with @ref SetStreamType changed values. - INPUTSTREAM_TYPE GetStreamType() const { return m_cStructure->m_streamType; } - - /// @brief Set special supported feature flags of inputstream. - /// - /// @param[in] features By @ref INPUTSTREAM_CODEC_FEATURES defined type - void SetFeatures(uint32_t features) { m_cStructure->m_features = features; } - - /// @brief To get with @ref SetFeatures changed values. - uint32_t GetFeatures() const { return m_cStructure->m_features; } - - /// @brief Set supported flags of inputstream. - /// - /// @param[in] flags The on @ref INPUTSTREAM_FLAGS defined flags to set - void SetFlags(uint32_t flags) { m_cStructure->m_flags = flags; } - - /// @brief To get with @ref SetFeatures changed values. - uint32_t GetFlags() const { return m_cStructure->m_flags; } - - /// @brief (optional) Name of the stream, leave empty for default handling. - /// - /// @param[in] name Stream name - void SetName(const std::string& name) - { - strncpy(m_cStructure->m_name, name.c_str(), INPUTSTREAM_MAX_STRING_NAME_SIZE); - } - - /// @brief To get with @ref SetName changed values. - std::string GetName() const { return m_cStructure->m_name; } - - /// @brief (required) Name of codec according to ffmpeg. - /// - /// See https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/codec_desc.c about - /// available names. - /// - /// @remark On @ref INPUTSTREAM_TYPE_TELETEXT and @ref INPUTSTREAM_TYPE_RDS - /// this can be ignored and leaved empty. - /// - /// @param[in] codeName Codec name - void SetCodecName(const std::string& codecName) - { - strncpy(m_cStructure->m_codecName, codecName.c_str(), INPUTSTREAM_MAX_STRING_CODEC_SIZE); - } - - /// @brief To get with @ref SetCodecName changed values. - std::string GetCodecName() const { return m_cStructure->m_codecName; } - - /// @brief (optional) Internal name of codec (selectionstream info). - /// - /// @param[in] codecName Internal codec name - void SetCodecInternalName(const std::string& codecName) - { - strncpy(m_cStructure->m_codecInternalName, codecName.c_str(), - INPUTSTREAM_MAX_STRING_CODEC_SIZE); - } - - /// @brief To get with @ref SetCodecInternalName changed values. - std::string GetCodecInternalName() const { return m_cStructure->m_codecInternalName; } - - /// @brief (optional) The profile of the codec. - /// - /// @param[in] codecProfile Values with @ref STREAMCODEC_PROFILE to use - void SetCodecProfile(STREAMCODEC_PROFILE codecProfile) - { - m_cStructure->m_codecProfile = codecProfile; - } - - /// @brief To get with @ref SetCodecProfile changed values. - STREAMCODEC_PROFILE GetCodecProfile() const { return m_cStructure->m_codecProfile; } - - /// @brief (required) Physical index. - /// - /// @param[in] id Index identifier - void SetPhysicalIndex(unsigned int id) { m_cStructure->m_pID = id; } - - /// @brief To get with @ref SetPhysicalIndex changed values. - unsigned int GetPhysicalIndex() const { return m_cStructure->m_pID; } - - /// @brief Additional data where can needed on streams. - /// - /// @param[in] extraData List with memory of extra data - void SetExtraData(const std::vector& extraData) - { - m_extraData = extraData; - m_cStructure->m_ExtraData = m_extraData.data(); - m_cStructure->m_ExtraSize = m_extraData.size(); - } - - /// @brief Additional data where can needed on streams. - /// - /// @param[in] extraData Pointer with memory of extra data - /// @param[in] extraSize Size to store - void SetExtraData(const uint8_t* extraData, size_t extraSize) - { - m_extraData.clear(); - if (extraData && extraSize > 0) - { - for (size_t i = 0; i < extraSize; ++i) - m_extraData.emplace_back(extraData[i]); - } - - m_cStructure->m_ExtraData = m_extraData.data(); - m_cStructure->m_ExtraSize = m_extraData.size(); - } - - /// @brief To get with @ref SetExtraData changed values. - const std::vector& GetExtraData() { return m_extraData; } - - /// @brief To get size with @ref SetExtraData changed values. - size_t GetExtraDataSize() { return m_extraData.size(); } - - /// @brief Compare extra data from outside with class - /// - /// @param[in] extraData Pointer with memory of extra data for compare - /// @param[in] extraSize Size to compare - /// @return true if they equal, false otherwise - bool CompareExtraData(const uint8_t* extraData, size_t extraSize) const - { - if (!extraData || m_extraData.size() != extraSize) - return false; - for (size_t i = 0; i < extraSize; ++i) - { - if (m_extraData[i] != extraData[i]) - return false; - } - return true; - } - - /// @brief Clear additional data. - void ClearExtraData() - { - m_extraData.clear(); - m_cStructure->m_ExtraData = m_extraData.data(); - m_cStructure->m_ExtraSize = m_extraData.size(); - } - - /// @brief RFC 5646 language code (empty string if undefined). - /// - /// @param[in] language The language to set - void SetLanguage(const std::string& language) - { - strncpy(m_cStructure->m_language, language.c_str(), INPUTSTREAM_MAX_STRING_LANGUAGE_SIZE); - } - - /// @brief To get with @ref SetLanguage changed values. - std::string GetLanguage() const { return m_cStructure->m_language; } - - /// @brief Scale of 1000 and a rate of 29970 will result in 29.97 fps. - /// - /// @param[in] fpsScale Scale rate - void SetFpsScale(unsigned int fpsScale) { m_cStructure->m_FpsScale = fpsScale; } - - /// @brief To get with @ref SetFpsScale changed values. - unsigned int GetFpsScale() const { return m_cStructure->m_FpsScale; } - - /// @brief Rate to use for stream. - /// - /// @param[in] fpsRate Rate to use - void SetFpsRate(unsigned int fpsRate) { m_cStructure->m_FpsRate = fpsRate; } - - /// @brief To get with @ref SetFpsRate changed values. - unsigned int GetFpsRate() const { return m_cStructure->m_FpsRate; } - - /// @brief Height of the stream reported by the demuxer. - /// - /// @param[in] height Height to use - void SetHeight(unsigned int height) { m_cStructure->m_Height = height; } - - /// @brief To get with @ref SetHeight changed values. - unsigned int GetHeight() const { return m_cStructure->m_Height; } - - /// @brief Width of the stream reported by the demuxer. - /// - /// @param[in] width Width to use - void SetWidth(unsigned int width) { m_cStructure->m_Width = width; } - - /// @brief To get with @ref SetWidth changed values. - unsigned int GetWidth() const { return m_cStructure->m_Width; } - - /// @brief Display aspect of stream. - /// - /// @param[in] aspect Aspect ratio to use - void SetAspect(float aspect) { m_cStructure->m_Aspect = aspect; } - - /// @brief To get with @ref SetAspect changed values. - float GetAspect() const { return m_cStructure->m_Aspect; } - - /// @brief (required) Amount of channels. - /// - /// @param[in] sampleRate Channels to use - void SetChannels(unsigned int channels) { m_cStructure->m_Channels = channels; } - - /// @brief To get with @ref SetChannels changed values. - unsigned int GetChannels() const { return m_cStructure->m_Channels; } - - /// @brief (required) Sample rate. - /// - /// @param[in] sampleRate Rate to use - void SetSampleRate(unsigned int sampleRate) { m_cStructure->m_SampleRate = sampleRate; } - - /// @brief To get with @ref SetSampleRate changed values. - unsigned int GetSampleRate() const { return m_cStructure->m_SampleRate; } - - /// @brief Bit rate. - /// - /// @param[in] bitRate Rate to use - void SetBitRate(unsigned int bitRate) { m_cStructure->m_BitRate = bitRate; } - - /// @brief To get with @ref SetBitRate changed values. - unsigned int GetBitRate() const { return m_cStructure->m_BitRate; } - - /// @brief (required) Bits per sample. - /// - /// @param[in] bitsPerSample Bits per sample to use - void SetBitsPerSample(unsigned int bitsPerSample) - { - m_cStructure->m_BitsPerSample = bitsPerSample; - } - - /// @brief To get with @ref SetBitsPerSample changed values. - unsigned int GetBitsPerSample() const { return m_cStructure->m_BitsPerSample; } - - /// @brief To set the necessary stream block alignment size. - /// - /// @param[in] blockAlign Block size in byte - void SetBlockAlign(unsigned int blockAlign) { m_cStructure->m_BlockAlign = blockAlign; } - - /// @brief To get with @ref SetBlockAlign changed values. - unsigned int GetBlockAlign() const { return m_cStructure->m_BlockAlign; } - - /// @brief To set stream crypto session informations. - /// - /// @param[in] cryptoSession The with @ref cpp_kodi_addon_inputstream_Defs_Interface_StreamCryptoSession setable info - /// - void SetCryptoSession(const kodi::addon::StreamCryptoSession& cryptoSession) - { - m_cryptoSession = cryptoSession; - memcpy(&m_cStructure->m_cryptoSession, m_cryptoSession.GetCStructure(), - sizeof(STREAM_CRYPTO_SESSION)); - } - - /// @brief To get with @ref GetCryptoSession changed values. - const kodi::addon::StreamCryptoSession& GetCryptoSession() const { return m_cryptoSession; } - - /// @brief Codec If available, the fourcc code codec. - /// - /// @param[in] codecFourCC Codec four CC code - void SetCodecFourCC(unsigned int codecFourCC) { m_cStructure->m_codecFourCC = codecFourCC; } - - /// @brief To get with @ref SetCodecFourCC changed values - unsigned int GetCodecFourCC() const { return m_cStructure->m_codecFourCC; } - - /// @brief Definition of colorspace. - /// - /// @param[in] colorSpace The with @ref INPUTSTREAM_COLORSPACE setable color space - void SetColorSpace(INPUTSTREAM_COLORSPACE colorSpace) { m_cStructure->m_colorSpace = colorSpace; } - - /// @brief To get with @ref SetColorSpace changed values. - INPUTSTREAM_COLORSPACE GetColorSpace() const { return m_cStructure->m_colorSpace; } - - /// @brief Color range if available. - /// - /// @param[in] colorRange The with @ref INPUTSTREAM_COLORRANGE setable color space - void SetColorRange(INPUTSTREAM_COLORRANGE colorRange) { m_cStructure->m_colorRange = colorRange; } - - /// @brief To get with @ref SetColorRange changed values. - INPUTSTREAM_COLORRANGE GetColorRange() const { return m_cStructure->m_colorRange; } - - /// @brief Chromaticity coordinates of the source primaries. These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. - /// - /// @param[in] colorPrimaries The with @ref INPUTSTREAM_COLORPRIMARIES setable values - void SetColorPrimaries(INPUTSTREAM_COLORPRIMARIES colorPrimaries) - { - m_cStructure->m_colorPrimaries = colorPrimaries; - } - - /// @brief To get with @ref SetColorPrimaries changed values. - INPUTSTREAM_COLORPRIMARIES GetColorPrimaries() const { return m_cStructure->m_colorPrimaries; } - - /// @brief Color Transfer Characteristic. These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. - /// - /// @param[in] colorTransferCharacteristic The with @ref INPUTSTREAM_COLORTRC setable characteristic - void SetColorTransferCharacteristic(INPUTSTREAM_COLORTRC colorTransferCharacteristic) - { - m_cStructure->m_colorTransferCharacteristic = colorTransferCharacteristic; - } - - /// @brief To get with @ref SetColorTransferCharacteristic changed values. - INPUTSTREAM_COLORTRC GetColorTransferCharacteristic() const - { - return m_cStructure->m_colorTransferCharacteristic; - } - - /// @brief Mastering static Metadata. - /// - /// Describes the metadata for HDR10, used when video is compressed using High - /// Efficiency Video Coding (HEVC). This is used to describe the capabilities - /// of the display used to master the content and the luminance values of the - /// content. - /// - /// @param[in] masteringMetadata The with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamMasteringMetadata setable metadata - void SetMasteringMetadata(const kodi::addon::InputstreamMasteringMetadata& masteringMetadata) - { - m_masteringMetadata = masteringMetadata; - m_cStructure->m_masteringMetadata = m_masteringMetadata; - } - - /// @brief To get with @ref SetMasteringMetadata changed values. - const kodi::addon::InputstreamMasteringMetadata& GetMasteringMetadata() const - { - return m_masteringMetadata; - } - - /// @brief Clear mastering static Metadata. - void ClearMasteringMetadata() { m_cStructure->m_masteringMetadata = nullptr; } - - /// @brief Content light static Metadata. - /// - /// The maximum content light level (MaxCLL) and frame average light level - /// (MaxFALL) for the metadata for HDR10. - /// - /// @param[in] contentLightMetadata The with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamContentlightMetadata setable metadata - void SetContentLightMetadata( - const kodi::addon::InputstreamContentlightMetadata& contentLightMetadata) - { - m_contentLightMetadata = contentLightMetadata; - m_cStructure->m_contentLightMetadata = m_contentLightMetadata; - } - - /// @brief To get with @ref SetContentLightMetadata changed values. - const kodi::addon::InputstreamContentlightMetadata& GetContentLightMetadata() const - { - return m_contentLightMetadata; - } - - /// @brief Clear content light static Metadata. - void ClearContentLightMetadata() { m_cStructure->m_contentLightMetadata = nullptr; } - - ///@} - -private: - InputstreamInfo(const INPUTSTREAM_INFO* stream) : CStructHdl(stream) - { - SetCryptoSession(StreamCryptoSession(&stream->m_cryptoSession)); - CopyExtraData(); - } - InputstreamInfo(INPUTSTREAM_INFO* stream) : CStructHdl(stream) - { - SetCryptoSession(StreamCryptoSession(&stream->m_cryptoSession)); - CopyExtraData(); - } - - void CopyExtraData() - { - if (m_cStructure->m_ExtraData && m_cStructure->m_ExtraSize > 0) - { - for (unsigned int i = 0; i < m_cStructure->m_ExtraSize; ++i) - m_extraData.emplace_back(m_cStructure->m_ExtraData[i]); - } - if (m_cStructure->m_masteringMetadata) - m_masteringMetadata = m_cStructure->m_masteringMetadata; - if (m_cStructure->m_contentLightMetadata) - m_contentLightMetadata = m_cStructure->m_contentLightMetadata; - } - std::vector m_extraData; - StreamCryptoSession m_cryptoSession; - InputstreamMasteringMetadata m_masteringMetadata; - InputstreamContentlightMetadata m_contentLightMetadata; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes class InputstreamTimes -/// @ingroup cpp_kodi_addon_inputstream_Defs_Interface -/// @brief **Inputstream add-on times**\n -/// Used on @ref kodi::addon::CInstanceInputStream::GetTimes(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes_Help -/// -///@{ -class ATTRIBUTE_HIDDEN InputstreamTimes : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - InputstreamTimes() = default; - InputstreamTimes(const InputstreamTimes& stream) : CStructHdl(stream) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes : - /// | Name | Type | Set call | Get call - /// |------|------|----------|-------------------- - /// | **Start time** | `time_t` | @ref InputstreamTimes::SetStartTime "SetStartTime" | @ref InputstreamTimes::GetStartTime "GetStartTime" - /// | **PTS start** | `double` | @ref InputstreamTimes::SetPtsStart "SetPtsStart" | @ref InputstreamTimes::GetPtsStart "GetPtsStart" - /// | **PTS begin** | `double` | @ref InputstreamTimes::SetPtsBegin "SetPtsBegin" | @ref InputstreamTimes::GetPtsBegin "GetPtsBegin" - /// | **PTS end** | `double` | @ref InputstreamTimes::SetPtsEnd "SetPtsEnd" | @ref InputstreamTimes::GetPtsEnd "GetPtsEnd" - /// - - /// @addtogroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamTimes - ///@{ - - /// @brief Start time in milliseconds - void SetStartTime(time_t startTime) const { m_cStructure->startTime = startTime; } - - /// @brief To get with @ref SetStartTime changed values - time_t GetStartTime() const { return m_cStructure->startTime; } - - /// @brief Start PTS - void SetPtsStart(double ptsStart) const { m_cStructure->ptsStart = ptsStart; } - - /// @brief To get with @ref SetPtsStart changed values - double GetPtsStart() const { return m_cStructure->ptsStart; } - - /// @brief Begin PTS - void SetPtsBegin(double ptsBegin) const { m_cStructure->ptsBegin = ptsBegin; } - - /// @brief To get with @ref SetPtsBegin changed values - double GetPtsBegin() const { return m_cStructure->ptsBegin; } - - /// @brief End PTS - void SetPtsEnd(double ptsEnd) const { m_cStructure->ptsEnd = ptsEnd; } - - /// @brief To get with @ref SetPtsEnd changed values - double GetPtsEnd() const { return m_cStructure->ptsEnd; } - - ///@} - -private: - InputstreamTimes(const INPUTSTREAM_TIMES* stream) : CStructHdl(stream) {} - InputstreamTimes(INPUTSTREAM_TIMES* stream) : CStructHdl(stream) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================ -/// -/// @addtogroup cpp_kodi_addon_inputstream -/// @brief \cpp_class{ kodi::addon::CInstanceInputStream } -/// **Inputstream add-on instance** -/// -/// This instance type is for using input streams to video and audio, to process -/// and then give them to Kodi. -/// -/// This usage can be requested under various conditions, for example explicitly -/// by another addon, by a Mimetype protocol defined in `addon.xml` or supported -/// file extensions. -/// -/// In addition, stream files (* .strm) can be linked to an inputstream addon -/// using `#KODIPROP:inputstream=`. -/// -/// Include the header @ref Inputstream.h "#include " -/// to use this class. -/// -/// ---------------------------------------------------------------------------- -/// -/// Here is an example of what the `addon.xml.in` would look like for an inputstream addon: -/// -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// @ADDON_DEPENDS@ -/// -/// -/// My InputStream addon -/// My InputStream description -/// @PLATFORM@ -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// -/// At `` the basic instance definition is declared, this is intended to identify the addon as an input stream and to see its supported types: -/// | Name | Description -/// |------|---------------------- -/// | `point` | The identification of the addon instance to inputstream is mandatory `kodi.inputstream`. In addition, the instance declared in the first `` is also -/// | `extension` | A filename extension is an identifier specified as a suffix to the name of a computer file where supported by addon. -/// | `listitemprops` | Values that are available to the addon at @ref InputstreamProperty::GetProperties() and that can be passed to @ref CInstanceInputStream::Open() ith the respective values. -/// | `protocols` | The streaming protocol is a special protocol supported by the addon for the transmission of streaming media data over a network. -/// | `library_@PLATFORM@` | The runtime library used for the addon. This is usually declared by cmake and correctly displayed in the translated `addon.xml`. -/// -/// -/// @remark For more detailed description of the `addon.xml`, see also https://kodi.wiki/view/Addon.xml. -/// -/// -/// -------------------------------------------------------------------------- -/// -/// -/// **Example:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class CMyInputstream : public kodi::addon::CInstanceInputStream -/// { -/// public: -/// CMyInputstream(KODI_HANDLE instance, const std::string& kodiVersion); -/// -/// void GetCapabilities(kodi::addon::InputstreamCapabilities& capabilities) override; -/// bool Open(const kodi::addon::InputstreamProperty& props) override; -/// void Close() override; -/// ... -/// }; -/// -/// CMyInputstream::CMyInputstream(KODI_HANDLE instance, const std::string& kodiVersion) -/// : kodi::addon::CInstanceInputStream(instance, kodiVersion) -/// { -/// ... -/// } -/// -/// void CMyInputstream::GetCapabilities(kodi::addon::InputstreamCapabilities& capabilities) -/// { -/// capabilities.SetMask(INPUTSTREAM_SUPPORTS_IDEMUX | INPUTSTREAM_SUPPORTS_PAUSE); -/// } -/// -/// void CMyInputstream::Open(const kodi::addon::InputstreamProperty& props) -/// { -/// std::string url = props.GetURL(); -/// ... -/// } -/// -/// void CMyInputstream::Close() -/// { -/// ... -/// } -/// -/// ... -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() = default; -/// ADDON_STATUS CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_INPUTSTREAM) -/// { -/// kodi::Log(ADDON_LOG_NOTICE, "Creating my Inputstream"); -/// addonInstance = new CMyInputstream(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyInputstream` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -//------------------------------------------------------------------------------ -class ATTRIBUTE_HIDDEN CInstanceInputStream : public IAddonInstance -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Inputstream class constructor used to support multiple instance - /// types - /// - /// @param[in] instance The instance value given to `kodi::addon::CAddonBase::CreateInstance(...)` - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - /// @warning Only use `instance` from the @ref CAddonBase::CreateInstance call. - /// - explicit CInstanceInputStream(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_INPUTSTREAM, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_INPUTSTREAM)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceInputStream: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance, m_kodiVersion); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Destructor - /// - ~CInstanceInputStream() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Get the list of features that this add-on provides. - /// - /// Called by Kodi to query the add-on's capabilities. - /// Used to check which options should be presented in the UI, which methods to call, etc. - /// All capabilities that the add-on supports should be set to true. - /// - /// @param[out] capabilities The with @ref cpp_kodi_addon_inputstream_Defs_Capabilities defined add-on's capabilities. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities_Help - /// - /// -------------------------------------------------------------------------- - /// @note Valid implementation required. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// void CMyInputstream::GetCapabilities(kodi::addon::InputstreamCapabilities& capabilities) - /// { - /// capabilities.SetMask(INPUTSTREAM_SUPPORTS_IDEMUX | INPUTSTREAM_SUPPORTS_PAUSE); - /// } - /// ~~~~~~~~~~~~~ - /// - virtual void GetCapabilities(kodi::addon::InputstreamCapabilities& capabilities) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Open a stream. - /// - /// @param[in] props The used properties about the stream - /// @return True if the stream has been opened successfully, false otherwise. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_inputstream_Defs_InputstreamProperty_Help - /// - /// -------------------------------------------------------------------------- - /// @note Valid implementation required. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// void CMyInputstream::Open(const kodi::addon::InputstreamProperty& props) - /// { - /// std::string url = props.GetURL(); - /// std::string license_key = props.GetProperties()["inputstream.myspecialnamefor.license_key"]; - /// ... - /// } - /// ~~~~~~~~~~~~~ - /// - virtual bool Open(const kodi::addon::InputstreamProperty& props) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Close an open stream. - /// - /// @remarks - /// - /// - /// -------------------------------------------------------------------------- - /// @note Valid implementation required. - /// - virtual void Close() = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_inputstream - /// @brief Check for real-time streaming - /// - /// @return true if current stream is real-time - /// - virtual bool IsRealTimeStream() { return true; } - //---------------------------------------------------------------------------- - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_Read 1. Stream read - /// @brief **Functions required to read streams direct and demux inside Kodi.** - /// - /// This part contains at least the functions necessary for addon that have to - /// be supported. This can only be ignored if you use your own demux. - /// - /// The data loaded by Kodi is then processed in it itself. The source does not - /// matter, only Kodi must be able to process this stream data itself and is - /// therefore limited in some things. - /// - /// For more complex things, the addon must integrate its own demuxer and, - /// if necessary, even its own codec processing (see @ref cpp_kodi_addon_codec "Codec"). - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_IDEMUX - /// is undefined in the capabilities (see @ref GetCapabilities()). - /// Otherwise becomes @ref cpp_kodi_addon_inputstream_Demux "demuxing" used. - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //============================================================================ - /// @brief Read from an open stream. - /// - /// @param[in] buffer The buffer to store the data in. - /// @param[in] bufferSize The amount of bytes to read. - /// @return The amount of bytes that were actually read from the stream. - /// - virtual int ReadStream(uint8_t* buffer, unsigned int bufferSize) { return -1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Seek in a stream. - /// - /// @param[in] position The position to seek to - /// @param[in] whence offset relative to
- /// You can set the value of whence to one of three things: - /// | Value | int | Description | - /// |:------------:|:-----:|:----------------------------------------------------| - /// | **SEEK_SET** | `0` | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | **SEEK_CUR** | `1` | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | **SEEK_END** | `2` | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// - /// @return Returns the resulting offset location as measured in bytes from - /// the beginning of the file. On error, the value -1 is returned. - /// - /// @remarks Optional and can leaved away or return -1 if this add-on won't - /// provide this function. - /// - virtual int64_t SeekStream(int64_t position, int whence = SEEK_SET) { return -1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief The position in the stream that's currently being read. - /// - /// @return Stream position - /// - /// @remarks Optional and can leaved away or return -1 if this add-on won't - /// provide this function. - /// - virtual int64_t PositionStream() { return -1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief The Total length of the stream that's currently being read. - /// - /// @return Length of the stream - /// - /// @remarks Optional and can leaved away or return -1 if this add-on won't - /// provide this function. - /// - virtual int64_t LengthStream() { return -1; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @brief Obtain the chunk size to use when reading streams. - /// - /// @return Block chunk size - /// - /// @remarks Optional and can leaved away or return 0 if this add-on won't - /// provide this function. - /// - virtual int GetBlockSize() { return 0; } - //-------------------------------------------------------------------------- - - ///@} - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_Demux 2. Stream demuxing (optional) - /// @brief **Read demux streams.** - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_IDEMUX is set in the capabilities (see @ref GetCapabilities()). - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //============================================================================ - /// @brief Get IDs of available streams - /// - /// @param[in] ids list of used identifications - /// @return true if successfully done, otherwise false - /// - /// @remarks This id's are used to identify wanted data on @ref GetStream call. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// - /// bool CMyInputstream::GetStreamIds(std::vector& ids) - /// { - /// kodi::Log(ADDON_LOG_DEBUG, "GetStreamIds(...)"); - /// - /// if (m_opened) - /// { - /// // This check not needed to have, the ABI checks also about, but make - /// // sure you not give more as 32 streams. - /// if (m_myStreams.size() > MAX_STREAM_COUNT) - /// { - /// kodi::Log(ADDON_LOG_ERROR, "Too many streams, only %u supported", MAX_STREAM_COUNT); - /// return false; - /// } - /// - /// ids.emplace_back(m_myAudioStreamId); - /// - /// for (const auto& streamPair : m_myOtherStreams) - /// { - /// ids.emplace_back(streamPair.second->uniqueId); - /// } - /// } - /// - /// return !ids.empty(); - /// } - /// ~~~~~~~~~~~~~ - /// - virtual bool GetStreamIds(std::vector& ids) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Function for giving detailed stream information - /// - /// The associated information is set here for IDs previously given with - /// @ref GetStreamIds. - /// - /// This data is required to identify the associated codec and, if necessary, - /// to refer to your own codec (if available in the addon). - /// - /// @param[in] streamid unique id of stream - /// @param[out] stream Information data of wanted stream - /// @return true if successfully done, otherwise false - /// - /// @remarks Available stream id's previously asked by @ref GetStreamIds - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo_Help - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// - /// ~~~~~~~~~~~~~{.cpp} - /// bool CMyInputstream::GetStream(int streamid, kodi::addon::InputstreamInfo& stream) - /// { - /// // This is just a small example, this type will be significantly larger - /// // for larger and more complex streams. - /// if (streamid == m_myAudioStreamId) - /// { - /// // This only a minimal exampl - /// stream.SetStreamType(INPUTSTREAM_TYPE_AUDIO); - /// stream.SetFeatures(INPUTSTREAM_FEATURE_NONE); // Only added to example, INPUTSTREAM_FEATURE_NONE is default and no need to call - /// stream.SetFlags(INPUTSTREAM_FLAG_NONE); // Only added to example, INPUTSTREAM_FLAG_NONE is default and no need to call - /// stream.SetCodecName("mp2"); // Codec name, string must by equal with FFmpeg, see https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/codec_desc.c - /// stream.SetPhysicalIndex(1); // Identifier required to set - /// stream.SetLanguage("en"); - /// stream.SetChannels(2); - /// stream.SetSampleRate(48000); - /// stream.SetBitRate(0); - /// stream.SetBitsPerSample(16); - /// } - /// else ... - /// ... - /// return true; - /// } - /// ~~~~~~~~~~~~~ - /// - virtual bool GetStream(int streamid, kodi::addon::InputstreamInfo& stream) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Enable or disable a stream. - /// - /// A disabled stream does not send demux packets - /// - /// @param[in] streamid unique id of stream - /// @param[in] enable true for enable, false for disable - /// - /// @remarks Available stream id's previously asked by @ref GetStreamIds - /// - /// - /// -------------------------------------------------------------------------- - /// @note Valid implementation required. - /// - virtual void EnableStream(int streamid, bool enable) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Opens a stream for playback. - /// - /// @param[in] streamid unique id of stream - /// - /// @remarks Available stream id's previously asked by @ref GetStreamIds - /// - /// - /// -------------------------------------------------------------------------- - /// @note Valid implementation required. - /// - virtual bool OpenStream(int streamid) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Reset the demultiplexer in the add-on. - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void DemuxReset() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Abort the demultiplexer thread in the add-on. - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void DemuxAbort() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Flush all data that's currently in the demultiplexer buffer in the add-on. - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void DemuxFlush() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Read the next packet from the demultiplexer, if there is one. - /// - /// @return The next packet. - /// If there is no next packet, then the add-on should return the - /// packet created by calling @ref AllocateDemuxPacket "AllocateDemuxPacket(0)" on the callback. - /// If the stream changed and Kodi's player needs to be reinitialised, - /// then, the add-on should call @ref AllocateDemuxPacket "AllocateDemuxPacket(0)" on the - /// callback, and set the streamid to DMX_SPECIALID_STREAMCHANGE and - /// return the value. - /// The add-on should return `nullptr` if an error occured. - /// - /// @remarks Return `nullptr` if this add-on won't provide this function. - /// - virtual DEMUX_PACKET* DemuxRead() { return nullptr; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the InputStream addon/demuxer that Kodi wishes to seek the stream by time - /// - /// Demuxer is required to set stream to an IDR frame - /// - /// @param[in] time The absolute time since stream start - /// @param[in] backwards True to seek to keyframe BEFORE time, else AFTER - /// @param[in] startpts can be updated to point to where display should start - /// @return True if the seek operation was possible - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual bool DemuxSeekTime(double time, bool backwards, double& startpts) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the InputStream addon/demuxer that Kodi wishes to change playback speed - /// - /// @param[in] speed The requested playback speed - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void DemuxSetSpeed(int speed) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Sets desired width / height - /// - /// @param[in] width Width to set - /// @param[in] height Height to set - /// - virtual void SetVideoResolution(int width, int height) {} - //---------------------------------------------------------------------------- - - //============================================================================= - /// @brief Allocate a demux packet. Free with @ref FreeDemuxPacket - /// - /// @param[in] dataSize The size of the data that will go into the packet - /// @return The allocated packet - /// - /// @remarks Only called from addon itself - /// - DEMUX_PACKET* AllocateDemuxPacket(int dataSize) - { - return m_instanceData->toKodi->allocate_demux_packet(m_instanceData->toKodi->kodiInstance, - dataSize); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Allocate a encrypted demux packet. Free with @ref FreeDemuxPacket - /// - /// @param[in] dataSize The size of the data that will go into the packet - /// @param[in] encryptedSubsampleCount The encrypted subsample count - /// @return The allocated packet - /// - /// @remarks Only called from addon itself - /// - DEMUX_PACKET* AllocateEncryptedDemuxPacket(int dataSize, unsigned int encryptedSubsampleCount) - { - return m_instanceData->toKodi->allocate_encrypted_demux_packet( - m_instanceData->toKodi->kodiInstance, dataSize, encryptedSubsampleCount); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Free a packet that was allocated with AllocateDemuxPacket - /// - /// @param[in] packet The packet to free - /// - /// @remarks Only called from addon itself - /// - void FreeDemuxPacket(DEMUX_PACKET* packet) - { - return m_instanceData->toKodi->free_demux_packet(m_instanceData->toKodi->kodiInstance, packet); - } - //---------------------------------------------------------------------------- - - ///@} - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_Time 3. Time (optional) - /// @brief **To get stream position time.** - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_IDISPLAYTIME is set in the capabilities (see @ref GetCapabilities()). - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //========================================================================== - /// @brief Totel time in ms - /// - /// @return Total time in milliseconds - /// - /// @remarks - /// - virtual int GetTotalTime() { return -1; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @brief Playing time in ms - /// - /// @return Playing time in milliseconds - /// - /// @remarks - /// - virtual int GetTime() { return -1; } - //-------------------------------------------------------------------------- - - ///@} - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_Times 4. Times (optional) - /// @brief **Another way to get stream position time.** - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_ITIME is set in the capabilities (see @ref GetCapabilities()). - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //============================================================================ - /// @brief Get current timing values in PTS scale - /// - /// @param[out] times The with @ref InputstreamTimes to given times - /// @return true if successfully done, false if not - /// - /// @copydetails cpp_kodi_addon_inputstream_Defs_Times_Help - /// - /// @remarks - /// - virtual bool GetTimes(InputstreamTimes& times) { return false; } - //---------------------------------------------------------------------------- - - ///@} - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_PosTime 5. Position time (optional) - /// @brief **Third way get stream position time.** - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_IPOSTIME is set in the capabilities (see @ref GetCapabilities()). - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //============================================================================ - /// @brief Positions inputstream to playing time given in ms - /// - /// @param[in] ms Position time in milliseconds - /// - /// @remarks - /// - virtual bool PosTime(int ms) { return false; } - //---------------------------------------------------------------------------- - - ///@} - - //############################################################################ - /// @defgroup cpp_kodi_addon_inputstream_Chapter 6. Chapter (optional) - /// @brief **Used to get available chapters.** - /// - /// @note These are used and must be set by the addon if the @ref INPUTSTREAM_SUPPORTS_ICHAPTER is set in the capabilities (see @ref GetCapabilities()). - /// - /// @ingroup cpp_kodi_addon_inputstream - ///@{ - - //========================================================================== - /// - /// @brief Return currently selected chapter - /// - /// @return Chapter number - /// - /// @remarks - /// - virtual int GetChapter() { return -1; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// - /// @brief Return number of available chapters - /// - /// @return Chapter count - /// - /// @remarks - /// - virtual int GetChapterCount() { return 0; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// - /// @brief Return name of chapter - /// - /// @param[in] ch Chapter identifier - /// @return Chapter name - /// - /// @remarks - /// - virtual const char* GetChapterName(int ch) { return nullptr; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// - /// @brief Return position if chapter # ch in milliseconds - /// - /// @param[in] ch Chapter to get position from - /// @return Position in milliseconds - /// - /// @remarks - /// - virtual int64_t GetChapterPos(int ch) { return 0; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// - /// @brief Seek to the beginning of chapter # ch - /// - /// @param[in] ch Chapter to seek - /// @return True if successfully done, false if not - /// - /// @remarks - /// - virtual bool SeekChapter(int ch) { return false; } - //-------------------------------------------------------------------------- - - ///@} - -private: - static int compareVersion(const int v1[3], const int v2[3]) - { - for (unsigned i(0); i < 3; ++i) - if (v1[i] != v2[i]) - return v1[i] - v2[i]; - return 0; - } - - void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstanceInputStream: Creation with empty addon " - "structure not allowed, table must be given from Kodi!"); - int api[3] = { 0, 0, 0 }; - sscanf(kodiVersion.c_str(), "%d.%d.%d", &api[0], &api[1], &api[2]); - - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->open = ADDON_Open; - m_instanceData->toAddon->close = ADDON_Close; - m_instanceData->toAddon->get_capabilities = ADDON_GetCapabilities; - - m_instanceData->toAddon->get_stream_ids = ADDON_GetStreamIds; - m_instanceData->toAddon->get_stream = ADDON_GetStream; - m_instanceData->toAddon->enable_stream = ADDON_EnableStream; - m_instanceData->toAddon->open_stream = ADDON_OpenStream; - m_instanceData->toAddon->demux_reset = ADDON_DemuxReset; - m_instanceData->toAddon->demux_abort = ADDON_DemuxAbort; - m_instanceData->toAddon->demux_flush = ADDON_DemuxFlush; - m_instanceData->toAddon->demux_read = ADDON_DemuxRead; - m_instanceData->toAddon->demux_seek_time = ADDON_DemuxSeekTime; - m_instanceData->toAddon->demux_set_speed = ADDON_DemuxSetSpeed; - m_instanceData->toAddon->set_video_resolution = ADDON_SetVideoResolution; - - m_instanceData->toAddon->get_total_time = ADDON_GetTotalTime; - m_instanceData->toAddon->get_time = ADDON_GetTime; - - m_instanceData->toAddon->get_times = ADDON_GetTimes; - m_instanceData->toAddon->pos_time = ADDON_PosTime; - - m_instanceData->toAddon->read_stream = ADDON_ReadStream; - m_instanceData->toAddon->seek_stream = ADDON_SeekStream; - m_instanceData->toAddon->position_stream = ADDON_PositionStream; - m_instanceData->toAddon->length_stream = ADDON_LengthStream; - m_instanceData->toAddon->is_real_time_stream = ADDON_IsRealTimeStream; - - // Added on 2.0.10 - m_instanceData->toAddon->get_chapter = ADDON_GetChapter; - m_instanceData->toAddon->get_chapter_count = ADDON_GetChapterCount; - m_instanceData->toAddon->get_chapter_name = ADDON_GetChapterName; - m_instanceData->toAddon->get_chapter_pos = ADDON_GetChapterPos; - m_instanceData->toAddon->seek_chapter = ADDON_SeekChapter; - - // Added on 2.0.12 - m_instanceData->toAddon->block_size_stream = ADDON_GetBlockSize; - - /* - // Way to include part on new API version - int minPartVersion[3] = { 3, 0, 0 }; - if (compareVersion(api, minPartVersion) >= 0) - { - - } - */ - } - - inline static bool ADDON_Open(const AddonInstance_InputStream* instance, - INPUTSTREAM_PROPERTY* props) - { - return static_cast(instance->toAddon->addonInstance)->Open(props); - } - - inline static void ADDON_Close(const AddonInstance_InputStream* instance) - { - static_cast(instance->toAddon->addonInstance)->Close(); - } - - inline static void ADDON_GetCapabilities(const AddonInstance_InputStream* instance, - INPUTSTREAM_CAPABILITIES* capabilities) - { - InputstreamCapabilities caps(capabilities); - static_cast(instance->toAddon->addonInstance)->GetCapabilities(caps); - } - - - // IDemux - inline static bool ADDON_GetStreamIds(const AddonInstance_InputStream* instance, - struct INPUTSTREAM_IDS* ids) - { - std::vector idList; - bool ret = - static_cast(instance->toAddon->addonInstance)->GetStreamIds(idList); - if (ret) - { - for (size_t i = 0; i < idList.size() && i < INPUTSTREAM_MAX_STREAM_COUNT; ++i) - { - ids->m_streamCount++; - ids->m_streamIds[i] = idList[i]; - } - } - return ret; - } - - inline static bool ADDON_GetStream( - const AddonInstance_InputStream* instance, - int streamid, - struct INPUTSTREAM_INFO* info, - KODI_HANDLE* demuxStream, - KODI_HANDLE (*transfer_stream)(KODI_HANDLE handle, - int streamId, - struct INPUTSTREAM_INFO* stream)) - { - InputstreamInfo infoData(info); - bool ret = static_cast(instance->toAddon->addonInstance) - ->GetStream(streamid, infoData); - if (ret && transfer_stream) - { - // Do this with given callback to prevent memory problems and leaks. This - // then create on Kodi the needed class where then given back on demuxStream. - *demuxStream = transfer_stream(instance->toKodi->kodiInstance, streamid, info); - } - return ret; - } - - inline static void ADDON_EnableStream(const AddonInstance_InputStream* instance, - int streamid, - bool enable) - { - static_cast(instance->toAddon->addonInstance) - ->EnableStream(streamid, enable); - } - - inline static bool ADDON_OpenStream(const AddonInstance_InputStream* instance, int streamid) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenStream(streamid); - } - - inline static void ADDON_DemuxReset(const AddonInstance_InputStream* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxReset(); - } - - inline static void ADDON_DemuxAbort(const AddonInstance_InputStream* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxAbort(); - } - - inline static void ADDON_DemuxFlush(const AddonInstance_InputStream* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxFlush(); - } - - inline static DEMUX_PACKET* ADDON_DemuxRead(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->DemuxRead(); - } - - inline static bool ADDON_DemuxSeekTime(const AddonInstance_InputStream* instance, - double time, - bool backwards, - double* startpts) - { - return static_cast(instance->toAddon->addonInstance) - ->DemuxSeekTime(time, backwards, *startpts); - } - - inline static void ADDON_DemuxSetSpeed(const AddonInstance_InputStream* instance, int speed) - { - static_cast(instance->toAddon->addonInstance)->DemuxSetSpeed(speed); - } - - inline static void ADDON_SetVideoResolution(const AddonInstance_InputStream* instance, - int width, - int height) - { - static_cast(instance->toAddon->addonInstance) - ->SetVideoResolution(width, height); - } - - - // IDisplayTime - inline static int ADDON_GetTotalTime(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetTotalTime(); - } - - inline static int ADDON_GetTime(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetTime(); - } - - // ITime - inline static bool ADDON_GetTimes(const AddonInstance_InputStream* instance, - INPUTSTREAM_TIMES* times) - { - InputstreamTimes cppTimes(times); - return static_cast(instance->toAddon->addonInstance)->GetTimes(cppTimes); - } - - // IPosTime - inline static bool ADDON_PosTime(const AddonInstance_InputStream* instance, int ms) - { - return static_cast(instance->toAddon->addonInstance)->PosTime(ms); - } - - inline static int ADDON_GetChapter(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetChapter(); - } - - inline static int ADDON_GetChapterCount(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetChapterCount(); - } - - inline static const char* ADDON_GetChapterName(const AddonInstance_InputStream* instance, int ch) - { - return static_cast(instance->toAddon->addonInstance)->GetChapterName(ch); - } - - inline static int64_t ADDON_GetChapterPos(const AddonInstance_InputStream* instance, int ch) - { - return static_cast(instance->toAddon->addonInstance)->GetChapterPos(ch); - } - - inline static bool ADDON_SeekChapter(const AddonInstance_InputStream* instance, int ch) - { - return static_cast(instance->toAddon->addonInstance)->SeekChapter(ch); - } - - inline static int ADDON_ReadStream(const AddonInstance_InputStream* instance, - uint8_t* buffer, - unsigned int bufferSize) - { - return static_cast(instance->toAddon->addonInstance) - ->ReadStream(buffer, bufferSize); - } - - inline static int64_t ADDON_SeekStream(const AddonInstance_InputStream* instance, - int64_t position, - int whence) - { - return static_cast(instance->toAddon->addonInstance) - ->SeekStream(position, whence); - } - - inline static int64_t ADDON_PositionStream(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->PositionStream(); - } - - inline static int64_t ADDON_LengthStream(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->LengthStream(); - } - - inline static int ADDON_GetBlockSize(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetBlockSize(); - } - - inline static bool ADDON_IsRealTimeStream(const AddonInstance_InputStream* instance) - { - return static_cast(instance->toAddon->addonInstance)->IsRealTimeStream(); - } - - AddonInstance_InputStream* m_instanceData; -}; -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h deleted file mode 100644 index 3d9c19ba888ab..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h +++ /dev/null @@ -1,3581 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../c-api/addon-instance/pvr.h" -#include "pvr/ChannelGroups.h" -#include "pvr/Channels.h" -#include "pvr/EDL.h" -#include "pvr/EPG.h" -#include "pvr/General.h" -#include "pvr/MenuHook.h" -#include "pvr/Providers.h" -#include "pvr/Recordings.h" -#include "pvr/Stream.h" -#include "pvr/Timers.h" - -#ifdef __cplusplus - -/*! - * @internal - * @brief PVR "C++" API interface - * - * In this field are the pure addon-side C++ data. - * - * @note Changes can be made without problems and have no influence on other - * PVR addons that have already been created.\n - * \n - * Therefore, @ref ADDON_INSTANCE_VERSION_PVR_MIN can be ignored for these - * fields and only the @ref ADDON_INSTANCE_VERSION_PVR needs to be increased.\n - * \n - * Only must be min version increased if a new compile of addon breaks after - * changes here. - * - * Have by add of new parts a look about **Doxygen** `\@ingroup`, so that - * added parts included in documentation. - * - * If you add addon side related documentation, where his dev need know, use `///`. - * For parts only for Kodi make it like here. - * - * @endinternal - */ - -namespace kodi -{ -namespace addon -{ - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Doxygen group set for the definitions -//{{{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_pvr -/// @brief **PVR client add-on instance definition values**\n -/// All PVR functions associated data structures. -/// -/// Used to exchange the available options between Kodi and addon.\n -/// The groups described here correspond to the groups of functions on PVR -/// instance class. -/// - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_General 1. General -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR add-on general variables**\n -/// Used to exchange the available options between Kodi and addon. -/// -/// This group also includes @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities with -/// which Kodi an @ref kodi::addon::CInstancePVRClient::GetCapabilities() -/// queries the supported **modules** of the addon. -/// -/// The standard values are also below, once for error messages and once to -/// @ref kodi::addon::CInstancePVRClient::ConnectionStateChange() to give Kodi -/// any information. -/// -///@{ -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream class PVRStreamProperty & definition PVR_STREAM_PROPERTY -/// @ingroup cpp_kodi_addon_pvr_Defs_General -/// @brief **Inputstream variables**\n -/// This includes values related to the outside of PVR available inputstream -/// system. -/// -/// This can be by separate instance on same addon, by handling in Kodi itself -/// or to reference of another addon where support needed inputstream. -/// -/// @note This is complete independent from own system included here -/// @ref cpp_kodi_addon_pvr_Streams "inputstream". -/// -//------------------------------------------------------------------------------ -///@} - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_Channel 2. Channel -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR add-on channel**\n -/// Used to exchange the available channel options between Kodi and addon. -/// -/// Modules here are mainly intended for @ref cpp_kodi_addon_pvr_Channels "channels", -/// but are also used on other modules to identify the respective TV/radio -/// channel. -/// -/// Because of @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus and -/// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo is a special case at -/// this point. This is currently only used on running streams, but it may be -/// possible that this must always be usable in connection with PiP in the -/// future. -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup 3. Channel Group -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR add-on channel group**\n -/// This group contains data classes and values which are used in PVR on -/// @ref cpp_kodi_addon_pvr_supportsChannelGroups "channel groups". -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_epg 4. EPG Tag -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR add-on EPG data**\n -/// Used on @ref cpp_kodi_addon_pvr_EPGTag "EPG methods in PVR instance class". -/// -/// See related modules about, also below in this view are few macros where -/// default values of associated places. -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_Recording 5. Recording -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **Representation of a recording**\n -/// Used to exchange the available recording data between Kodi and addon on -/// @ref cpp_kodi_addon_pvr_Recordings "Recordings methods in PVR instance class". -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_Timer 6. Timer -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR add-on timer data**\n -/// Used to exchange the available timer data between Kodi and addon on -/// @ref cpp_kodi_addon_pvr_Timers "Timers methods in PVR instance class". -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook 7. Menuhook -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **PVR Context menu data**\n -/// Define data for the context menus available to the user -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry 8. Edit decision list (EDL) -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **An edit decision list or EDL is used in the post-production process -/// of film editing and video editing**\n -/// Used on @ref kodi::addon::CInstancePVRClient::GetEPGTagEdl and -/// @ref kodi::addon::CInstancePVRClient::GetRecordingEdl -/// -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_pvr_Defs_Stream 9. Inputstream -/// @ingroup cpp_kodi_addon_pvr_Defs -/// @brief **Inputstream**\n -/// This includes classes and values that are used in the PVR inputstream. -/// -/// Used on @ref cpp_kodi_addon_pvr_Streams "Inputstream methods in PVR instance class". -/// -/// @note The parts here will be removed in the future and replaced by the -/// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance". -/// If there is already a possibility, new addons should do it via the -/// inputstream instance. -/// -//------------------------------------------------------------------------------ - -//}}} -//______________________________________________________________________________ - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" PVR addon instance class -//{{{ - -//============================================================================== -/// @addtogroup cpp_kodi_addon_pvr -/// @brief \cpp_class{ kodi::addon::CInstancePVRClient } -/// **PVR client add-on instance** -/// -/// Kodi features powerful [Live TV](https://kodi.wiki/view/Live_TV) and -/// [video recording (DVR/PVR)](http://en.wikipedia.org/wiki/Digital_video_recorder) -/// abilities using a very flexible distributed application structure. That is, by -/// leveraging other existing third-party -/// [PVR backend applications](https://kodi.wiki/view/PVR_backend) or -/// [DVR devices](https://kodi.wiki/view/PVR_backend) -/// that specialize in receiving television signals and also support the same type -/// of [client–server model](http://en.wikipedia.org/wiki/client%E2%80%93server_model) -/// which Kodi uses, (following a [frontend-backend](http://en.wikipedia.org/wiki/Front_and_back_ends) -/// design principle for [separation of concerns](http://en.wikipedia.org/wiki/Separation_of_concerns)), -/// these PVR features in Kodi allow you to watch Live TV, listen to radio, view an EPG TV-Guide -/// and schedule recordings, and also enables many other TV related features, all using -/// Kodi as your primary interface once the initial pairing connection and -/// configuration have been done. -/// -/// @note It is very important to understand that with "Live TV" in the reference -/// to PVR in Kodi, we do not mean [streaming video](http://en.wikipedia.org/wiki/Streaming_media) -/// from the internet via websites providing [free content](https://kodi.wiki/view/Free_content) -/// or online services such as Netflix, Hulu, Vudu and similar, no matter if that -/// content is actually streamed live or not. If that is what you are looking for -/// then you might want to look into [Video Addons](https://kodi.wiki/view/Add-ons) -/// for Kodi instead, (which again is not the same as the "PVR" or "Live TV" we -/// discuss in this article), but remember that [Kodi does not provide any video -/// content or video streaming services](https://kodi.wiki/view/Free_content). -/// -/// The use of the PVR is based on the @ref CInstancePVRClient. -/// -/// Include the header @ref PVR.h "#include " -/// to use this class. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// Here is an example of what the `addon.xml.in` would look like for an PVR addon: -/// -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// @ADDON_DEPENDS@ -/// -/// -/// My PVR addon addon -/// My PVR addon description -/// @PLATFORM@ -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// -/// At `` the basic instance definition is declared, this is intended to identify the addon as an PVR and to see its supported types: -/// | Name | Description -/// |------|---------------------- -/// | `point` | The identification of the addon instance to inputstream is mandatory `kodi.pvrclient`. In addition, the instance declared in the first `` is also the main type of addon. -/// | `library_@PLATFORM@` | The runtime library used for the addon. This is usually declared by cmake and correctly displayed in the translated `addon.xml`. -/// -/// -/// @remark For more detailed description of the `addon.xml`, see also https://kodi.wiki/view/Addon.xml. -/// -/// -/// -------------------------------------------------------------------------- -/// -/// **Example:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient -/// { -/// public: -/// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion); -/// -/// PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) override; -/// PVR_ERROR GetBackendName(std::string& name) override; -/// PVR_ERROR GetBackendVersion(std::string& version) override; -/// -/// PVR_ERROR GetProvidersAmount(int& amount) override; -/// PVR_ERROR GetProviders(std::vector& providers) override; -/// PVR_ERROR GetChannelsAmount(int& amount) override; -/// PVR_ERROR GetChannels(bool radio, std::vector& channels) override; -/// PVR_ERROR GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, -/// std::vector& properties) override; -/// -/// private: -/// std::vector m_myChannels; -/// }; -/// -/// CMyPVRClient::CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion) -/// : CInstancePVRClient(instance, kodiVersion) -/// { -/// kodi::addon::PVRChannel channel; -/// channel.SetUniqueId(123); -/// channel.SetChannelNumber(1); -/// channel.SetChannelName("My test channel"); -/// m_myChannels.push_back(channel); -/// } -/// -/// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities) -/// { -/// capabilities.SetSupportsTV(true); -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name) -/// { -/// name = "My special PVR client"; -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version) -/// { -/// version = "1.0.0"; -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyInstance::GetProvidersAmount(int& amount) -/// { -/// amount = m_myProviders.size(); -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyPVRClient::GetProviders(std::vector& providers) -/// { -/// providers = m_myProviders; -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyInstance::GetChannelsAmount(int& amount) -/// { -/// amount = m_myChannels.size(); -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyPVRClient::GetChannels(bool radio, std::vector& channels) -/// { -/// channels = m_myChannels; -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// PVR_ERROR CMyPVRClient::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, -/// std::vector& properties) -/// { -/// if (channel.GetUniqueId() == 123) -/// { -/// properties.push_back(PVR_STREAM_PROPERTY_STREAMURL, "http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4"); -/// properties.push_back(PVR_STREAM_PROPERTY_ISREALTIMESTREAM, "true"); -/// return PVR_ERROR_NO_ERROR; -/// } -/// return PVR_ERROR_UNKNOWN; -/// } -/// -/// ... -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public ::kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() = default; -/// ADDON_STATUS CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_PVR) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Creating my PVR client instance"); -/// addonInstance = new CMyPVRClient(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyPVRClient` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -class ATTRIBUTE_HIDDEN CInstancePVRClient : public IAddonInstance -{ -public: - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Base 1. Basic functions - /// @ingroup cpp_kodi_addon_pvr - /// @brief **Functions to manage the addon and get basic information about it**\n - /// These are e.g. @ref GetCapabilities to know supported groups at - /// this addon or the others to get information about the source of the PVR - /// stream. - /// - /// The with "Valid implementation required." declared functions are mandatory, - /// all others are an option. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Basic parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Base_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Base_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief PVR client class constructor. - /// - /// Used by an add-on that only supports only PVR and only in one instance. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// ... - /// - /// class ATTRIBUTE_HIDDEN CPVRExample - /// : public kodi::addon::CAddonBase, - /// public kodi::addon::CInstancePVRClient - /// { - /// public: - /// CPVRExample() - /// { - /// } - /// - /// ~CPVRExample() override; - /// { - /// } - /// - /// ... - /// }; - /// - /// ADDONCREATOR(CPVRExample) - /// ~~~~~~~~~~~~~ - /// - CInstancePVRClient() : IAddonInstance(ADDON_INSTANCE_PVR, GetKodiTypeVersion(ADDON_INSTANCE_PVR)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of more as one in single " - "instance way is not allowed!"); - - SetAddonStruct(CAddonBase::m_interface->firstKodiInstance, m_kodiVersion); - CAddonBase::m_interface->globalSingleInstance = this; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief PVR client class constructor used to support multiple instance - /// types. - /// - /// @param[in] instance The instance value given to - /// `kodi::addon::CAddonBase::CreateInstance(...)`. - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - /// @note Recommended to set `kodiVersion`. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient - /// { - /// public: - /// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion) - /// : CInstancePVRClient(instance, kodiVersion) - /// { - /// ... - /// } - /// - /// ... - /// }; - /// - /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, - /// const std::string& instanceID, - /// KODI_HANDLE instance, - /// const std::string& version, - /// KODI_HANDLE& addonInstance) - /// { - /// kodi::Log(ADDON_LOG_INFO, "Creating my PVR client instance"); - /// addonInstance = new CMyPVRClient(instance, version); - /// return ADDON_STATUS_OK; - /// } - /// ~~~~~~~~~~~~~ - /// - explicit CInstancePVRClient(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_PVR, - !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_PVR)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of multiple together with " - "single instance way is not allowed!"); - - SetAddonStruct(instance, m_kodiVersion); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Destructor - /// - ~CInstancePVRClient() override = default; - //---------------------------------------------------------------------------- - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @brief Get the list of features that this add-on provides. - /// - /// Called by Kodi to query the add-on's capabilities. - /// Used to check which options should be presented in the UI, which methods to call, etc. - /// All capabilities that the add-on supports should be set to true. - /// - /// @param capabilities The with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities defined add-on's capabilities. - /// @return @ref PVR_ERROR_NO_ERROR if the properties were fetched successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities) - /// { - /// capabilities.SetSupportsTV(true); - /// capabilities.SetSupportsEPG(true); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ~~~~~~~~~~~~~ - /// - /// -------------------------------------------------------------------------- - /// - /// @note Valid implementation required. - /// - virtual PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the name reported by the backend that will be displayed in the UI. - /// - /// @param[out] name The name reported by the backend that will be displayed in the UI. - /// @return @ref PVR_ERROR_NO_ERROR if successfully done - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name) - /// { - /// name = "My special PVR client"; - /// return PVR_ERROR_NO_ERROR; - /// } - /// ~~~~~~~~~~~~~ - /// - /// -------------------------------------------------------------------------- - /// - /// @note Valid implementation required. - /// - virtual PVR_ERROR GetBackendName(std::string& name) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the version string reported by the backend that will be - /// displayed in the UI. - /// - /// @param[out] version The version string reported by the backend that will be - /// displayed in the UI. - /// @return @ref PVR_ERROR_NO_ERROR if successfully done - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version) - /// { - /// version = "1.0.0"; - /// return PVR_ERROR_NO_ERROR; - /// } - /// ~~~~~~~~~~~~~ - /// - /// -------------------------------------------------------------------------- - /// - /// @note Valid implementation required. - /// - virtual PVR_ERROR GetBackendVersion(std::string& version) = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the hostname of the pvr backend server - /// - /// @param[out] hostname Hostname as ip address or alias. If backend does not - /// utilize a server, return empty string. - /// @return @ref PVR_ERROR_NO_ERROR if successfully done - /// - virtual PVR_ERROR GetBackendHostname(std::string& hostname) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief To get the connection string reported by the backend that will be - /// displayed in the UI. - /// - /// @param[out] connection The connection string reported by the backend that - /// will be displayed in the UI. - /// @return @ref PVR_ERROR_NO_ERROR if successfully done - /// - virtual PVR_ERROR GetConnectionString(std::string& connection) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the disk space reported by the backend (if supported). - /// - /// @param[in] total The total disk space in KiB. - /// @param[in] used The used disk space in KiB. - /// @return @ref PVR_ERROR_NO_ERROR if the drive space has been fetched - /// successfully. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// PVR_ERROR CMyPVRClient::GetDriveSpace(uint64_t& total, uint64_t& used) - /// { - /// total = 100 * 1024 * 1024; // To set complete size of drive in KiB (100GB) - /// used = 12232424; // To set the used amount - /// return PVR_ERROR_NO_ERROR; - /// } - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetDriveSpace(uint64_t& total, uint64_t& used) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Call one of the settings related menu hooks (if supported). - /// - /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook "menu hook " - /// instances have to be added in `constructor()`, by calling @ref AddMenuHook() - /// on the callback. - /// - /// @param[in] menuhook The hook to call. - /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// PVR_ERROR CMyPVRClient::CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) - /// { - /// if (menuhook.GetHookId() == 2) - /// kodi::QueueNotification(QUEUE_INFO, "", kodi::GetLocalizedString(menuhook.GetLocalizedStringId())); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\nAdd or replace a menu hook for the context menu for this add-on - /// - /// This is a callback function, called from addon to give Kodi his context menu's. - /// - /// @param[in] menuhook The with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook defined hook to add - /// - /// @remarks Only called from addon itself - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here's an example of the use of it:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// ... - /// - /// { - /// kodi::addon::PVRMenuhook hook; - /// hook.SetHookId(1); - /// hook.SetCategory(PVR_MENUHOOK_CHANNEL); - /// hook.SetLocalizedStringId(30000); - /// AddMenuHook(hook); - /// } - /// - /// { - /// kodi::addon::PVRMenuhook hook; - /// hook.SetHookId(2); - /// hook.SetCategory(PVR_MENUHOOK_SETTING); - /// hook.SetLocalizedStringId(30001); - /// AddMenuHook(hook); - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - /// **Here another way:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// ... - /// - /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30000, PVR_MENUHOOK_CHANNEL)); - /// AddMenuHook(kodi::addon::PVRMenuhook(2, 30001, PVR_MENUHOOK_SETTING)); - /// ... - /// ~~~~~~~~~~~~~ - /// - inline void AddMenuHook(const kodi::addon::PVRMenuhook& hook) - { - m_instanceData->toKodi->AddMenuHook(m_instanceData->toKodi->kodiInstance, hook); - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Notify a state change for a PVR backend connection. - /// - /// @param[in] connectionString The connection string reported by the backend - /// that can be displayed in the UI. - /// @param[in] newState The by @ref PVR_CONNECTION_STATE defined new state. - /// @param[in] message A localized addon-defined string representing the new - /// state, that can be displayed in the UI or **empty** if - /// the Kodi-defined default string for the new state - /// shall be displayed. - /// - /// @remarks Only called from addon itself - /// - /// - /// -------------------------------------------------------------------------- - /// - /// - /// **Here's an example of the use of it:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// #include /* for kodi::GetLocalizedString(...) */ - /// ... - /// - /// ConnectionStateChange("PVR demo connection lost", PVR_CONNECTION_STATE_DISCONNECTED, kodi::GetLocalizedString(30005, "Lost connection to Server");); - /// ... - /// ~~~~~~~~~~~~~ - /// - inline void ConnectionStateChange(const std::string& connectionString, - PVR_CONNECTION_STATE newState, - const std::string& message) - { - m_instanceData->toKodi->ConnectionStateChange( - m_instanceData->toKodi->kodiInstance, connectionString.c_str(), newState, message.c_str()); - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Get user data path of the PVR addon. - /// - /// @return Path of current Kodi user - /// - /// @remarks Only called from addon itself - /// - /// @note Alternatively, @ref kodi::GetAddonPath() can be used for this. - /// - inline std::string UserPath() const { return m_instanceData->props->strUserPath; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Get main client path of the PVR addon. - /// - /// @return Path of addon client - /// - /// @remarks Only called from addon itself. - /// - /// @note Alternatively, @ref kodi::GetBaseUserPath() can be used for this. - /// - inline std::string ClientPath() const { return m_instanceData->props->strClientPath; } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Channels 2. Channels (required) - /// @ingroup cpp_kodi_addon_pvr - /// @brief **Functions to get available TV or Radio channels**\n - /// These are mandatory functions for using this addon to get the available - /// channels. - /// - /// @remarks Either @ref PVRCapabilities::SetSupportsTV "SetSupportsTV()" or - /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio()" is required to - /// be set to `true`.\n - /// If a channel changes after the initial import, or if a new one was added, - /// then the add-on should call @ref TriggerChannelUpdate(). - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Channel parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Channels_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Channels_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief The total amount of providers on the backend - /// - /// @param[out] amount The total amount of providers on the backend - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsProviders - /// "supportsProviders" is set to true. - /// - virtual PVR_ERROR GetProvidersAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Request the list of all providers from the backend. - /// - /// @param[out] results The channels defined with @ref - /// cpp_kodi_addon_pvr_Defs_PVRProviders - /// and available at the addon, then transferred with - /// @ref cpp_kodi_addon_pvr_Defs_PVRProvidersResultSet. - /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsProviders - /// "supportsProviders" is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRProviders_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetProviders(kodi::addon::PVRProvidersResultSet& results) - /// { - /// // Minimal demo example, in reality bigger and loop to transfer all - /// kodi::addon::PVRProvider provider; - /// provider.SetUniqueId(123); - /// provider.SetProviderName("My provider name"); - /// provider.SetProviderType(PVR_PROVIDER_TYPE_SATELLITE); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(provider); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetProviders(kodi::addon::PVRProvidersResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Request Kodi to update it's list of providers. - /// - /// @remarks Only called from addon itself. - /// - inline void TriggerProvidersUpdate() - { - m_instanceData->toKodi->TriggerProvidersUpdate(m_instanceData->toKodi->kodiInstance); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief The total amount of channels on the backend - /// - /// @param[out] amount The total amount of channels on the backend - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @remarks Valid implementation required. - /// - virtual PVR_ERROR GetChannelsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Request the list of all channels from the backend. - /// - /// @param[in] radio True to get the radio channels, false to get the TV channels. - /// @param[out] results The channels defined with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel - /// and available at the addon, them transferred with - /// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet. - /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks - /// If @ref PVRCapabilities::SetSupportsTV() is set to - /// `true`, a valid result set needs to be provided for `radio = false`.\n - /// If @ref PVRCapabilities::SetSupportsRadio() is set to - /// `true`, a valid result set needs to be provided for `radio = true`. - /// At least one of these two must provide a valid result set. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) - /// { - /// // Minimal demo example, in reality bigger and loop to transfer all - /// kodi::addon::PVRChannel channel; - /// channel.SetUniqueId(123); - /// channel.SetIsRadio(false); - /// channel.SetChannelNumber(1); - /// channel.SetChannelName("My channel name"); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(channel); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the stream properties for a channel from the backend. - /// - /// @param[in] channel The channel to get the stream properties for. - /// @param[out] properties the properties required to play the stream. - /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. - /// - /// @remarks If @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" or - /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" are set to true - /// and @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" is - /// set to false.\n\n - /// In this case the implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL - /// with the URL Kodi should resolve to playback the channel. - /// - /// @note The value directly related to inputstream must always begin with the - /// name of the associated add-on, e.g. `"inputstream.adaptive.manifest_update_parameter"`. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, - /// std::vector& properties) - /// { - /// ... - /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); - /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); - /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); - /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetChannelStreamProperties( - const kodi::addon::PVRChannel& channel, - std::vector& properties) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the signal status of the stream that's currently open. - /// - /// @param[out] signalStatus The signal status. - /// @return @ref PVR_ERROR_NO_ERROR if the signal status has been read successfully, false otherwise. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" - /// is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// ... - /// - /// class ATTRIBUTE_HIDDEN CPVRExample - /// : public kodi::addon::CAddonBase, - /// public kodi::addon::CInstancePVRClient - /// { - /// public: - /// ... - /// PVR_ERROR SignalStatus(PVRSignalStatus &signalStatus) override - /// { - /// signalStatus.SetAapterName("Example adapter 1"); - /// signalStatus.SetAdapterStatus("OK"); - /// signalStatus.SetSignal(0xFFFF); // 100% - /// - /// return PVR_ERROR_NO_ERROR; - /// } - /// }; - /// - /// ADDONCREATOR(CPVRExample) - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetSignalStatus(int channelUid, kodi::addon::PVRSignalStatus& signalStatus) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the descramble information of the stream that's currently open. - /// - /// @param[out] descrambleInfo The descramble information. - /// @return @ref PVR_ERROR_NO_ERROR if the descramble information has been - /// read successfully, false otherwise. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsDescrambleInfo "supportsDescrambleInfo" - /// is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help - /// - virtual PVR_ERROR GetDescrambleInfo(int channelUid, - kodi::addon::PVRDescrambleInfo& descrambleInfo) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Request Kodi to update it's list of channels. - /// - /// @remarks Only called from addon itself. - /// - inline void TriggerChannelUpdate() - { - m_instanceData->toKodi->TriggerChannelUpdate(m_instanceData->toKodi->kodiInstance); - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_supportsChannelGroups 3. Channel Groups (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" - /// to true\n - /// This is used to divide available addon channels into groups, which can - /// then be selected by the user. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Channel group parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Get the total amount of channel groups on the backend if it supports channel groups. - /// - /// @param[out] amount The total amount of channel groups on the backend - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" is set to true. - /// - virtual PVR_ERROR GetChannelGroupsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get a list of available channel groups on addon - /// - /// Request the list of all channel groups from the backend if it supports - /// channel groups. - /// - /// @param[in] radio True to get the radio channel groups, false to get the - /// TV channel groups. - /// @param[out] results List of available groups on addon defined with - /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup, - /// them transferred with - /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet. - /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" - /// is set to true. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& groups) - /// { - /// kodi::addon::PVRChannelGroup group; - /// group.SetIsRadio(false); - /// group.SetGroupName("My group name"); - /// group.SetPosition(1); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(group); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get a list of members on a group - /// - /// Request the list of all group members of a group from the backend if it - /// supports channel groups. - /// - /// @param[in] group The group to get the members for. - /// @param[out] results List of available group member channels defined with - /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember, - /// them transferred with - /// @ref PVRChannelGroupMembersResultSet. - /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" - /// is set to true. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group, - /// kodi::addon::PVRChannelGroupMembersResultSet& results) - /// { - /// for (const auto& myGroup : m_myGroups) - /// { - /// if (myGroup.strGroupName == group.GetGroupName()) - /// { - /// for (unsigned int iChannelPtr = 0; iChannelPtr < myGroup.members.size(); iChannelPtr++) - /// { - /// int iId = myGroup.members.at(iChannelPtr) - 1; - /// if (iId < 0 || iId > (int)m_channels.size() - 1) - /// continue; - /// - /// PVRDemoChannel &channel = m_channels.at(iId); - /// kodi::addon::PVRChannelGroupMember kodiGroupMember; - /// kodiGroupMember.SetGroupName(group.GetGroupName()); - /// kodiGroupMember.SetChannelUniqueId(channel.iUniqueId); - /// kodiGroupMember.SetChannelNumber(channel.iChannelNumber); - /// kodiGroupMember.SetSubChannelNumber(channel.iSubChannelNumber); - /// - /// results.Add(kodiGroupMember); - /// } - /// } - /// } - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group, - kodi::addon::PVRChannelGroupMembersResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Request Kodi to update it's list of channel groups. - /// - /// @remarks Only called from addon itself - /// - inline void TriggerChannelGroupsUpdate() - { - m_instanceData->toKodi->TriggerChannelGroupsUpdate(m_instanceData->toKodi->kodiInstance); - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_supportsChannelEdit 4. Channel edit (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" - /// to true or for @ref OpenDialogChannelScan() set @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan" - /// to true\n - /// The support of this is a pure option and not mandatory. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Channel edit parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Delete a channel from the backend. - /// - /// @param[in] channel The channel to delete. - /// @return @ref PVR_ERROR_NO_ERROR if the channel has been deleted successfully. - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" - /// is set to true. - /// - virtual PVR_ERROR DeleteChannel(const kodi::addon::PVRChannel& channel) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Rename a channel on the backend. - /// - /// @param[in] channel The channel to rename, containing the new channel name. - /// @return @ref PVR_ERROR_NO_ERROR if the channel has been renamed successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" - /// is set to true. - /// - virtual PVR_ERROR RenameChannel(const kodi::addon::PVRChannel& channel) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Show the channel settings dialog, if supported by the backend. - /// - /// @param[in] channel The channel to show the dialog for. - /// @return @ref PVR_ERROR_NO_ERROR if the dialog has been displayed successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true. - /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. - /// - virtual PVR_ERROR OpenDialogChannelSettings(const kodi::addon::PVRChannel& channel) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Show the dialog to add a channel on the backend, if supported by the backend. - /// - /// @param[in] channel The channel to add. - /// @return @ref PVR_ERROR_NO_ERROR if the channel has been added successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true. - /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. - /// - virtual PVR_ERROR OpenDialogChannelAdd(const kodi::addon::PVRChannel& channel) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Show the channel scan dialog if this backend supports it. - /// - /// @return @ref PVR_ERROR_NO_ERROR if the dialog was displayed successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan" is set to true. - /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. - /// - virtual PVR_ERROR OpenDialogChannelScan() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Call one of the channel related menu hooks (if supported). - /// - /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in - /// `constructor()`, by calling @ref AddMenuHook() on the callback. - /// - /// @param[in] menuhook The hook to call. - /// @param[in] item The selected channel item for which the hook was called. - /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - virtual PVR_ERROR CallChannelMenuHook(const kodi::addon::PVRMenuhook& menuhook, - const kodi::addon::PVRChannel& item) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_EPGTag 4. EPG methods (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief **PVR EPG methods**\n - /// These C ++ class functions of are intended for processing EPG information - /// and for giving it to Kodi. - /// - /// The necessary data is transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag. - /// - /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" - /// is set to true.\n\n - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **EPG parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_EPGTag_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_EPGTag_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Request the EPG for a channel from the backend. - /// - /// @param[in] channelUid The UID of the channel to get the EPG table for. - /// @param[in] start Get events after this time (UTC). - /// @param[in] end Get events before this time (UTC). - /// @param[out] results List where available EPG information becomes - /// transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag - /// and given to Kodi - /// @return @ref PVR_ERROR_NO_ERROR if the table has been fetched successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetEPGForChannel(int channelUid, - /// time_t start, - /// time_t end, - /// kodi::addon::PVREPGTagsResultSet& results) - /// { - /// // Minimal demo example, in reality bigger, loop to transfer all and to - /// // match wanted times. - /// kodi::addon::PVREPGTag tag; - /// tag.SetUniqueBroadcastId(123); - /// tag.SetUniqueChannelId(123); - /// tag.SetTitle("My epg entry name"); - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); - /// tag.SetStartTime(1589148283); // Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC - /// tag.SetEndTime(1589151913); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(tag); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetEPGForChannel(int channelUid, - time_t start, - time_t end, - kodi::addon::PVREPGTagsResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Check if the given EPG tag can be recorded. - /// - /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check. - /// @param[out] isRecordable Set to true if the tag can be recorded. - /// @return @ref PVR_ERROR_NO_ERROR if bIsRecordable has been set successfully. - /// - /// @remarks Optional, it return @ref PVR_ERROR_NOT_IMPLEMENTED by parent to let Kodi decide. - /// - virtual PVR_ERROR IsEPGTagRecordable(const kodi::addon::PVREPGTag& tag, bool& isRecordable) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Check if the given EPG tag can be played. - /// - /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check. - /// @param[out] isPlayable Set to true if the tag can be played. - /// @return @ref PVR_ERROR_NO_ERROR if bIsPlayable has been set successfully. - /// - /// @remarks Required if add-on supports playing epg tags. - /// - virtual PVR_ERROR IsEPGTagPlayable(const kodi::addon::PVREPGTag& tag, bool& isPlayable) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Retrieve the edit decision list (EDL) of an EPG tag on the backend. - /// - /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag". - /// @param[out] edl The function has to write the EDL into this array. - /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true. - /// - virtual PVR_ERROR GetEPGTagEdl(const kodi::addon::PVREPGTag& tag, - std::vector& edl) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the stream properties for an epg tag from the backend. - /// - /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to get the stream properties for. - /// @param[out] properties the properties required to play the stream. - /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. - /// - /// @remarks Required if add-on supports playing epg tags. - /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL - /// with the URL Kodi should resolve to playback the epg tag. - /// It return @ref PVR_ERROR_NOT_IMPLEMENTED from parent if this add-on won't provide this function. - /// - /// @note The value directly related to inputstream must always begin with the - /// name of the associated add-on, e.g. `"inputstream.adaptive.manifest_update_parameter"`. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetEPGTagStreamProperties(const kodi::addon::PVREPGTag& tag, - /// std::vector& properties) - /// { - /// ... - /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); - /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); - /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); - /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetEPGTagStreamProperties( - const kodi::addon::PVREPGTag& tag, std::vector& properties) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Tell the client the past time frame to use when notifying epg events back to Kodi - /// - /// The client might push epg events asynchronously to Kodi using the callback function - /// @ref EpgEventStateChange. To be able to only push events that are actually of - /// interest for Kodi, client needs to know about the epg time frame Kodi uses. Kodi supplies - /// the current epg max past time frame value @ref EpgMaxPastDays() when creating the addon - /// and calls @ref SetEPGMaxPastDays later whenever Kodi's epg time frame value changes. - /// - /// @param[in] pastDays number of days before "now". @ref EPG_TIMEFRAME_UNLIMITED means that Kodi - /// is interested in all epg events, regardless of event times. - /// @return @ref PVR_ERROR_NO_ERROR if new value was successfully set. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true. - /// - virtual PVR_ERROR SetEPGMaxPastDays(int pastDays) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Tell the client the future time frame to use when notifying epg events back to Kodi - /// - /// The client might push epg events asynchronously to Kodi using the callback function - /// @ref EpgEventStateChange. To be able to only push events that are actually of - /// interest for Kodi, client needs to know about the epg time frame Kodi uses. Kodi supplies - /// the current epg max future time frame value @ref EpgMaxFutureDays() when creating the addon - /// and calls @ref SetEPGMaxFutureDays later whenever Kodi's epg time frame value changes. - /// - /// @param[in] futureDays number of days from "now". @ref EPG_TIMEFRAME_UNLIMITED means that Kodi - /// is interested in all epg events, regardless of event times. - /// @return @ref PVR_ERROR_NO_ERROR if new value was successfully set. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true. - /// - virtual PVR_ERROR SetEPGMaxFutureDays(int futureDays) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Call one of the EPG related menu hooks (if supported). - /// - /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in - /// `constructor()`, by calling @ref AddMenuHook() on the callback. - /// - /// @param[in] menuhook The hook to call. - /// @param[in] tag The selected EPG item for which the hook was called. - /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - virtual PVR_ERROR CallEPGMenuHook(const kodi::addon::PVRMenuhook& menuhook, - const kodi::addon::PVREPGTag& tag) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Get the Max past days handled by Kodi. - /// - /// If > @ref EPG_TIMEFRAME_UNLIMITED, in async epg mode, deliver only events in the - /// range from 'end time > now - EpgMaxPastDays()' to 'start time < now + EpgMaxFutureDays(). - /// @ref EPG_TIMEFRAME_UNLIMITED, notify all events. - /// - /// @return The Max past days handled by Kodi - /// - inline int EpgMaxPastDays() const { return m_instanceData->props->iEpgMaxPastDays; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Get the Max future days handled by Kodi. - /// - /// If > @ref EPG_TIMEFRAME_UNLIMITED, in async epg mode, deliver only events in the - /// range from 'end time > now - EpgMaxPastDays()' to 'start time < now + EpgMaxFutureDays(). - /// @ref EPG_TIMEFRAME_UNLIMITED, notify all events. - /// - /// @return The Max future days handled by Kodi - /// - inline int EpgMaxFutureDays() const { return m_instanceData->props->iEpgMaxFutureDays; } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Schedule an EPG update for the given channel channel. - /// - /// @param[in] channelUid The unique id of the channel for this add-on - /// - /// @remarks Only called from addon itself - /// - inline void TriggerEpgUpdate(unsigned int channelUid) - { - m_instanceData->toKodi->TriggerEpgUpdate(m_instanceData->toKodi->kodiInstance, channelUid); - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief **Callback to Kodi Function**\n - /// Notify a state change for an EPG event. - /// - /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag" where have event. - /// @param[in] newState The new state. - /// - For @ref EPG_EVENT_CREATED and @ref EPG_EVENT_UPDATED, tag must be filled with all available event data, not just a delta. - /// - For @ref EPG_EVENT_DELETED, it is sufficient to fill @ref kodi::addon::PVREPGTag::SetUniqueBroadcastId - /// - /// @remarks Only called from addon itself, - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// - /// void CMyPVRInstance::MyProcessFunction() - /// { - /// ... - /// kodi::addon::PVREPGTag tag; // Here as mini add, in real it should be a complete tag - /// tag.SetUniqueId(123); - /// - /// // added namespace here not needed to have, only to have more clear for where is - /// kodi::addon::CInstancePVRClient::EpgEventStateChange(tag, EPG_EVENT_UPDATED); - /// ... - /// } - /// - /// ... - /// ~~~~~~~~~~~~~ - /// - inline void EpgEventStateChange(kodi::addon::PVREPGTag& tag, EPG_EVENT_STATE newState) - { - m_instanceData->toKodi->EpgEventStateChange(m_instanceData->toKodi->kodiInstance, tag.GetTag(), - newState); - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Recordings 5. Recordings (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief **PVR recording methods**\n - /// To transfer available recordings of the PVR backend and to allow possible - /// playback. - /// - /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" - /// is set to true.\n\n - /// If a recordings changes after the initial import, or if a new one was added, - /// then the add-on should call @ref TriggerRecordingUpdate(). - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Recordings parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Recordings_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Recordings_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief To get amount of recording present on backend - /// - /// @param[in] deleted if set return deleted recording (called if - /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" - /// set to true) - /// @param[out] amount The total amount of recordings on the backend - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" is set to true. - /// - virtual PVR_ERROR GetRecordingsAmount(bool deleted, int& amount) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Request the list of all recordings from the backend, if supported. - /// - /// Recording entries are added to Kodi by calling TransferRecordingEntry() on the callback. - /// - /// @param[in] deleted if set return deleted recording (called if - /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" - /// set to true) - /// @param[out] results List of available recordings with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet - /// and given to Kodi - /// @return @ref PVR_ERROR_NO_ERROR if the recordings have been fetched successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" - /// is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) - /// { - /// // Minimal demo example, in reality bigger and loop to transfer all - /// kodi::addon::PVRRecording recording; - /// recording.SetRecordingId(123); - /// recording.SetTitle("My recording name"); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(recording); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Delete a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to delete. - /// @return @ref PVR_ERROR_NO_ERROR if the recording has been deleted successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" - /// is set to true. - /// - virtual PVR_ERROR DeleteRecording(const kodi::addon::PVRRecording& recording) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Undelete a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to undelete. - /// @return @ref PVR_ERROR_NO_ERROR if the recording has been undeleted successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" - /// is set to true. - /// - virtual PVR_ERROR UndeleteRecording(const kodi::addon::PVRRecording& recording) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Delete all recordings permanent which in the deleted folder on the backend. - /// - /// @return @ref PVR_ERROR_NO_ERROR if the recordings has been deleted successfully. - /// - virtual PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Rename a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// to rename, containing the new name. - /// @return @ref PVR_ERROR_NO_ERROR if the recording has been renamed successfully. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" - /// is set to true. - /// - virtual PVR_ERROR RenameRecording(const kodi::addon::PVRRecording& recording) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the lifetime of a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// to change the lifetime for. recording.iLifetime - /// contains the new lieftime value. - /// @return @ref PVR_ERROR_NO_ERROR if the recording's lifetime has been set - /// successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "supportsRecordingsLifetimeChange" - /// is set to true. - /// - virtual PVR_ERROR SetRecordingLifetime(const kodi::addon::PVRRecording& recording) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the play count of a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// to change the play count. - /// @param[in] count Play count. - /// @return @ref PVR_ERROR_NO_ERROR if the recording's play count has been set - /// successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount" - /// is set to true. - /// - virtual PVR_ERROR SetRecordingPlayCount(const kodi::addon::PVRRecording& recording, int count) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Set the last watched position of a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. - /// @param[in] lastplayedposition The last watched position in seconds - /// @return @ref PVR_ERROR_NO_ERROR if the position has been stored successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsLastPlayedPosition "supportsLastPlayedPosition" - /// is set to true. - /// - virtual PVR_ERROR SetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording, - int lastplayedposition) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Retrieve the last watched position of a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. - /// @param[out] position The last watched position in seconds - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount" - /// is set to true. - /// - virtual PVR_ERROR GetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording, - int& position) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Retrieve the edit decision list (EDL) of a recording on the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. - /// @param[out] edl The function has to write the EDL into this array. - /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingEdl "supportsRecordingEdl" - /// is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help - /// - virtual PVR_ERROR GetRecordingEdl(const kodi::addon::PVRRecording& recording, - std::vector& edl) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Retrieve the size of a recording on the backend. - /// - /// @param[in] recording The recording to get the size in bytes for. - /// @param[out] size The size in bytes of the recording - /// @return @ref PVR_ERROR_NO_ERROR if the recording's size has been set successfully. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingSize "supportsRecordingSize" - /// is set to true. - /// - virtual PVR_ERROR GetRecordingSize(const kodi::addon::PVRRecording& recording, int64_t& size) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Get the stream properties for a recording from the backend. - /// - /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// to get the stream properties for. - /// @param[out] properties The properties required to play the stream. - /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. - /// - /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" - /// is set to true and the add-on does not implement recording stream functions - /// (@ref OpenRecordedStream, ...).\n - /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL - /// with the URL Kodi should resolve to playback the recording. - /// - /// @note The value directly related to inputstream must always begin with the - /// name of the associated add-on, e.g. `"inputstream.adaptive.manifest_update_parameter"`. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetRecordingStreamProperties(const kodi::addon::PVRRecording& recording, - /// std::vector& properties) - /// { - /// ... - /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); - /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); - /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); - /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetRecordingStreamProperties( - const kodi::addon::PVRRecording& recording, - std::vector& properties) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @brief Call one of the recording related menu hooks (if supported). - /// - /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in - /// `constructor()`, by calling @ref AddMenuHook() on the callback. - /// - /// @param[in] menuhook The hook to call. - /// @param[in] item The selected recording item for which the hook was called. - /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - virtual PVR_ERROR CallRecordingMenuHook(const kodi::addon::PVRMenuhook& menuhook, - const kodi::addon::PVRRecording& item) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Display a notification in Kodi that a recording started or stopped on the - /// server. - /// - /// @param[in] recordingName The name of the recording to display - /// @param[in] fileName The filename of the recording - /// @param[in] on True when recording started, false when it stopped - /// - /// @remarks Only called from addon itself - /// - inline void RecordingNotification(const std::string& recordingName, - const std::string& fileName, - bool on) - { - m_instanceData->toKodi->RecordingNotification(m_instanceData->toKodi->kodiInstance, - recordingName.c_str(), fileName.c_str(), on); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Request Kodi to update it's list of recordings. - /// - /// @remarks Only called from addon itself - /// - inline void TriggerRecordingUpdate() - { - m_instanceData->toKodi->TriggerRecordingUpdate(m_instanceData->toKodi->kodiInstance); - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Timers 6. Timers (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief **PVR timer methods**\n - /// For editing and displaying timed work, such as video recording. - /// - /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true.\n\n - /// If a timer changes after the initial import, or if a new one was added, - /// then the add-on should call @ref TriggerTimerUpdate(). - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Timer parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Timers_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Timers_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Retrieve the timer types supported by the backend. - /// - /// @param[out] types The function has to write the definition of the - /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType types - /// into this array. - /// @return @ref PVR_ERROR_NO_ERROR if the types were successfully written to - /// the array. - /// - /// @note Maximal 32 entries are allowed inside. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help - /// - virtual PVR_ERROR GetTimerTypes(std::vector& types) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief To get total amount of timers on the backend or -1 on error. - /// - /// @param[out] amount The total amount of timers on the backend - /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. - /// - /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true. - /// - virtual PVR_ERROR GetTimersAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Request the list of all timers from the backend if supported. - /// - /// @param[out] results List of available timers with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer - /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet - /// and given to Kodi - /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. - /// - /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// PVR_ERROR CMyPVRInstance::GetTimers(kodi::addon::PVRTimersResultSet& results) - /// { - /// // Minimal demo example, in reality bigger and loop to transfer all - /// kodi::addon::PVRTimer timer; - /// timer.SetClientIndex(123); - /// timer.SetState(PVR_TIMER_STATE_SCHEDULED); - /// timer.SetTitle("My timer name"); - /// ... - /// - /// // Give it now to Kodi - /// results.Add(timer); - /// return PVR_ERROR_NO_ERROR; - /// } - /// ... - /// ~~~~~~~~~~~~~ - /// - virtual PVR_ERROR GetTimers(kodi::addon::PVRTimersResultSet& results) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Add a timer on the backend. - /// - /// @param[in] timer The timer to add. - /// @return @ref PVR_ERROR_NO_ERROR if the timer has been added successfully. - /// - /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true. - /// - virtual PVR_ERROR AddTimer(const kodi::addon::PVRTimer& timer) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Delete a timer on the backend. - /// - /// @param[in] timer The timer to delete. - /// @param[in] forceDelete Set to true to delete a timer that is currently - /// recording a program. - /// @return @ref PVR_ERROR_NO_ERROR if the timer has been deleted successfully. - /// - /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true. - /// - virtual PVR_ERROR DeleteTimer(const kodi::addon::PVRTimer& timer, bool forceDelete) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Update the timer information on the backend. - /// - /// @param[in] timer The timer to update. - /// @return @ref PVR_ERROR_NO_ERROR if the timer has been updated successfully. - /// - /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" - /// is set to true. - /// - virtual PVR_ERROR UpdateTimer(const kodi::addon::PVRTimer& timer) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Call one of the timer related menu hooks (if supported). - /// - /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have - /// to be added in `constructor()`, by calling @ref AddMenuHook() on the - /// callback. - /// - /// @param[in] menuhook The hook to call. - /// @param[in] item The selected timer item for which the hook was called. - /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help - /// - virtual PVR_ERROR CallTimerMenuHook(const kodi::addon::PVRMenuhook& menuhook, - const kodi::addon::PVRTimer& item) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Request Kodi to update it's list of timers. - /// - /// @remarks Only called from addon itself - /// - inline void TriggerTimerUpdate() - { - m_instanceData->toKodi->TriggerTimerUpdate(m_instanceData->toKodi->kodiInstance); - } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_PowerManagement 7. Power management events (optional) - /// @ingroup cpp_kodi_addon_pvr - /// @brief **Used to notify the pvr addon for power management events**\n - /// Used to allow any energy savings. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Power management events in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_PowerManagement_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_PowerManagement_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief To notify addon about system sleep - /// - /// @return @ref PVR_ERROR_NO_ERROR If successfully done. - /// - virtual PVR_ERROR OnSystemSleep() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief To notify addon about system wake up - /// - /// @return @ref PVR_ERROR_NO_ERROR If successfully done. - /// - virtual PVR_ERROR OnSystemWake() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief To notify addon power saving on system is activated - /// - /// @return @ref PVR_ERROR_NO_ERROR If successfully done. - /// - virtual PVR_ERROR OnPowerSavingActivated() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief To notify addon power saving on system is deactivated - /// - /// @return @ref PVR_ERROR_NO_ERROR If successfully done. - /// - virtual PVR_ERROR OnPowerSavingDeactivated() { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Streams 8. Inputstream - /// @ingroup cpp_kodi_addon_pvr - /// @brief **PVR Inputstream**\n - /// This includes functions that are used in the PVR inputstream. - /// - /// @warning The parts here will be removed in the future and replaced by the - /// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance". - /// If there is already a possibility, new addons should do it via the - /// inputstream instance. - /// - ///@{ - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Streams_TV 8.1. TV stream - /// @ingroup cpp_kodi_addon_pvr_Streams - /// @brief **PVR TV stream**\n - /// Stream processing regarding live TV. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **TV stream parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Streams_TV_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Streams_TV_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Open a live stream on the backend. - /// - /// @param[in] channel The channel to stream. - /// @return True if the stream has been opened successfully, false otherwise. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help - /// - /// - /// -------------------------------------------------------------------------- - /// - /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or - /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true. - /// @ref CloseLiveStream() will always be called by Kodi prior to calling this - /// function. - /// - virtual bool OpenLiveStream(const kodi::addon::PVRChannel& channel) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Close an open live stream. - /// - /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or - /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true. - /// - virtual void CloseLiveStream() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Read from an open live stream. - /// - /// @param[in] pBuffer The buffer to store the data in. - /// @param[in] iBufferSize The amount of bytes to read. - /// @return The amount of bytes that were actually read from the stream. - /// - /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() is set - /// to true. - /// - virtual int ReadLiveStream(unsigned char* buffer, unsigned int size) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Seek in a live stream on a backend that supports timeshifting. - /// - /// @param[in] position The position to seek to. - /// @param[in] whence [optional] offset relative to - /// You can set the value of whence to one of three things: - /// | Value | int | Description | - /// |:--------:|:---:|:----------------------------------------------------| - /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// - /// @return The new position. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream() - /// is set to true. - /// - virtual int64_t SeekLiveStream(int64_t position, int whence) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Obtain the length of a live stream. - /// - /// @return The total length of the stream that's currently being read. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream() - /// is set to true. - /// - virtual int64_t LengthLiveStream() { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Streams_TV_Demux 8.1.1. Stream demuxing - /// @ingroup cpp_kodi_addon_pvr_Streams_TV - /// @brief **PVR stream demuxing**\n - /// Read TV streams with own demux within addon. - /// - /// This is only on Live TV streams and only if @ref PVRCapabilities::SetHandlesDemuxing() - /// has been set to "true". - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Stream demuxing parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Get the stream properties of the stream that's currently being read. - /// - /// @param[in] properties The properties of the currently playing stream. - /// @return @ref PVR_ERROR_NO_ERROR if the properties have been fetched successfully. - /// - /// @remarks Required, and only used if addon has its own demuxer. - /// - virtual PVR_ERROR GetStreamProperties(std::vector& properties) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Read the next packet from the demultiplexer, if there is one. - /// - /// @return The next packet. - /// If there is no next packet, then the add-on should return the packet - /// created by calling @ref AllocateDemuxPacket(0) on the callback. - /// If the stream changed and Kodi's player needs to be reinitialised, then, - /// the add-on should call @ref AllocateDemuxPacket(0) on the callback, and set - /// the streamid to @ref DMX_SPECIALID_STREAMCHANGE and return the value. - /// The add-on should return `nullptr` if an error occurred. - /// - /// @remarks Required, and only used if addon has its own demuxer. - /// Return `nullptr` if this add-on won't provide this function. - /// - virtual DEMUX_PACKET* DemuxRead() { return nullptr; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Reset the demultiplexer in the add-on. - /// - /// @remarks Required, and only used if addon has its own demuxer. - /// - virtual void DemuxReset() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Abort the demultiplexer thread in the add-on. - /// - /// @remarks Required, and only used if addon has its own demuxer. - /// - virtual void DemuxAbort() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Flush all data that's currently in the demultiplexer buffer in the - /// add-on. - /// - /// @remarks Required, and only used if addon has its own demuxer. - /// - virtual void DemuxFlush() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the pvr addon/demuxer that Kodi wishes to change playback - /// speed. - /// - /// @param[in] speed The requested playback speed - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void SetSpeed(int speed) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the pvr addon/demuxer that Kodi wishes to fill demux queue. - /// - /// @param[in] mode The requested filling mode - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// - virtual void FillBuffer(bool mode) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Notify the pvr addon/demuxer that Kodi wishes to seek the stream by - /// time. - /// - /// @param[in] time The absolute time since stream start - /// @param[in] backwards True to seek to keyframe BEFORE time, else AFTER - /// @param[in] startpts can be updated to point to where display should start - /// @return True if the seek operation was possible - /// - /// @remarks Optional, and only used if addon has its own demuxer. - /// Return False if this add-on won't provide this function. - /// - virtual bool SeekTime(double time, bool backwards, double& startpts) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Get the codec id used by Kodi. - /// - /// @param[in] codecName The name of the codec - /// @return The codec_id, or a codec_id with 0 values when not supported - /// - /// @remarks Only called from addon itself - /// - inline PVRCodec GetCodecByName(const std::string& codecName) const - { - return PVRCodec(m_instanceData->toKodi->GetCodecByName(m_instanceData->toKodi->kodiInstance, - codecName.c_str())); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Allocate a demux packet. Free with @ref FreeDemuxPacket(). - /// - /// @param[in] iDataSize The size of the data that will go into the packet - /// @return The allocated packet - /// - /// @remarks Only called from addon itself - /// - inline DEMUX_PACKET* AllocateDemuxPacket(int iDataSize) - { - return m_instanceData->toKodi->AllocateDemuxPacket(m_instanceData->toKodi->kodiInstance, - iDataSize); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief **Callback to Kodi Function**\n - /// Free a packet that was allocated with @ref AllocateDemuxPacket(). - /// - /// @param[in] pPacket The packet to free - /// - /// @remarks Only called from addon itself. - /// - inline void FreeDemuxPacket(DEMUX_PACKET* pPacket) - { - m_instanceData->toKodi->FreeDemuxPacket(m_instanceData->toKodi->kodiInstance, pPacket); - } - //---------------------------------------------------------------------------- - ///@} - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Streams_Recording 8.2. Recording stream - /// @ingroup cpp_kodi_addon_pvr_Streams - /// @brief **PVR Recording stream**\n - /// Stream processing regarding recordings. - /// - /// @note Demuxing is not possible with the recordings. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Recording stream parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// @brief Open a stream to a recording on the backend. - /// - /// @param[in] recording The recording to open. - /// @return True if the stream has been opened successfully, false otherwise. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() - /// is set to true. @ref CloseRecordedStream() will always be called by Kodi - /// prior to calling this function. - /// - virtual bool OpenRecordedStream(const kodi::addon::PVRRecording& recording) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Close an open stream from a recording. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() - /// is set to true. - /// - virtual void CloseRecordedStream() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Read from a recording. - /// - /// @param[in] buffer The buffer to store the data in. - /// @param[in] size The amount of bytes to read. - /// @return The amount of bytes that were actually read from the stream. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() - /// is set to true. - /// - virtual int ReadRecordedStream(unsigned char* buffer, unsigned int size) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Seek in a recorded stream. - /// - /// @param[in] position The position to seek to. - /// @param[in] whence [optional] offset relative to - /// You can set the value of whence to one of three things: - /// | Value | int | Description | - /// |:--------:|:---:|:----------------------------------------------------| - /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// - /// @return The new position. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() - /// is set to true. - /// - virtual int64_t SeekRecordedStream(int64_t position, int whence) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief Obtain the length of a recorded stream. - /// - /// @return The total length of the stream that's currently being read. - /// - /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() - /// is true (=> @ref ReadRecordedStream). - /// - virtual int64_t LengthRecordedStream() { return 0; } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - //============================================================================ - /// @defgroup cpp_kodi_addon_pvr_Streams_Various 8.3. Various functions - /// @ingroup cpp_kodi_addon_pvr_Streams - /// @brief **Various other PVR stream related functions**\n - /// These apply to all other groups in inputstream and are therefore declared - /// as several. - /// - /// - ///--------------------------------------------------------------------------- - /// - /// **Various stream parts in interface:**\n - /// Copy this to your project and extend with your parts or leave functions - /// complete away where not used or supported. - /// - /// @copydetails cpp_kodi_addon_pvr_Streams_Various_header_addon_auto_check - /// @copydetails cpp_kodi_addon_pvr_Streams_Various_source_addon_auto_check - /// - ///@{ - - //============================================================================ - /// - /// @brief Check if the backend support pausing the currently playing stream. - /// - /// This will enable/disable the pause button in Kodi based on the return - /// value. - /// - /// @return false if the PVR addon/backend does not support pausing, true if - /// possible - /// - virtual bool CanPauseStream() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @brief Check if the backend supports seeking for the currently playing - /// stream. - /// - /// This will enable/disable the rewind/forward buttons in Kodi based on the - /// return value. - /// - /// @return false if the PVR addon/backend does not support seeking, true if - /// possible - /// - virtual bool CanSeekStream() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @brief Notify the pvr addon that Kodi (un)paused the currently playing - /// stream. - /// - /// @param[in] paused To inform by `true` is paused and with `false` playing - /// - virtual void PauseStream(bool paused) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @brief Check for real-time streaming. - /// - /// @return true if current stream is real-time - /// - virtual bool IsRealTimeStream() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @brief Get stream times. - /// - /// @param[out] times A pointer to the data to be filled by the implementation. - /// @return @ref PVR_ERROR_NO_ERROR on success. - /// - virtual PVR_ERROR GetStreamTimes(kodi::addon::PVRStreamTimes& times) - { - return PVR_ERROR_NOT_IMPLEMENTED; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @brief Obtain the chunk size to use when reading streams. - /// - /// @param[out] chunksize must be filled with the chunk size in bytes. - /// @return @ref PVR_ERROR_NO_ERROR if the chunk size has been fetched successfully. - /// - /// @remarks Optional, and only used if not reading from demuxer (=> @ref DemuxRead) and - /// @ref PVRCapabilities::SetSupportsRecordings() is true (=> @ref ReadRecordedStream) or - /// @ref PVRCapabilities::SetHandlesInputStream() is true (=> @ref ReadLiveStream). - /// - virtual PVR_ERROR GetStreamReadChunkSize(int& chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; } - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----== - -private: - void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstancePVRClient: Creation with empty addon " - "structure not allowed, table must be given from Kodi!"); - - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetCapabilities = ADDON_GetCapabilities; - m_instanceData->toAddon->GetConnectionString = ADDON_GetConnectionString; - m_instanceData->toAddon->GetBackendName = ADDON_GetBackendName; - m_instanceData->toAddon->GetBackendVersion = ADDON_GetBackendVersion; - m_instanceData->toAddon->GetBackendHostname = ADDON_GetBackendHostname; - m_instanceData->toAddon->GetDriveSpace = ADDON_GetDriveSpace; - m_instanceData->toAddon->CallSettingsMenuHook = ADDON_CallSettingsMenuHook; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetChannelsAmount = ADDON_GetChannelsAmount; - m_instanceData->toAddon->GetChannels = ADDON_GetChannels; - m_instanceData->toAddon->GetChannelStreamProperties = ADDON_GetChannelStreamProperties; - m_instanceData->toAddon->GetSignalStatus = ADDON_GetSignalStatus; - m_instanceData->toAddon->GetDescrambleInfo = ADDON_GetDescrambleInfo; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetProvidersAmount = ADDON_GetProvidersAmount; - m_instanceData->toAddon->GetProviders = ADDON_GetProviders; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetChannelGroupsAmount = ADDON_GetChannelGroupsAmount; - m_instanceData->toAddon->GetChannelGroups = ADDON_GetChannelGroups; - m_instanceData->toAddon->GetChannelGroupMembers = ADDON_GetChannelGroupMembers; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->DeleteChannel = ADDON_DeleteChannel; - m_instanceData->toAddon->RenameChannel = ADDON_RenameChannel; - m_instanceData->toAddon->OpenDialogChannelSettings = ADDON_OpenDialogChannelSettings; - m_instanceData->toAddon->OpenDialogChannelAdd = ADDON_OpenDialogChannelAdd; - m_instanceData->toAddon->OpenDialogChannelScan = ADDON_OpenDialogChannelScan; - m_instanceData->toAddon->CallChannelMenuHook = ADDON_CallChannelMenuHook; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetEPGForChannel = ADDON_GetEPGForChannel; - m_instanceData->toAddon->IsEPGTagRecordable = ADDON_IsEPGTagRecordable; - m_instanceData->toAddon->IsEPGTagPlayable = ADDON_IsEPGTagPlayable; - m_instanceData->toAddon->GetEPGTagEdl = ADDON_GetEPGTagEdl; - m_instanceData->toAddon->GetEPGTagStreamProperties = ADDON_GetEPGTagStreamProperties; - m_instanceData->toAddon->SetEPGMaxPastDays = ADDON_SetEPGMaxPastDays; - m_instanceData->toAddon->SetEPGMaxFutureDays = ADDON_SetEPGMaxFutureDays; - m_instanceData->toAddon->CallEPGMenuHook = ADDON_CallEPGMenuHook; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetRecordingsAmount = ADDON_GetRecordingsAmount; - m_instanceData->toAddon->GetRecordings = ADDON_GetRecordings; - m_instanceData->toAddon->DeleteRecording = ADDON_DeleteRecording; - m_instanceData->toAddon->UndeleteRecording = ADDON_UndeleteRecording; - m_instanceData->toAddon->DeleteAllRecordingsFromTrash = ADDON_DeleteAllRecordingsFromTrash; - m_instanceData->toAddon->RenameRecording = ADDON_RenameRecording; - m_instanceData->toAddon->SetRecordingLifetime = ADDON_SetRecordingLifetime; - m_instanceData->toAddon->SetRecordingPlayCount = ADDON_SetRecordingPlayCount; - m_instanceData->toAddon->SetRecordingLastPlayedPosition = ADDON_SetRecordingLastPlayedPosition; - m_instanceData->toAddon->GetRecordingLastPlayedPosition = ADDON_GetRecordingLastPlayedPosition; - m_instanceData->toAddon->GetRecordingEdl = ADDON_GetRecordingEdl; - m_instanceData->toAddon->GetRecordingSize = ADDON_GetRecordingSize; - m_instanceData->toAddon->GetRecordingStreamProperties = ADDON_GetRecordingStreamProperties; - m_instanceData->toAddon->CallRecordingMenuHook = ADDON_CallRecordingMenuHook; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->GetTimerTypes = ADDON_GetTimerTypes; - m_instanceData->toAddon->GetTimersAmount = ADDON_GetTimersAmount; - m_instanceData->toAddon->GetTimers = ADDON_GetTimers; - m_instanceData->toAddon->AddTimer = ADDON_AddTimer; - m_instanceData->toAddon->DeleteTimer = ADDON_DeleteTimer; - m_instanceData->toAddon->UpdateTimer = ADDON_UpdateTimer; - m_instanceData->toAddon->CallTimerMenuHook = ADDON_CallTimerMenuHook; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->OnSystemSleep = ADDON_OnSystemSleep; - m_instanceData->toAddon->OnSystemWake = ADDON_OnSystemWake; - m_instanceData->toAddon->OnPowerSavingActivated = ADDON_OnPowerSavingActivated; - m_instanceData->toAddon->OnPowerSavingDeactivated = ADDON_OnPowerSavingDeactivated; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->OpenLiveStream = ADDON_OpenLiveStream; - m_instanceData->toAddon->CloseLiveStream = ADDON_CloseLiveStream; - m_instanceData->toAddon->ReadLiveStream = ADDON_ReadLiveStream; - m_instanceData->toAddon->SeekLiveStream = ADDON_SeekLiveStream; - m_instanceData->toAddon->LengthLiveStream = ADDON_LengthLiveStream; - m_instanceData->toAddon->GetStreamProperties = ADDON_GetStreamProperties; - m_instanceData->toAddon->GetStreamReadChunkSize = ADDON_GetStreamReadChunkSize; - m_instanceData->toAddon->IsRealTimeStream = ADDON_IsRealTimeStream; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->OpenRecordedStream = ADDON_OpenRecordedStream; - m_instanceData->toAddon->CloseRecordedStream = ADDON_CloseRecordedStream; - m_instanceData->toAddon->ReadRecordedStream = ADDON_ReadRecordedStream; - m_instanceData->toAddon->SeekRecordedStream = ADDON_SeekRecordedStream; - m_instanceData->toAddon->LengthRecordedStream = ADDON_LengthRecordedStream; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->DemuxReset = ADDON_DemuxReset; - m_instanceData->toAddon->DemuxAbort = ADDON_DemuxAbort; - m_instanceData->toAddon->DemuxFlush = ADDON_DemuxFlush; - m_instanceData->toAddon->DemuxRead = ADDON_DemuxRead; - //--==----==----==----==----==----==----==----==----==----==----==----==----== - m_instanceData->toAddon->CanPauseStream = ADDON_CanPauseStream; - m_instanceData->toAddon->PauseStream = ADDON_PauseStream; - m_instanceData->toAddon->CanSeekStream = ADDON_CanSeekStream; - m_instanceData->toAddon->SeekTime = ADDON_SeekTime; - m_instanceData->toAddon->SetSpeed = ADDON_SetSpeed; - m_instanceData->toAddon->FillBuffer = ADDON_FillBuffer; - m_instanceData->toAddon->GetStreamTimes = ADDON_GetStreamTimes; - } - - inline static PVR_ERROR ADDON_GetCapabilities(const AddonInstance_PVR* instance, - PVR_ADDON_CAPABILITIES* capabilities) - { - PVRCapabilities cppCapabilities(capabilities); - return static_cast(instance->toAddon->addonInstance) - ->GetCapabilities(cppCapabilities); - } - - inline static PVR_ERROR ADDON_GetBackendName(const AddonInstance_PVR* instance, - char* str, - int memSize) - { - std::string backendName; - PVR_ERROR err = static_cast(instance->toAddon->addonInstance) - ->GetBackendName(backendName); - if (err == PVR_ERROR_NO_ERROR) - strncpy(str, backendName.c_str(), memSize); - return err; - } - - inline static PVR_ERROR ADDON_GetBackendVersion(const AddonInstance_PVR* instance, - char* str, - int memSize) - { - std::string backendVersion; - PVR_ERROR err = static_cast(instance->toAddon->addonInstance) - ->GetBackendVersion(backendVersion); - if (err == PVR_ERROR_NO_ERROR) - strncpy(str, backendVersion.c_str(), memSize); - return err; - } - - inline static PVR_ERROR ADDON_GetBackendHostname(const AddonInstance_PVR* instance, - char* str, - int memSize) - { - std::string backendHostname; - PVR_ERROR err = static_cast(instance->toAddon->addonInstance) - ->GetBackendHostname(backendHostname); - if (err == PVR_ERROR_NO_ERROR) - strncpy(str, backendHostname.c_str(), memSize); - return err; - } - - inline static PVR_ERROR ADDON_GetConnectionString(const AddonInstance_PVR* instance, - char* str, - int memSize) - { - std::string connectionString; - PVR_ERROR err = static_cast(instance->toAddon->addonInstance) - ->GetConnectionString(connectionString); - if (err == PVR_ERROR_NO_ERROR) - strncpy(str, connectionString.c_str(), memSize); - return err; - } - - inline static PVR_ERROR ADDON_GetDriveSpace(const AddonInstance_PVR* instance, - uint64_t* total, - uint64_t* used) - { - return static_cast(instance->toAddon->addonInstance) - ->GetDriveSpace(*total, *used); - } - - inline static PVR_ERROR ADDON_CallSettingsMenuHook(const AddonInstance_PVR* instance, - const PVR_MENUHOOK* menuhook) - { - return static_cast(instance->toAddon->addonInstance) - ->CallSettingsMenuHook(menuhook); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_GetChannelsAmount(const AddonInstance_PVR* instance, int* amount) - { - return static_cast(instance->toAddon->addonInstance) - ->GetChannelsAmount(*amount); - } - - inline static PVR_ERROR ADDON_GetChannels(const AddonInstance_PVR* instance, - ADDON_HANDLE handle, - bool radio) - { - PVRChannelsResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance) - ->GetChannels(radio, result); - } - - inline static PVR_ERROR ADDON_GetChannelStreamProperties(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel, - PVR_NAMED_VALUE* properties, - unsigned int* propertiesCount) - { - *propertiesCount = 0; - std::vector propertiesList; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetChannelStreamProperties(channel, propertiesList); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& property : propertiesList) - { - strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, - sizeof(properties[*propertiesCount].strName) - 1); - strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, - sizeof(properties[*propertiesCount].strValue) - 1); - ++*propertiesCount; - if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) - break; - } - } - return error; - } - - inline static PVR_ERROR ADDON_GetSignalStatus(const AddonInstance_PVR* instance, - int channelUid, - PVR_SIGNAL_STATUS* signalStatus) - { - PVRSignalStatus cppSignalStatus(signalStatus); - return static_cast(instance->toAddon->addonInstance) - ->GetSignalStatus(channelUid, cppSignalStatus); - } - - inline static PVR_ERROR ADDON_GetDescrambleInfo(const AddonInstance_PVR* instance, - int channelUid, - PVR_DESCRAMBLE_INFO* descrambleInfo) - { - PVRDescrambleInfo cppDescrambleInfo(descrambleInfo); - return static_cast(instance->toAddon->addonInstance) - ->GetDescrambleInfo(channelUid, cppDescrambleInfo); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_GetProvidersAmount(const AddonInstance_PVR* instance, int* amount) - { - return static_cast(instance->toAddon->addonInstance) - ->GetProvidersAmount(*amount); - } - - inline static PVR_ERROR ADDON_GetProviders(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - { - PVRProvidersResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance)->GetProviders(result); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_GetChannelGroupsAmount(const AddonInstance_PVR* instance, - int* amount) - { - return static_cast(instance->toAddon->addonInstance) - ->GetChannelGroupsAmount(*amount); - } - - inline static PVR_ERROR ADDON_GetChannelGroups(const AddonInstance_PVR* instance, - ADDON_HANDLE handle, - bool radio) - { - PVRChannelGroupsResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance) - ->GetChannelGroups(radio, result); - } - - inline static PVR_ERROR ADDON_GetChannelGroupMembers(const AddonInstance_PVR* instance, - ADDON_HANDLE handle, - const PVR_CHANNEL_GROUP* group) - { - PVRChannelGroupMembersResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance) - ->GetChannelGroupMembers(group, result); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_DeleteChannel(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->DeleteChannel(channel); - } - - inline static PVR_ERROR ADDON_RenameChannel(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->RenameChannel(channel); - } - - inline static PVR_ERROR ADDON_OpenDialogChannelSettings(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenDialogChannelSettings(channel); - } - - inline static PVR_ERROR ADDON_OpenDialogChannelAdd(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenDialogChannelAdd(channel); - } - - inline static PVR_ERROR ADDON_OpenDialogChannelScan(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenDialogChannelScan(); - } - - inline static PVR_ERROR ADDON_CallChannelMenuHook(const AddonInstance_PVR* instance, - const PVR_MENUHOOK* menuhook, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->CallChannelMenuHook(menuhook, channel); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_GetEPGForChannel(const AddonInstance_PVR* instance, - ADDON_HANDLE handle, - int channelUid, - time_t start, - time_t end) - { - PVREPGTagsResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance) - ->GetEPGForChannel(channelUid, start, end, result); - } - - inline static PVR_ERROR ADDON_IsEPGTagRecordable(const AddonInstance_PVR* instance, - const EPG_TAG* tag, - bool* isRecordable) - { - return static_cast(instance->toAddon->addonInstance) - ->IsEPGTagRecordable(tag, *isRecordable); - } - - inline static PVR_ERROR ADDON_IsEPGTagPlayable(const AddonInstance_PVR* instance, - const EPG_TAG* tag, - bool* isPlayable) - { - return static_cast(instance->toAddon->addonInstance) - ->IsEPGTagPlayable(tag, *isPlayable); - } - - inline static PVR_ERROR ADDON_GetEPGTagEdl(const AddonInstance_PVR* instance, - const EPG_TAG* tag, - PVR_EDL_ENTRY* edl, - int* size) - { - std::vector edlList; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetEPGTagEdl(tag, edlList); - if (static_cast(edlList.size()) > *size) - { - kodi::Log( - ADDON_LOG_WARNING, - "CInstancePVRClient::%s: Truncating %d EDL entries from client to permitted size %d", - __func__, static_cast(edlList.size()), *size); - edlList.resize(*size); - } - *size = 0; - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& edlEntry : edlList) - { - edl[*size] = *edlEntry; - ++*size; - } - } - return error; - } - - inline static PVR_ERROR ADDON_GetEPGTagStreamProperties(const AddonInstance_PVR* instance, - const EPG_TAG* tag, - PVR_NAMED_VALUE* properties, - unsigned int* propertiesCount) - { - *propertiesCount = 0; - std::vector propertiesList; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetEPGTagStreamProperties(tag, propertiesList); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& property : propertiesList) - { - strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, - sizeof(properties[*propertiesCount].strName) - 1); - strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, - sizeof(properties[*propertiesCount].strValue) - 1); - ++*propertiesCount; - if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) - break; - } - } - return error; - } - - inline static PVR_ERROR ADDON_SetEPGMaxPastDays(const AddonInstance_PVR* instance, int pastDays) - { - return static_cast(instance->toAddon->addonInstance) - ->SetEPGMaxPastDays(pastDays); - } - - inline static PVR_ERROR ADDON_SetEPGMaxFutureDays(const AddonInstance_PVR* instance, - int futureDays) - { - return static_cast(instance->toAddon->addonInstance) - ->SetEPGMaxFutureDays(futureDays); - } - - inline static PVR_ERROR ADDON_CallEPGMenuHook(const AddonInstance_PVR* instance, - const PVR_MENUHOOK* menuhook, - const EPG_TAG* tag) - { - return static_cast(instance->toAddon->addonInstance) - ->CallEPGMenuHook(menuhook, tag); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_GetRecordingsAmount(const AddonInstance_PVR* instance, - bool deleted, - int* amount) - { - return static_cast(instance->toAddon->addonInstance) - ->GetRecordingsAmount(deleted, *amount); - } - - inline static PVR_ERROR ADDON_GetRecordings(const AddonInstance_PVR* instance, - ADDON_HANDLE handle, - bool deleted) - { - PVRRecordingsResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance) - ->GetRecordings(deleted, result); - } - - inline static PVR_ERROR ADDON_DeleteRecording(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->DeleteRecording(recording); - } - - inline static PVR_ERROR ADDON_UndeleteRecording(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->UndeleteRecording(recording); - } - - inline static PVR_ERROR ADDON_DeleteAllRecordingsFromTrash(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance) - ->DeleteAllRecordingsFromTrash(); - } - - inline static PVR_ERROR ADDON_RenameRecording(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->RenameRecording(recording); - } - - inline static PVR_ERROR ADDON_SetRecordingLifetime(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->SetRecordingLifetime(recording); - } - - inline static PVR_ERROR ADDON_SetRecordingPlayCount(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - int count) - { - return static_cast(instance->toAddon->addonInstance) - ->SetRecordingPlayCount(recording, count); - } - - inline static PVR_ERROR ADDON_SetRecordingLastPlayedPosition(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - int lastplayedposition) - { - return static_cast(instance->toAddon->addonInstance) - ->SetRecordingLastPlayedPosition(recording, lastplayedposition); - } - - inline static PVR_ERROR ADDON_GetRecordingLastPlayedPosition(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - int* position) - { - return static_cast(instance->toAddon->addonInstance) - ->GetRecordingLastPlayedPosition(recording, *position); - } - - inline static PVR_ERROR ADDON_GetRecordingEdl(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - PVR_EDL_ENTRY* edl, - int* size) - { - std::vector edlList; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetRecordingEdl(recording, edlList); - if (static_cast(edlList.size()) > *size) - { - kodi::Log( - ADDON_LOG_WARNING, - "CInstancePVRClient::%s: Truncating %d EDL entries from client to permitted size %d", - __func__, static_cast(edlList.size()), *size); - edlList.resize(*size); - } - *size = 0; - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& edlEntry : edlList) - { - edl[*size] = *edlEntry; - ++*size; - } - } - return error; - } - - inline static PVR_ERROR ADDON_GetRecordingSize(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - int64_t* size) - { - return static_cast(instance->toAddon->addonInstance) - ->GetRecordingSize(recording, *size); - } - - inline static PVR_ERROR ADDON_GetRecordingStreamProperties(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording, - PVR_NAMED_VALUE* properties, - unsigned int* propertiesCount) - { - *propertiesCount = 0; - std::vector propertiesList; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetRecordingStreamProperties(recording, propertiesList); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& property : propertiesList) - { - strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, - sizeof(properties[*propertiesCount].strName) - 1); - strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, - sizeof(properties[*propertiesCount].strValue) - 1); - ++*propertiesCount; - if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) - break; - } - } - return error; - } - - inline static PVR_ERROR ADDON_CallRecordingMenuHook(const AddonInstance_PVR* instance, - const PVR_MENUHOOK* menuhook, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->CallRecordingMenuHook(menuhook, recording); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - - inline static PVR_ERROR ADDON_GetTimerTypes(const AddonInstance_PVR* instance, - PVR_TIMER_TYPE* types, - int* typesCount) - { - *typesCount = 0; - std::vector timerTypes; - PVR_ERROR error = static_cast(instance->toAddon->addonInstance) - ->GetTimerTypes(timerTypes); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto& timerType : timerTypes) - { - types[*typesCount] = *timerType; - ++*typesCount; - if (*typesCount >= PVR_ADDON_TIMERTYPE_ARRAY_SIZE) - break; - } - } - return error; - } - - inline static PVR_ERROR ADDON_GetTimersAmount(const AddonInstance_PVR* instance, int* amount) - { - return static_cast(instance->toAddon->addonInstance) - ->GetTimersAmount(*amount); - } - - inline static PVR_ERROR ADDON_GetTimers(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - { - PVRTimersResultSet result(instance, handle); - return static_cast(instance->toAddon->addonInstance)->GetTimers(result); - } - - inline static PVR_ERROR ADDON_AddTimer(const AddonInstance_PVR* instance, const PVR_TIMER* timer) - { - return static_cast(instance->toAddon->addonInstance)->AddTimer(timer); - } - - inline static PVR_ERROR ADDON_DeleteTimer(const AddonInstance_PVR* instance, - const PVR_TIMER* timer, - bool forceDelete) - { - return static_cast(instance->toAddon->addonInstance) - ->DeleteTimer(timer, forceDelete); - } - - inline static PVR_ERROR ADDON_UpdateTimer(const AddonInstance_PVR* instance, - const PVR_TIMER* timer) - { - return static_cast(instance->toAddon->addonInstance)->UpdateTimer(timer); - } - - inline static PVR_ERROR ADDON_CallTimerMenuHook(const AddonInstance_PVR* instance, - const PVR_MENUHOOK* menuhook, - const PVR_TIMER* timer) - { - return static_cast(instance->toAddon->addonInstance) - ->CallTimerMenuHook(menuhook, timer); - } - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - - inline static PVR_ERROR ADDON_OnSystemSleep(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->OnSystemSleep(); - } - - inline static PVR_ERROR ADDON_OnSystemWake(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->OnSystemWake(); - } - - inline static PVR_ERROR ADDON_OnPowerSavingActivated(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance) - ->OnPowerSavingActivated(); - } - - inline static PVR_ERROR ADDON_OnPowerSavingDeactivated(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance) - ->OnPowerSavingDeactivated(); - } - - // obsolete parts below - ///@{ - - inline static bool ADDON_OpenLiveStream(const AddonInstance_PVR* instance, - const PVR_CHANNEL* channel) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenLiveStream(channel); - } - - inline static void ADDON_CloseLiveStream(const AddonInstance_PVR* instance) - { - static_cast(instance->toAddon->addonInstance)->CloseLiveStream(); - } - - inline static int ADDON_ReadLiveStream(const AddonInstance_PVR* instance, - unsigned char* buffer, - unsigned int size) - { - return static_cast(instance->toAddon->addonInstance) - ->ReadLiveStream(buffer, size); - } - - inline static int64_t ADDON_SeekLiveStream(const AddonInstance_PVR* instance, - int64_t position, - int whence) - { - return static_cast(instance->toAddon->addonInstance) - ->SeekLiveStream(position, whence); - } - - inline static int64_t ADDON_LengthLiveStream(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->LengthLiveStream(); - } - - inline static PVR_ERROR ADDON_GetStreamProperties(const AddonInstance_PVR* instance, - PVR_STREAM_PROPERTIES* properties) - { - properties->iStreamCount = 0; - std::vector cppProperties; - PVR_ERROR err = static_cast(instance->toAddon->addonInstance) - ->GetStreamProperties(cppProperties); - if (err == PVR_ERROR_NO_ERROR) - { - for (unsigned int i = 0; i < cppProperties.size(); ++i) - { - memcpy(&properties->stream[i], - static_cast(cppProperties[i]), - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - ++properties->iStreamCount; - - if (properties->iStreamCount >= PVR_STREAM_MAX_STREAMS) - { - kodi::Log( - ADDON_LOG_ERROR, - "CInstancePVRClient::%s: Addon given with '%li' more allowed streams where '%i'", - __func__, cppProperties.size(), PVR_STREAM_MAX_STREAMS); - break; - } - } - } - - return err; - } - - inline static PVR_ERROR ADDON_GetStreamReadChunkSize(const AddonInstance_PVR* instance, - int* chunksize) - { - return static_cast(instance->toAddon->addonInstance) - ->GetStreamReadChunkSize(*chunksize); - } - - inline static bool ADDON_IsRealTimeStream(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->IsRealTimeStream(); - } - - inline static bool ADDON_OpenRecordedStream(const AddonInstance_PVR* instance, - const PVR_RECORDING* recording) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenRecordedStream(recording); - } - - inline static void ADDON_CloseRecordedStream(const AddonInstance_PVR* instance) - { - static_cast(instance->toAddon->addonInstance)->CloseRecordedStream(); - } - - inline static int ADDON_ReadRecordedStream(const AddonInstance_PVR* instance, - unsigned char* buffer, - unsigned int size) - { - return static_cast(instance->toAddon->addonInstance) - ->ReadRecordedStream(buffer, size); - } - - inline static int64_t ADDON_SeekRecordedStream(const AddonInstance_PVR* instance, - int64_t position, - int whence) - { - return static_cast(instance->toAddon->addonInstance) - ->SeekRecordedStream(position, whence); - } - - inline static int64_t ADDON_LengthRecordedStream(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance) - ->LengthRecordedStream(); - } - - inline static void ADDON_DemuxReset(const AddonInstance_PVR* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxReset(); - } - - inline static void ADDON_DemuxAbort(const AddonInstance_PVR* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxAbort(); - } - - inline static void ADDON_DemuxFlush(const AddonInstance_PVR* instance) - { - static_cast(instance->toAddon->addonInstance)->DemuxFlush(); - } - - inline static DEMUX_PACKET* ADDON_DemuxRead(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->DemuxRead(); - } - - inline static bool ADDON_CanPauseStream(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->CanPauseStream(); - } - - inline static bool ADDON_CanSeekStream(const AddonInstance_PVR* instance) - { - return static_cast(instance->toAddon->addonInstance)->CanSeekStream(); - } - - inline static void ADDON_PauseStream(const AddonInstance_PVR* instance, bool bPaused) - { - static_cast(instance->toAddon->addonInstance)->PauseStream(bPaused); - } - - inline static bool ADDON_SeekTime(const AddonInstance_PVR* instance, - double time, - bool backwards, - double* startpts) - { - return static_cast(instance->toAddon->addonInstance) - ->SeekTime(time, backwards, *startpts); - } - - inline static void ADDON_SetSpeed(const AddonInstance_PVR* instance, int speed) - { - static_cast(instance->toAddon->addonInstance)->SetSpeed(speed); - } - - inline static void ADDON_FillBuffer(const AddonInstance_PVR* instance, bool mode) - { - static_cast(instance->toAddon->addonInstance)->FillBuffer(mode); - } - - inline static PVR_ERROR ADDON_GetStreamTimes(const AddonInstance_PVR* instance, - PVR_STREAM_TIMES* times) - { - PVRStreamTimes cppTimes(times); - return static_cast(instance->toAddon->addonInstance) - ->GetStreamTimes(cppTimes); - } - ///@} - - AddonInstance_PVR* m_instanceData = nullptr; -}; -//}}} -//______________________________________________________________________________ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h index 46060a8f1c515..c6bc07256959e 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h @@ -12,6 +12,9 @@ #include "peripheral/PeripheralUtils.h" #ifdef __cplusplus + +#include + namespace kodi { namespace addon @@ -182,7 +185,7 @@ namespace addon /// const std::string& instanceID, /// KODI_HANDLE instance, /// const std::string& version, -/// KODI_HANDLE& addonInstance) override; +/// KODI_HANDLE& hdl) override; /// }; /// /// // If you use only one instance in your add-on, can be instanceType and @@ -191,12 +194,12 @@ namespace addon /// const std::string& instanceID, /// KODI_HANDLE instance, /// const std::string& version, -/// KODI_HANDLE& addonInstance) +/// KODI_HANDLE& hdl) /// { /// if (instanceType == ADDON_INSTANCE_PERIPHERAL) /// { /// kodi::Log(ADDON_LOG_INFO, "Creating my peripheral addon"); -/// addonInstance = new CMyPeripheralAddon(instance, version); +/// hdl = new CMyPeripheralAddon(instance, version); /// return ADDON_STATUS_OK; /// } /// else if (...) @@ -212,7 +215,7 @@ namespace addon /// The destruction of the example class `CMyPeripheralAddon` is called from /// Kodi's header. Manually deleting the add-on instance is not required. /// -class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance +class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance { public: //============================================================================ @@ -222,14 +225,14 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// Used by an add-on that only supports peripheral. /// CInstancePeripheral() - : IAddonInstance(ADDON_INSTANCE_PERIPHERAL, GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL)) + : IAddonInstance(ADDON_INSTANCE_PERIPHERAL) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::ifc.m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of more as one in single " "instance way is not allowed!"); - SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); - CAddonBase::m_interface->globalSingleInstance = this; + m_kodi = CAddonBase::ifc.m_firstInstance; + CAddonBase::ifc.m_globalSingleInstance = this; } //---------------------------------------------------------------------------- @@ -266,20 +269,18 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// const std::string& instanceID, /// KODI_HANDLE instance, /// const std::string& version, - /// KODI_HANDLE& addonInstance) + /// KODI_HANDLE& hdl) /// { /// kodi::Log(ADDON_LOG_INFO, "Creating my peripheral"); - /// addonInstance = new CMyPeripheralAddon(instance, version); + /// hdl = new CMyPeripheralAddon(instance, version); /// return ADDON_STATUS_OK; /// } /// ~~~~~~~~~~~~~ /// - explicit CInstancePeripheral(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_PERIPHERAL, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL)) + explicit CInstancePeripheral(KODI_HANDLE instance) + : IAddonInstance(ADDON_INSTANCE_PERIPHERAL) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::ifc.m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of multiple together with " "single instance way is not allowed!"); @@ -539,7 +540,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// /// @return The add-on installation path /// - const std::string AddonPath() const { return m_instanceData->props->addon_path; } + const std::string AddonPath() const { return kodi::addon::GetSharePath(); } //---------------------------------------------------------------------------- //============================================================================ @@ -551,7 +552,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// /// @return Path to the user profile /// - const std::string UserPath() const { return m_instanceData->props->user_path; } + const std::string UserPath() const { return kodi::addon::GetUserPath(); } //---------------------------------------------------------------------------- //============================================================================ @@ -561,7 +562,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// void TriggerScan(void) { - return m_instanceData->toKodi->trigger_scan(m_instanceData->toKodi->kodiInstance); + return kodi_addon_peripheral_trigger_scan(m_kodi); } //---------------------------------------------------------------------------- @@ -575,7 +576,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// void RefreshButtonMaps(const std::string& deviceName = "", const std::string& controllerId = "") { - return m_instanceData->toKodi->refresh_button_maps(m_instanceData->toKodi->kodiInstance, + return kodi_addon_peripheral_refresh_button_maps(m_kodi, deviceName.c_str(), controllerId.c_str()); } //---------------------------------------------------------------------------- @@ -592,7 +593,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance unsigned int FeatureCount(const std::string& controllerId, JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN) { - return m_instanceData->toKodi->feature_count(m_instanceData->toKodi->kodiInstance, + return kodi_addon_peripheral_feature_count(m_kodi, controllerId.c_str(), type); } //---------------------------------------------------------------------------- @@ -607,7 +608,7 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance /// JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId, const std::string& featureName) { - return m_instanceData->toKodi->feature_type(m_instanceData->toKodi->kodiInstance, + return kodi_addon_peripheral_feature_type(m_kodi, controllerId.c_str(), featureName.c_str()); } //---------------------------------------------------------------------------- @@ -615,57 +616,59 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance ///@} private: - void SetAddonStruct(KODI_HANDLE instance) + void SetAddonStruct(KODI_HANDLE instance) override { if (instance == nullptr) throw std::logic_error("kodi::addon::CInstancePeripheral: Creation with empty addon " "structure not allowed, table must be given from Kodi!"); - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - - m_instanceData->toAddon->get_capabilities = ADDON_GetCapabilities; - m_instanceData->toAddon->perform_device_scan = ADDON_PerformDeviceScan; - m_instanceData->toAddon->free_scan_results = ADDON_FreeScanResults; - m_instanceData->toAddon->get_events = ADDON_GetEvents; - m_instanceData->toAddon->free_events = ADDON_FreeEvents; - m_instanceData->toAddon->send_event = ADDON_SendEvent; - - m_instanceData->toAddon->get_joystick_info = ADDON_GetJoystickInfo; - m_instanceData->toAddon->free_joystick_info = ADDON_FreeJoystickInfo; - m_instanceData->toAddon->get_features = ADDON_GetFeatures; - m_instanceData->toAddon->free_features = ADDON_FreeFeatures; - m_instanceData->toAddon->map_features = ADDON_MapFeatures; - m_instanceData->toAddon->get_ignored_primitives = ADDON_GetIgnoredPrimitives; - m_instanceData->toAddon->free_primitives = ADDON_FreePrimitives; - m_instanceData->toAddon->set_ignored_primitives = ADDON_SetIgnoredPrimitives; - m_instanceData->toAddon->save_button_map = ADDON_SaveButtonMap; - m_instanceData->toAddon->revert_button_map = ADDON_RevertButtonMap; - m_instanceData->toAddon->reset_button_map = ADDON_ResetButtonMap; - m_instanceData->toAddon->power_off_joystick = ADDON_PowerOffJoystick; - } - - inline static void ADDON_GetCapabilities(const AddonInstance_Peripheral* addonInstance, + KODI_INSTANCE_HDL* instanceKodi = static_cast(instance); + instanceKodi->type = ADDON_INSTANCE_PERIPHERAL; + instanceKodi->instance = this; + + instanceKodi->peripheral->get_capabilities = ADDON_GetCapabilities; + instanceKodi->peripheral->perform_device_scan = ADDON_PerformDeviceScan; + instanceKodi->peripheral->free_scan_results = ADDON_FreeScanResults; + instanceKodi->peripheral->get_events = ADDON_GetEvents; + instanceKodi->peripheral->free_events = ADDON_FreeEvents; + instanceKodi->peripheral->send_event = ADDON_SendEvent; + + instanceKodi->peripheral->get_joystick_info = ADDON_GetJoystickInfo; + instanceKodi->peripheral->free_joystick_info = ADDON_FreeJoystickInfo; + instanceKodi->peripheral->get_features = ADDON_GetFeatures; + instanceKodi->peripheral->free_features = ADDON_FreeFeatures; + instanceKodi->peripheral->map_features = ADDON_MapFeatures; + instanceKodi->peripheral->get_ignored_primitives = ADDON_GetIgnoredPrimitives; + instanceKodi->peripheral->free_primitives = ADDON_FreePrimitives; + instanceKodi->peripheral->set_ignored_primitives = ADDON_SetIgnoredPrimitives; + instanceKodi->peripheral->save_button_map = ADDON_SaveButtonMap; + instanceKodi->peripheral->revert_button_map = ADDON_RevertButtonMap; + instanceKodi->peripheral->reset_button_map = ADDON_ResetButtonMap; + instanceKodi->peripheral->power_off_joystick = ADDON_PowerOffJoystick; + m_kodi = instanceKodi->kodi; + } + + inline static void ADDON_GetCapabilities(KODI_ADDON_PERIPHERAL_HDL hdl, PERIPHERAL_CAPABILITIES* capabilities) { - if (!addonInstance || !capabilities) + if (!hdl || !capabilities) return; kodi::addon::PeripheralCapabilities peripheralCapabilities(capabilities); - static_cast(addonInstance->toAddon->addonInstance) + static_cast(hdl) ->GetCapabilities(peripheralCapabilities); } inline static PERIPHERAL_ERROR ADDON_PerformDeviceScan( - const AddonInstance_Peripheral* addonInstance, - unsigned int* peripheral_count, - PERIPHERAL_INFO** scan_results) + KODI_ADDON_PERIPHERAL_HDL hdl, + PERIPHERAL_INFO** scan_results, + size_t* peripheral_count) { - if (!addonInstance || !peripheral_count || !scan_results) + if (!hdl || !peripheral_count || !scan_results) return PERIPHERAL_ERROR_INVALID_PARAMETERS; std::vector> peripherals; - PERIPHERAL_ERROR err = static_cast(addonInstance->toAddon->addonInstance) + PERIPHERAL_ERROR err = static_cast(hdl) ->PerformDeviceScan(peripherals); if (err == PERIPHERAL_NO_ERROR) { @@ -676,25 +679,25 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreeScanResults(const AddonInstance_Peripheral* addonInstance, - unsigned int peripheral_count, - PERIPHERAL_INFO* scan_results) + inline static void ADDON_FreeScanResults(KODI_ADDON_PERIPHERAL_HDL hdl, + PERIPHERAL_INFO* scan_results, + size_t peripheral_count) { - if (!addonInstance) + if (!hdl) return; - kodi::addon::Peripherals::FreeStructs(peripheral_count, scan_results); + kodi::addon::Peripherals::FreeStructs(scan_results, peripheral_count); } - inline static PERIPHERAL_ERROR ADDON_GetEvents(const AddonInstance_Peripheral* addonInstance, - unsigned int* event_count, - PERIPHERAL_EVENT** events) + inline static PERIPHERAL_ERROR ADDON_GetEvents(KODI_ADDON_PERIPHERAL_HDL hdl, + PERIPHERAL_EVENT** events, + size_t* event_count) { - if (!addonInstance || !event_count || !events) + if (!hdl || !event_count || !events) return PERIPHERAL_ERROR_INVALID_PARAMETERS; std::vector peripheralEvents; - PERIPHERAL_ERROR err = static_cast(addonInstance->toAddon->addonInstance) + PERIPHERAL_ERROR err = static_cast(hdl) ->GetEvents(peripheralEvents); if (err == PERIPHERAL_NO_ERROR) { @@ -705,34 +708,34 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreeEvents(const AddonInstance_Peripheral* addonInstance, - unsigned int event_count, - PERIPHERAL_EVENT* events) + inline static void ADDON_FreeEvents(KODI_ADDON_PERIPHERAL_HDL hdl, + PERIPHERAL_EVENT* events, + size_t event_count) { - if (!addonInstance) + if (!hdl) return; - kodi::addon::PeripheralEvents::FreeStructs(event_count, events); + kodi::addon::PeripheralEvents::FreeStructs(events, event_count); } - inline static bool ADDON_SendEvent(const AddonInstance_Peripheral* addonInstance, + inline static bool ADDON_SendEvent(KODI_ADDON_PERIPHERAL_HDL hdl, const PERIPHERAL_EVENT* event) { - if (!addonInstance || !event) + if (!hdl || !event) return false; - return static_cast(addonInstance->toAddon->addonInstance) + return static_cast(hdl) ->SendEvent(kodi::addon::PeripheralEvent(*event)); } inline static PERIPHERAL_ERROR ADDON_GetJoystickInfo( - const AddonInstance_Peripheral* addonInstance, unsigned int index, JOYSTICK_INFO* info) + KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index, JOYSTICK_INFO* info) { - if (!addonInstance || !info) + if (!hdl || !info) return PERIPHERAL_ERROR_INVALID_PARAMETERS; kodi::addon::Joystick addonInfo; - PERIPHERAL_ERROR err = static_cast(addonInstance->toAddon->addonInstance) + PERIPHERAL_ERROR err = static_cast(hdl) ->GetJoystickInfo(index, addonInfo); if (err == PERIPHERAL_NO_ERROR) { @@ -742,28 +745,28 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreeJoystickInfo(const AddonInstance_Peripheral* addonInstance, + inline static void ADDON_FreeJoystickInfo(KODI_ADDON_PERIPHERAL_HDL hdl, JOYSTICK_INFO* info) { - if (!addonInstance) + if (!hdl) return; kodi::addon::Joystick::FreeStruct(*info); } - inline static PERIPHERAL_ERROR ADDON_GetFeatures(const AddonInstance_Peripheral* addonInstance, + inline static PERIPHERAL_ERROR ADDON_GetFeatures(KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick, const char* controller_id, - unsigned int* feature_count, - JOYSTICK_FEATURE** features) + JOYSTICK_FEATURE** features, + size_t* feature_count) { - if (!addonInstance || !joystick || !controller_id || !feature_count || !features) + if (!hdl || !joystick || !controller_id || !feature_count || !features) return PERIPHERAL_ERROR_INVALID_PARAMETERS; kodi::addon::Joystick addonJoystick(*joystick); std::vector featuresVector; - PERIPHERAL_ERROR err = static_cast(addonInstance->toAddon->addonInstance) + PERIPHERAL_ERROR err = static_cast(hdl) ->GetFeatures(addonJoystick, controller_id, featuresVector); if (err == PERIPHERAL_NO_ERROR) { @@ -774,23 +777,23 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreeFeatures(const AddonInstance_Peripheral* addonInstance, - unsigned int feature_count, - JOYSTICK_FEATURE* features) + inline static void ADDON_FreeFeatures(KODI_ADDON_PERIPHERAL_HDL hdl, + JOYSTICK_FEATURE* features, + size_t feature_count) { - if (!addonInstance) + if (!hdl) return; - kodi::addon::JoystickFeatures::FreeStructs(feature_count, features); + kodi::addon::JoystickFeatures::FreeStructs(features, feature_count); } - inline static PERIPHERAL_ERROR ADDON_MapFeatures(const AddonInstance_Peripheral* addonInstance, + inline static PERIPHERAL_ERROR ADDON_MapFeatures(KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick, const char* controller_id, - unsigned int feature_count, - const JOYSTICK_FEATURE* features) + const JOYSTICK_FEATURE* features, + size_t feature_count) { - if (!addonInstance || !joystick || !controller_id || (feature_count > 0 && !features)) + if (!hdl || !joystick || !controller_id || (feature_count > 0 && !features)) return PERIPHERAL_ERROR_INVALID_PARAMETERS; kodi::addon::Joystick addonJoystick(*joystick); @@ -799,23 +802,23 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance for (unsigned int i = 0; i < feature_count; i++) primitiveVector.emplace_back(*(features + i)); - return static_cast(addonInstance->toAddon->addonInstance) + return static_cast(hdl) ->MapFeatures(addonJoystick, controller_id, primitiveVector); } inline static PERIPHERAL_ERROR ADDON_GetIgnoredPrimitives( - const AddonInstance_Peripheral* addonInstance, + KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick, - unsigned int* primitive_count, - JOYSTICK_DRIVER_PRIMITIVE** primitives) + JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count) { - if (!addonInstance || !joystick || !primitive_count || !primitives) + if (!hdl || !joystick || !primitive_count || !primitives) return PERIPHERAL_ERROR_INVALID_PARAMETERS; kodi::addon::Joystick addonJoystick(*joystick); std::vector primitiveVector; - PERIPHERAL_ERROR err = static_cast(addonInstance->toAddon->addonInstance) + PERIPHERAL_ERROR err = static_cast(hdl) ->GetIgnoredPrimitives(addonJoystick, primitiveVector); if (err == PERIPHERAL_NO_ERROR) { @@ -826,23 +829,23 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreePrimitives(const AddonInstance_Peripheral* addonInstance, - unsigned int primitive_count, - JOYSTICK_DRIVER_PRIMITIVE* primitives) + inline static void ADDON_FreePrimitives(KODI_ADDON_PERIPHERAL_HDL hdl, + JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) { - if (!addonInstance) + if (!hdl) return; - kodi::addon::DriverPrimitives::FreeStructs(primitive_count, primitives); + kodi::addon::DriverPrimitives::FreeStructs(primitives, primitive_count); } inline static PERIPHERAL_ERROR ADDON_SetIgnoredPrimitives( - const AddonInstance_Peripheral* addonInstance, + KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick, - unsigned int primitive_count, - const JOYSTICK_DRIVER_PRIMITIVE* primitives) + const JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) { - if (!addonInstance || !joystick || (primitive_count > 0 && !primitives)) + if (!hdl || !joystick || (primitive_count > 0 && !primitives)) return PERIPHERAL_ERROR_INVALID_PARAMETERS; kodi::addon::Joystick addonJoystick(*joystick); @@ -851,55 +854,54 @@ class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance for (unsigned int i = 0; i < primitive_count; i++) primitiveVector.emplace_back(*(primitives + i)); - return static_cast(addonInstance->toAddon->addonInstance) + return static_cast(hdl) ->SetIgnoredPrimitives(addonJoystick, primitiveVector); } - inline static void ADDON_SaveButtonMap(const AddonInstance_Peripheral* addonInstance, + inline static void ADDON_SaveButtonMap(KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick) { - if (!addonInstance || !joystick) + if (!hdl || !joystick) return; kodi::addon::Joystick addonJoystick(*joystick); - static_cast(addonInstance->toAddon->addonInstance) + static_cast(hdl) ->SaveButtonMap(addonJoystick); } - inline static void ADDON_RevertButtonMap(const AddonInstance_Peripheral* addonInstance, + inline static void ADDON_RevertButtonMap(KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick) { - if (!addonInstance || !joystick) + if (!hdl || !joystick) return; kodi::addon::Joystick addonJoystick(*joystick); - static_cast(addonInstance->toAddon->addonInstance) + static_cast(hdl) ->RevertButtonMap(addonJoystick); } - inline static void ADDON_ResetButtonMap(const AddonInstance_Peripheral* addonInstance, + inline static void ADDON_ResetButtonMap(KODI_ADDON_PERIPHERAL_HDL hdl, const JOYSTICK_INFO* joystick, const char* controller_id) { - if (!addonInstance || !joystick || !controller_id) + if (!hdl || !joystick || !controller_id) return; kodi::addon::Joystick addonJoystick(*joystick); - static_cast(addonInstance->toAddon->addonInstance) + static_cast(hdl) ->ResetButtonMap(addonJoystick, controller_id); } - inline static void ADDON_PowerOffJoystick(const AddonInstance_Peripheral* addonInstance, + inline static void ADDON_PowerOffJoystick(KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index) { - if (!addonInstance) + if (!hdl) return; - static_cast(addonInstance->toAddon->addonInstance) - ->PowerOffJoystick(index); + static_cast(hdl)->PowerOffJoystick(index); } - AddonInstance_Peripheral* m_instanceData; + KODI_OWN_HDL m_kodi; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h index d4ac1aa3e6ab0..a8b28459e6b3f 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h @@ -13,6 +13,9 @@ #include "../gui/renderHelper.h" #ifdef __cplusplus + +#include + namespace kodi { namespace addon @@ -190,7 +193,7 @@ namespace addon /// The destruction of the example class `CMyScreenSaver` is called from /// Kodi's header. Manually deleting the add-on instance is not required. /// -class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance +class ATTR_DLL_LOCAL CInstanceScreensaver : public IAddonInstance { public: //============================================================================ @@ -200,17 +203,18 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// Used by an add-on that only supports screensavers. /// CInstanceScreensaver() - : IAddonInstance(ADDON_INSTANCE_SCREENSAVER, GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER)) + : IAddonInstance(ADDON_INSTANCE_SCREENSAVER) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::ifc.m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of more as one in single " "instance way is not allowed!"); - SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); - CAddonBase::m_interface->globalSingleInstance = this; + m_kodi = CAddonBase::ifc.m_firstInstance; + CAddonBase::ifc.m_globalSingleInstance = this; } //---------------------------------------------------------------------------- + //============================================================================ /// @ingroup cpp_kodi_addon_screensaver /// @brief Screensaver class constructor used to support multiple instance @@ -252,12 +256,10 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// } /// ~~~~~~~~~~~~~ /// - explicit CInstanceScreensaver(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_SCREENSAVER, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER)) + explicit CInstanceScreensaver(KODI_HANDLE instance) + : IAddonInstance(ADDON_INSTANCE_SCREENSAVER) { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) + if (CAddonBase::ifc.m_globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of multiple together " "with single instance way is not allowed!"); @@ -327,7 +329,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// .. /// ~~~~~~~~~~~~~ /// - inline kodi::HardwareContext Device() { return m_instanceData->props->device; } + inline kodi::HardwareContext Device() { return m_device; } //---------------------------------------------------------------------------- //============================================================================ @@ -336,7 +338,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The X position, in pixels /// - inline int X() { return m_instanceData->props->x; } + inline int X() { return m_x; } //---------------------------------------------------------------------------- //============================================================================ @@ -345,7 +347,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The Y position, in pixels /// - inline int Y() { return m_instanceData->props->y; } + inline int Y() { return m_y; } //---------------------------------------------------------------------------- //============================================================================ @@ -354,7 +356,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The width, in pixels /// - inline int Width() { return m_instanceData->props->width; } + inline int Width() { return m_width; } //---------------------------------------------------------------------------- //============================================================================ @@ -363,7 +365,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The height, in pixels /// - inline int Height() { return m_instanceData->props->height; } + inline int Height() { return m_height; } //---------------------------------------------------------------------------- //============================================================================ @@ -373,7 +375,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The pixel aspect ratio used by the display /// - inline float PixelRatio() { return m_instanceData->props->pixelRatio; } + inline float PixelRatio() { return m_pixelRatio; } //---------------------------------------------------------------------------- //============================================================================ @@ -382,7 +384,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The add-on name /// - inline std::string Name() { return m_instanceData->props->name; } + inline std::string Name() { return m_name; } //---------------------------------------------------------------------------- //============================================================================ @@ -392,7 +394,7 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return The add-on installation path /// - inline std::string Presets() { return m_instanceData->props->presets; } + inline std::string Presets() { return m_presets; } //---------------------------------------------------------------------------- //============================================================================ @@ -405,45 +407,68 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance /// /// @return Path to the user profile /// - inline std::string Profile() { return m_instanceData->props->profile; } + inline std::string Profile() { return m_profile; } //---------------------------------------------------------------------------- ///@} private: - void SetAddonStruct(KODI_HANDLE instance) + void SetAddonStruct(KODI_HANDLE instance) override { if (instance == nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation with empty addon " "structure not allowed, table must be given from Kodi!"); - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->Start = ADDON_Start; - m_instanceData->toAddon->Stop = ADDON_Stop; - m_instanceData->toAddon->Render = ADDON_Render; + KODI_INSTANCE_HDL* instanceKodi = static_cast(instance); + instanceKodi->type = ADDON_INSTANCE_SCREENSAVER; + instanceKodi->instance = this; + instanceKodi->screensaver->start = ADDON_Start; + instanceKodi->screensaver->stop = ADDON_Stop; + instanceKodi->screensaver->render = ADDON_Render; + m_kodi = instanceKodi->kodi; + + SCREENSAVER_PROPS props = {}; + kodi_addon_screensaver_get_properties(m_kodi, &props); + m_device = props.device; + m_x = props.x; + m_y = props.y; + m_width = props.width; + m_height = props.height; + m_pixelRatio = props.pixelRatio; + if (props.name) + { + m_name = props.name; + free(props.name); + } + if (props.presets) + { + m_presets = props.presets; + free(props.presets); + } + if (props.profile) + { + m_profile = props.profile; + free(props.profile); + } } - inline static bool ADDON_Start(AddonInstance_Screensaver* instance) + inline static bool ADDON_Start(KODI_ADDON_SCREENSAVER_HDL hdl) { - CInstanceScreensaver* thisClass = - static_cast(instance->toAddon->addonInstance); + CInstanceScreensaver* thisClass = static_cast(hdl); thisClass->m_renderHelper = kodi::gui::GetRenderHelper(); return thisClass->Start(); } - inline static void ADDON_Stop(AddonInstance_Screensaver* instance) + inline static void ADDON_Stop(KODI_ADDON_SCREENSAVER_HDL hdl) { - CInstanceScreensaver* thisClass = - static_cast(instance->toAddon->addonInstance); + CInstanceScreensaver* thisClass = static_cast(hdl); thisClass->Stop(); thisClass->m_renderHelper = nullptr; } - inline static void ADDON_Render(AddonInstance_Screensaver* instance) + inline static void ADDON_Render(KODI_ADDON_SCREENSAVER_HDL hdl) { - CInstanceScreensaver* thisClass = - static_cast(instance->toAddon->addonInstance); + CInstanceScreensaver* thisClass = static_cast(hdl); if (!thisClass->m_renderHelper) return; @@ -462,7 +487,18 @@ class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance * On Kodi with Direct X where angle is present becomes this used. */ std::shared_ptr m_renderHelper; - AddonInstance_Screensaver* m_instanceData; + + ADDON_HARDWARE_CONTEXT2 m_device; + int m_x; + int m_y; + int m_width; + int m_height; + float m_pixelRatio; + std::string m_name; + std::string m_presets; + std::string m_profile; + + KODI_OWN_HDL m_kodi; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h deleted file mode 100644 index dbfb833ef1e7e..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h +++ /dev/null @@ -1,1226 +0,0 @@ -/* - * Copyright (C) 2015-2018 Team Kodi - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../Filesystem.h" -#include "../c-api/addon-instance/vfs.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -class CInstanceVFS; - -//============================================================================== -/// @ingroup cpp_kodi_addon_vfs_Defs -/// @brief **VFS add-on file handle**\n -/// This used to handle opened files of addon with related memory pointer about -/// class or structure and to have on further file control functions available. -/// -/// See @ref cpp_kodi_addon_vfs_filecontrol "file editing functions" for used -/// places. -/// -///@{ -using VFSFileHandle = VFS_FILE_HANDLE; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_vfs_Defs_VFSUrl class VFSUrl -/// @ingroup cpp_kodi_addon_vfs_Defs -/// @brief **VFS add-on URL data**\n -/// This class is used to inform the addon of the desired wanted connection. -/// -/// Used on mostly all addon functions to identify related target. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help -/// -///@{ -class ATTRIBUTE_HIDDEN VFSUrl : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceVFS; - /*! \endcond */ - -public: - /// @defgroup cpp_kodi_addon_vfs_Defs_VFSUrl_Help Value Help - /// @ingroup cpp_kodi_addon_vfs_Defs_VFSUrl - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_vfs_Defs_VFSUrl : - /// | Name | Type | Get call - /// |------|------|---------- - /// | **URL** | `std::string` | @ref VFSUrl::GetURL "GetURL" - /// | **Domain name** | `std::string` | @ref VFSUrl::GetDomain "GetDomain" - /// | **Hostname** | `std::string` | @ref VFSUrl::GetHostname "GetHostname" - /// | **Filename** | `std::string` | @ref VFSUrl::GetFilename "GetFilename" - /// | **Network port** | `unsigned int` | @ref VFSUrl::GetPort "GetPort" - /// | **Special options** | `std::string` | @ref VFSUrl::GetOptions "GetOptions" - /// | **Username** | `std::string` | @ref VFSUrl::GetUsername "GetUsername" - /// | **Password** | `std::string` | @ref VFSUrl::GetPassword "GetPassword" - /// | **Get URL with user and password hidden** | `std::string` | @ref VFSUrl::GetRedacted "GetRedacted" - /// | **Sharename** | `std::string` | @ref VFSUrl::GetSharename "GetSharename" - /// | **Network protocol** | `std::string` | @ref VFSUrl::GetProtocol "GetProtocol" - /// - - /// @addtogroup cpp_kodi_addon_vfs_Defs_VFSUrl - ///@{ - - /// @brief Desired URL of the file system to be edited - /// - /// This includes all available parts of the access and is structured as - /// follows: - /// - - /// ``://``:```@```:``/``?`` - std::string GetURL() const { return m_cStructure->url; } - - /// @brief The associated domain name, which is optional and not available - /// in all cases. - std::string GetDomain() const { return m_cStructure->domain; } - - /// @brief This includes the network address (e.g. `192.168.0.123`) or if - /// the addon refers to file packages the path to it - /// (e.g. `/home/by_me/MyPacket.rar`). - std::string GetHostname() const { return m_cStructure->hostname; } - - /// @brief With this variable the desired path to a folder or file within - /// the hostname is given (e.g. `storage/videos/00001.ts`). - std::string GetFilename() const { return m_cStructure->filename; } - - /// @brief [Networking port](https://en.wikipedia.org/wiki/Port_(computer_networking)) - /// to use for protocol. - unsigned int GetPort() const { return m_cStructure->port; } - - /// @brief Special options on opened URL, this can e.g. on RAR packages - /// `?flags=8&nextvalue=123` to inform about to not cache a read. - /// - /// Available options from Kodi: - /// | Value: | Description: - /// |-----------|------------------- - /// | flags=8 | Used on RAR packages so that no data is cached from the requested source. - /// | cache=no | Used on ZIP packages so that no data from the requested source is stored in the cache. However, this is currently not available from addons! - /// - /// In addition, other addons can use the URLs given by them to give options - /// that fit the respective VFS addon and allow special operations. - /// - /// @note This procedure is not yet standardized and is currently not - /// exactly available which are handed over. - std::string GetOptions() const { return m_cStructure->options; } - - /// @brief Desired username. - std::string GetUsername() const { return m_cStructure->username; } - - /// @brief Desired password. - std::string GetPassword() const { return m_cStructure->password; } - - /// @brief The complete URL is passed on here, but the user name and - /// password are not shown and only appear to there as `USERNAME:PASSWORD`. - /// - /// As example `sftp://USERNAME:PASSWORD@192.168.178.123/storage/videos/00001.ts`. - std::string GetRedacted() const { return m_cStructure->redacted; } - - /// @brief The name which is taken as the basis by source and would be first - /// in folder view. - /// - /// As example on `sftp://dudu:isprivate@192.168.178.123/storage/videos/00001.ts` - /// becomes then `storage` used here. - std::string GetSharename() const { return m_cStructure->sharename; } - - /// @brief Protocol name used on this stream, e.g. `sftp`. - std::string GetProtocol() const { return m_cStructure->protocol; } - - ///@} - -private: - VFSUrl() = delete; - VFSUrl(const VFSUrl& channel) = delete; - VFSUrl(const VFSURL* channel) : CStructHdl(channel) {} - VFSUrl(VFSURL* channel) : CStructHdl(channel) {} -}; -///@} -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_vfs_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_vfs -/// @brief **VFS add-on general variables** -/// -/// Used to exchange the available options between Kodi and addon. -/// -/// - -//============================================================================== -/// -/// @addtogroup cpp_kodi_addon_vfs -/// @brief \cpp_class{ kodi::addon::CInstanceVFS } -/// **Virtual Filesystem (VFS) add-on instance** -/// -/// This instance type is used to allow Kodi various additional file system -/// types. Be it a special file system, a compressed package or a system -/// available over the network, everything is possible with it. -/// -/// This usage can be requested under various conditions, for example explicitly -/// by another addon, by a Mimetype protocol defined in `addon.xml` or supported -/// file extensions. -/// -/// Include the header @ref VFS.h "#include " -/// to use this class. -/// -/// ---------------------------------------------------------------------------- -/// -/// Here is an example of what the `addon.xml.in` would look like for an VFS addon: -/// -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// @ADDON_DEPENDS@ -/// -/// -/// My VFS addon summary -/// My VFS description -/// @PLATFORM@ -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// @note Regarding boolean values with "false", these can also be omitted, -/// since this would be the default. -/// -/// -/// ### Standard values that can be declared for processing in `addon.xml`. -/// -/// These values are used by Kodi to identify associated streams and file -/// extensions and then to select the associated addon. -/// -/// \table_start -/// \table_h3{ Labels, Type, Description } -/// \table_row3{ `point`, -/// \anchor cpp_kodi_addon_vfs_point -/// string, -/// The identification of the addon instance to VFS is mandatory `kodi.vfs`. -/// In addition\, the instance declared in the first `` is also the main type of addon. -/// } -/// \table_row3{ `defaultPort`, -/// \anchor cpp_kodi_addon_vfs_defaultPort -/// integer, -/// Default [networking port](https://en.wikipedia.org/wiki/Port_(computer_networking)) -/// to use for protocol. -/// } -/// \table_row3{ `directories`, -/// \anchor cpp_kodi_addon_vfs_directories -/// boolean, -/// VFS entry can list directories. -/// } -/// \table_row3{ `extensions`, -/// \anchor cpp_kodi_addon_vfs_extensions -/// string, -/// Extensions for VFS entry.\n -/// It is possible to declare several using `|`\, e.g. `.abc|.def|.ghi`. -/// } -/// \table_row3{ `encodedhostname`, -/// \anchor cpp_kodi_addon_vfs_encodedhostname -/// boolean, -/// URL protocol from add-ons use encoded hostnames. -/// } -/// \table_row3{ `filedirectories`, -/// \anchor cpp_kodi_addon_vfs_filedirectories -/// boolean, -/// VFS entry contains file directories. -/// } -/// \table_row3{ `files`, -/// \anchor cpp_kodi_addon_vfs_directories -/// boolean, -/// Set to declare that VFS provides files. -/// } -/// \table_row3{ `protocols`, -/// \anchor cpp_kodi_addon_vfs_protocols -/// boolean, -/// Protocols for VFS entry.\n -/// It is possible to declare several using `|`\, e.g. `myprot1|myprot2`.\n -/// @note This field also used to show on GUI\, see `supportBrowsing` below about *2:. -/// When used there\, however\, only a **single** protocol is possible! -/// } -/// \table_row3{ `supportWrite`, -/// \anchor cpp_kodi_addon_vfs_supportWrite -/// boolean, -/// Protocol supports write operations. -/// } -/// \table_row3{ `zeroconf`, -/// \anchor cpp_kodi_addon_vfs_zeroconf -/// string, -/// [Zero conf](https://en.wikipedia.org/wiki/Zero-configuration_networking) announce string for VFS protocol. -/// } -/// \table_row3{ `library_@PLATFORM@`, -/// \anchor cpp_kodi_addon_vfs_library -/// string, -/// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated `addon.xml`. -/// } -/// \table_end -/// -/// -/// ### User selectable parts of the addon. -/// -/// The following table describes the values that can be defined by `addon.xml` -/// and which part they relate to for user input. -/// -/// \table_start -/// \table_h3{ Labels, Type, Description } -/// \table_row3{ `supportBrowsing`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportBrowsing -/// boolean, -/// Protocol supports server browsing. Used to open related sources by users in the window.\n\n -/// | Associated places in Kodi: | -/// | :---- | -/// | \image html cpp_kodi_addon_vfs_protocol_1.png | -///
-/// *1: The entry in the menu represented by this option corresponds to the text given with `label`. -/// When the button is pressed\, @ref CInstanceVFS::GetDirectory is called on the add-on to get its content.\n -/// *2: Protocol name of the stream defined with `protocols` in xml.\n -/// @remark See also `supportDialog` about *3:. -/// } -/// \table_row3{ `supportDialog`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportDialog -/// boolean, -/// To point out that Kodi assigns a dialog to this VFS in order to compare it with other values e.g. query supportPassword in it.\n -/// This will be available when adding sources in Kodi under "Add network location...".\n\n -/// | Associated places in Kodi: | -/// | :---- | -/// | \image html cpp_kodi_addon_vfs_protocol_2.png | -///
-/// *1: Field for selecting the VFS handler\, the addon will be available if `supportDialog` is set to `true`.\n -/// *2: To set the associated server address. **Note:** *This field is always activated and cannot be changed by the addon.*\n -/// *3: If `supportBrowsing` is set to `true`\, the button for opening a file selection dialog is given here too\, as in the file window.\n -/// *4: This field is available if `supportPath` is set to `true`.\n -/// *5: To edit the connection port. This field is available if `supportPort` is set to `true`.\n -/// *6: This sets the required username and is available when `supportUsername` is set to `true`.\n -/// *7: This sets the required password and is available when `supportPassword` is set to `true`. -/// } -/// \table_row3{ `supportPath`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportPath -/// boolean, -/// Protocol has path in addition to server name (see `supportDialog` about *4:). -/// } -/// \table_row3{ `supportPort`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportPort -/// boolean, -/// Protocol supports port customization (see `supportDialog` about *5:). -/// } -/// \table_row3{ `supportUsername`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportUsername -/// boolean, -/// Protocol uses logins (see `supportDialog` about *6:). -/// } -/// \table_row3{ `supportPassword`, -/// \anchor cpp_kodi_addon_vfs_protocol_supportPassword -/// boolean, -/// Protocol supports passwords (see `supportDialog` about *7:). -/// } -/// \table_row3{ `protocols`, -/// \anchor cpp_kodi_addon_vfs_protocol_protocols -/// string, -/// Protocols for VFS entry. -/// @note This field is not editable and only used on GUI to show his name\, see `supportBrowsing` about *2: -/// } -/// \table_row3{ `label`, -/// \anchor cpp_kodi_addon_vfs_protocol_label -/// integer, -/// The text identification number used in Kodi for display in the menu at `supportDialog` -/// as a selection option and at `supportBrowsing` (see his image reference *1) as a menu entry.\n -/// This can be a text identifier in Kodi or from addon.\n -/// @remark For addon within 30000-30999 or 32000-32999. -/// } -/// \table_end -/// -/// @remark For more detailed description of the `addon.xml`, see also https://kodi.wiki/view/Addon.xml. -/// -/// -/// -------------------------------------------------------------------------- -/// -/// -/// **Example:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class CMyVFS : public kodi::addon::CInstanceVFS -/// { -/// public: -/// CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion); -/// -/// // Add all your required functions, the most CInstanceVFS functions of -/// // must be included to have addon working correctly. -/// ... -/// }; -/// -/// CMyVFS::CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion) -/// : kodi::addon::CInstanceVFS(instance, kodiVersion) -/// { -/// ... -/// } -/// -/// ... -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() { } -/// ADDON_STATUS CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_VFS) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Creating my VFS instance"); -/// addonInstance = new CMyVFS(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyVFS` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -//------------------------------------------------------------------------------ -class ATTRIBUTE_HIDDEN CInstanceVFS : public IAddonInstance -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs - /// @brief VFS class constructor used to support multiple instance - /// types - /// - /// @param[in] instance The instance value given to - /// `kodi::addon::CAddonBase::CreateInstance(...)`. - /// @param[in] kodiVersion [opt] given from Kodi by @ref CAddonBase::CreateInstance - /// to identify his instance API version - /// - /// @note Instance path as a single is not supported by this type. It must - /// ensure that it can be called up several times. - /// - /// @warning Only use `instance` from the @ref CAddonBase::CreateInstance or - /// @ref CAddonBase::CreateInstance call. - /// - explicit CInstanceVFS(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_VFS, - !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_VFS)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVFS: Creation of multiple together with single " - "instance way is not allowed!"); - - SetAddonStruct(instance); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs - /// @brief Destructor - /// - ~CInstanceVFS() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_vfs_general 1. General access functions - /// @ingroup cpp_kodi_addon_vfs - /// @brief **General access functions** - /// - /// This functions which are intended for getting folders, editing storage - /// locations and file system queries. - /// - - //============================================================================ - /// @defgroup cpp_kodi_addon_vfs_filecontrol 2. File editing functions - /// @ingroup cpp_kodi_addon_vfs - /// @brief **File editing functions.** - /// - /// This value represents the addon-side handlers and to be able to identify - /// his own parts in the event of further access. - /// - - //@{ - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Open a file for input - /// - /// @param[in] url The URL of the file - /// @return Context for the opened file - /// - /// - /// ---------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help - /// - virtual kodi::addon::VFSFileHandle Open(const kodi::addon::VFSUrl& url) { return nullptr; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Open a file for output - /// - /// @param[in] url The URL of the file - /// @param[in] overWrite Whether or not to overwrite an existing file - /// @return Context for the opened file - /// - virtual kodi::addon::VFSFileHandle OpenForWrite(const kodi::addon::VFSUrl& url, bool overWrite) - { - return nullptr; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Close a file - /// - /// @param[in] context The context of the file - /// @return True on success, false on failure - /// - virtual bool Close(kodi::addon::VFSFileHandle context) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Read from a file - /// - /// @param[in] context The context of the file - /// @param[out] buffer The buffer to read data into - /// @param[in] uiBufSize Number of bytes to read - /// @return Number of bytes read - /// - virtual ssize_t Read(kodi::addon::VFSFileHandle context, uint8_t* buffer, size_t uiBufSize) - { - return -1; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Write to a file - /// - /// @param[in] context The context of the file - /// @param[in] buffer The buffer to read data from - /// @param[in] uiBufSize Number of bytes to write - /// @return Number of bytes written - /// - virtual ssize_t Write(kodi::addon::VFSFileHandle context, const uint8_t* buffer, size_t uiBufSize) - { - return -1; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Seek in a file - /// - /// @param[in] context The context of the file - /// @param[in] position The position to seek to - /// @param[in] whence Position in file 'position' is relative to (SEEK_CUR, SEEK_SET, SEEK_END): - /// | Value | int | Description | - /// |:--------:|:---:|:----------------------------------------------------| - /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. - /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." - /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. - /// @return Offset in file after seek - /// - virtual int64_t Seek(kodi::addon::VFSFileHandle context, int64_t position, int whence) - { - return -1; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Truncate a file - /// - /// @param[in] context The context of the file - /// @param[in] size The size to truncate the file to - /// @return 0 on success, -1 on error - /// - virtual int Truncate(kodi::addon::VFSFileHandle context, int64_t size) { return -1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Get total size of a file - /// - /// @param[in] context The context of the file - /// @return Total file size - /// - virtual int64_t GetLength(kodi::addon::VFSFileHandle context) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Get current position in a file - /// - /// @param[in] context The context of the file - /// @return Current position - /// - virtual int64_t GetPosition(kodi::addon::VFSFileHandle context) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Get chunk size of a file - /// - /// @param[in] context The context of the file - /// @return Chunk size - /// - virtual int GetChunkSize(kodi::addon::VFSFileHandle context) { return 1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief To check seek possible on current stream by file. - /// - /// @return true if seek possible, false if not - /// - virtual bool IoControlGetSeekPossible(kodi::addon::VFSFileHandle context) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief To check a running stream on file for state of his cache. - /// - /// @param[in] status Information about current cache status - /// @return true if successfull done, false otherwise - /// - /// - /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help - /// - virtual bool IoControlGetCacheStatus(kodi::addon::VFSFileHandle context, - kodi::vfs::CacheStatus& status) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Unsigned int with speed limit for caching in bytes per second. - /// - /// @param[in] rate Cache rate size to use - /// @return true if successfull done, false otherwise - /// - virtual bool IoControlSetCacheRate(kodi::addon::VFSFileHandle context, unsigned int rate) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_filecontrol - /// @brief Enable/disable retry within the protocol handler (if supported). - /// - /// @param[in] retry To set the retry, true for use, false for not - /// @return true if successfull done, false otherwise - /// - virtual bool IoControlSetRetry(kodi::addon::VFSFileHandle context, bool retry) { return false; } - //---------------------------------------------------------------------------- - //@} - - //@{ - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Stat a file - /// - /// @param[in] url The URL of the file - /// @param[in] buffer The buffer to store results in - /// @return -1 on error, 0 otherwise - /// - /// - /// ---------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help - /// - virtual int Stat(const kodi::addon::VFSUrl& url, kodi::vfs::FileStatus& buffer) { return 0; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Check for file existence - /// - /// @param[in] url The URL of the file - /// @return True if file exists, false otherwise - /// - virtual bool Exists(const kodi::addon::VFSUrl& url) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Clear out any idle connections - /// - virtual void ClearOutIdle() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Disconnect all connections - /// - virtual void DisconnectAll() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Delete a file - /// - /// @param[in] url The URL of the file - /// @return True if deletion was successful, false otherwise - /// - virtual bool Delete(const kodi::addon::VFSUrl& url) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Rename a file - /// - /// @param[in] url The URL of the source file - /// @param[in] url2 The URL of the destination file - /// @return True if deletion was successful, false otherwise - /// - virtual bool Rename(const kodi::addon::VFSUrl& url, const kodi::addon::VFSUrl& url2) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Check for directory existence - /// - /// @param[in] url The URL of the file - /// @return True if directory exists, false otherwise - /// - virtual bool DirectoryExists(const kodi::addon::VFSUrl& url) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Remove a directory - /// - /// @param[in] url The URL of the directory - /// @return True if removal was successful, false otherwise - /// - virtual bool RemoveDirectory(const kodi::addon::VFSUrl& url) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Create a directory - /// - /// @param[in] url The URL of the file - /// @return True if creation was successful, false otherwise - /// - virtual bool CreateDirectory(const kodi::addon::VFSUrl& url) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_vfs_general_cb_GetDirectory Callbacks GetDirectory() - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Callback functions on GetDirectory() - /// - /// This functions becomes available during call of GetDirectory() from - /// Kodi. - /// - /// If GetDirectory() returns false becomes the parts from here used on - /// next call of the function. - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// - /// #include - /// - /// ... - /// - /// bool CMyVFS::GetDirectory(const kodi::addon::VFSUrl& url, - /// std::vector& items, - /// CVFSCallbacks callbacks) - /// { - /// std::string neededString; - /// callbacks.GetKeyboardInput("Test", neededString, true); - /// if (neededString.empty()) - /// return false; - /// - /// // Do the work - /// ... - /// return true; - /// } - /// ~~~~~~~~~~~~~ - /// - class CVFSCallbacks - { - public: - /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory - /// @brief Require keyboard input - /// - /// Becomes called if GetDirectory() returns false and GetDirectory() - /// becomes after entry called again. - /// - /// @param[in] heading The heading of the keyboard dialog - /// @param[out] input The resulting string. Returns string after - /// second call! - /// @param[in] hiddenInput To show input only as "*" on dialog - /// @return True if input was received, false otherwise - /// - bool GetKeyboardInput(const std::string& heading, std::string& input, bool hiddenInput = false) - { - char* cInput = nullptr; - bool ret = m_cb->get_keyboard_input(m_cb->ctx, heading.c_str(), &cInput, hiddenInput); - if (cInput) - { - input = cInput; - ::kodi::addon::CAddonBase::m_interface->toKodi->free_string( - ::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, cInput); - } - return ret; - } - - /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory - /// @brief Display an error dialog - /// - /// @param[in] heading The heading of the error dialog - /// @param[in] line1 The first line of the error dialog - /// @param[in] line2 [opt] The second line of the error dialog - /// @param[in] line3 [opt] The third line of the error dialog - /// - void SetErrorDialog(const std::string& heading, - const std::string& line1, - const std::string& line2 = "", - const std::string& line3 = "") - { - m_cb->set_error_dialog(m_cb->ctx, heading.c_str(), line1.c_str(), line2.c_str(), - line3.c_str()); - } - - /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory - /// @brief Prompt the user for authentication of a URL - /// - /// @param[in] url The URL - void RequireAuthentication(const std::string& url) - { - m_cb->require_authentication(m_cb->ctx, url.c_str()); - } - - explicit CVFSCallbacks(const VFSGetDirectoryCallbacks* cb) : m_cb(cb) {} - - private: - const VFSGetDirectoryCallbacks* m_cb; - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief List a directory - /// - /// @param[in] url The URL of the directory - /// @param[out] entries The entries in the directory, see - /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry" - /// about his content - /// @param[in] callbacks A callback structure - /// @return Context for the directory listing - /// - /// - /// -------------------------------------------------------------------------- - /// - /// ### Callbacks: - /// @copydetails cpp_kodi_addon_vfs_general_cb_GetDirectory - /// - /// **Available callback functions** - /// | Function: | Description - /// |--|-- - /// | CVFSCallbacks::GetKeyboardInput | @copybrief CVFSCallbacks::GetKeyboardInput @copydetails CVFSCallbacks::GetKeyboardInput - /// | CVFSCallbacks::SetErrorDialog | @copybrief CVFSCallbacks::SetErrorDialog @copydetails CVFSCallbacks::SetErrorDialog - /// | CVFSCallbacks::RequireAuthentication | @copybrief CVFSCallbacks::RequireAuthentication @copydetails CVFSCallbacks::RequireAuthentication - /// - virtual bool GetDirectory(const kodi::addon::VFSUrl& url, - std::vector& entries, - CVFSCallbacks callbacks) - { - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_vfs_general - /// @brief Check if file should be presented as a directory (multiple streams) - /// - /// @param[in] url The URL of the file - /// @param[out] entries The entries in the directory, see - /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry" - /// about his content - /// @param[out] rootPath Path to root directory if multiple entries - /// @return Context for the directory listing - /// - virtual bool ContainsFiles(const kodi::addon::VFSUrl& url, - std::vector& entries, - std::string& rootPath) - { - return false; - } - //---------------------------------------------------------------------------- - //@} - -private: - void SetAddonStruct(KODI_HANDLE instance) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstanceVFS: Creation with empty addon structure not " - "allowed, table must be given from Kodi!"); - - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->open = ADDON_Open; - m_instanceData->toAddon->open_for_write = ADDON_OpenForWrite; - m_instanceData->toAddon->read = ADDON_Read; - m_instanceData->toAddon->write = ADDON_Write; - m_instanceData->toAddon->seek = ADDON_Seek; - m_instanceData->toAddon->truncate = ADDON_Truncate; - m_instanceData->toAddon->get_length = ADDON_GetLength; - m_instanceData->toAddon->get_position = ADDON_GetPosition; - m_instanceData->toAddon->get_chunk_size = ADDON_GetChunkSize; - m_instanceData->toAddon->io_control_get_seek_possible = ADDON_IoControlGetSeekPossible; - m_instanceData->toAddon->io_control_get_cache_status = ADDON_IoControlGetCacheStatus; - m_instanceData->toAddon->io_control_set_cache_rate = ADDON_IoControlSetCacheRate; - m_instanceData->toAddon->io_control_set_retry = ADDON_IoControlSetRetry; - m_instanceData->toAddon->stat = ADDON_Stat; - m_instanceData->toAddon->close = ADDON_Close; - m_instanceData->toAddon->exists = ADDON_Exists; - m_instanceData->toAddon->clear_out_idle = ADDON_ClearOutIdle; - m_instanceData->toAddon->disconnect_all = ADDON_DisconnectAll; - m_instanceData->toAddon->delete_it = ADDON_Delete; - m_instanceData->toAddon->rename = ADDON_Rename; - m_instanceData->toAddon->directory_exists = ADDON_DirectoryExists; - m_instanceData->toAddon->remove_directory = ADDON_RemoveDirectory; - m_instanceData->toAddon->create_directory = ADDON_CreateDirectory; - m_instanceData->toAddon->get_directory = ADDON_GetDirectory; - m_instanceData->toAddon->free_directory = ADDON_FreeDirectory; - m_instanceData->toAddon->contains_files = ADDON_ContainsFiles; - } - - inline static VFS_FILE_HANDLE ADDON_Open(const AddonInstance_VFSEntry* instance, - const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->Open(url); - } - - inline static VFS_FILE_HANDLE ADDON_OpenForWrite(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - bool overWrite) - { - return static_cast(instance->toAddon->addonInstance) - ->OpenForWrite(url, overWrite); - } - - inline static ssize_t ADDON_Read(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - uint8_t* buffer, - size_t uiBufSize) - { - return static_cast(instance->toAddon->addonInstance) - ->Read(context, buffer, uiBufSize); - } - - inline static ssize_t ADDON_Write(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - const uint8_t* buffer, - size_t uiBufSize) - { - return static_cast(instance->toAddon->addonInstance) - ->Write(context, buffer, uiBufSize); - } - - inline static int64_t ADDON_Seek(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t position, - int whence) - { - return static_cast(instance->toAddon->addonInstance) - ->Seek(context, position, whence); - } - - inline static int ADDON_Truncate(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t size) - { - return static_cast(instance->toAddon->addonInstance)->Truncate(context, size); - } - - inline static int64_t ADDON_GetLength(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) - { - return static_cast(instance->toAddon->addonInstance)->GetLength(context); - } - - inline static int64_t ADDON_GetPosition(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) - { - return static_cast(instance->toAddon->addonInstance)->GetPosition(context); - } - - inline static int ADDON_GetChunkSize(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) - { - return static_cast(instance->toAddon->addonInstance)->GetChunkSize(context); - } - - inline static bool ADDON_IoControlGetSeekPossible(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) - { - return static_cast(instance->toAddon->addonInstance) - ->IoControlGetSeekPossible(context); - } - - inline static bool ADDON_IoControlGetCacheStatus(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - VFS_CACHE_STATUS_DATA* status) - { - kodi::vfs::CacheStatus cppStatus(status); - return static_cast(instance->toAddon->addonInstance) - ->IoControlGetCacheStatus(context, cppStatus); - } - - inline static bool ADDON_IoControlSetCacheRate(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - unsigned int rate) - { - return static_cast(instance->toAddon->addonInstance) - ->IoControlSetCacheRate(context, rate); - } - - inline static bool ADDON_IoControlSetRetry(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - bool retry) - { - return static_cast(instance->toAddon->addonInstance) - ->IoControlSetRetry(context, retry); - } - - inline static int ADDON_Stat(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - struct STAT_STRUCTURE* buffer) - { - kodi::vfs::FileStatus cppBuffer(buffer); - return static_cast(instance->toAddon->addonInstance)->Stat(url, cppBuffer); - } - - inline static bool ADDON_Close(const AddonInstance_VFSEntry* instance, VFS_FILE_HANDLE context) - { - return static_cast(instance->toAddon->addonInstance)->Close(context); - } - - inline static bool ADDON_Exists(const AddonInstance_VFSEntry* instance, const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->Exists(url); - } - - inline static void ADDON_ClearOutIdle(const AddonInstance_VFSEntry* instance) - { - return static_cast(instance->toAddon->addonInstance)->ClearOutIdle(); - } - - inline static void ADDON_DisconnectAll(const AddonInstance_VFSEntry* instance) - { - return static_cast(instance->toAddon->addonInstance)->DisconnectAll(); - } - - inline static bool ADDON_Delete(const AddonInstance_VFSEntry* instance, const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->Delete(url); - } - - inline static bool ADDON_Rename(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - const VFSURL* url2) - { - return static_cast(instance->toAddon->addonInstance)->Rename(url, url2); - } - - inline static bool ADDON_DirectoryExists(const AddonInstance_VFSEntry* instance, - const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->DirectoryExists(url); - } - - inline static bool ADDON_RemoveDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->RemoveDirectory(url); - } - - inline static bool ADDON_CreateDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url) - { - return static_cast(instance->toAddon->addonInstance)->CreateDirectory(url); - } - - inline static bool ADDON_GetDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - VFSDirEntry** retEntries, - int* num_entries, - VFSGetDirectoryCallbacks* callbacks) - { - std::vector addonEntries; - bool ret = static_cast(instance->toAddon->addonInstance) - ->GetDirectory(url, addonEntries, CVFSCallbacks(callbacks)); - if (ret) - { - VFSDirEntry* entries = - static_cast(malloc(sizeof(VFSDirEntry) * addonEntries.size())); - for (unsigned int i = 0; i < addonEntries.size(); ++i) - { - entries[i].label = strdup(addonEntries[i].Label().c_str()); - entries[i].title = strdup(addonEntries[i].Title().c_str()); - entries[i].path = strdup(addonEntries[i].Path().c_str()); - entries[i].folder = addonEntries[i].IsFolder(); - entries[i].size = addonEntries[i].Size(); - entries[i].date_time = addonEntries[i].DateTime(); - - entries[i].num_props = 0; - const std::map& props = addonEntries[i].GetProperties(); - if (!props.empty()) - { - entries[i].properties = - static_cast(malloc(sizeof(VFSProperty) * props.size())); - for (const auto& prop : props) - { - entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); - entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str()); - ++entries[i].num_props; - } - } - else - entries[i].properties = nullptr; - } - *retEntries = entries; - *num_entries = static_cast(addonEntries.size()); - } - return ret; - } - - inline static void ADDON_FreeDirectory(const AddonInstance_VFSEntry* instance, - VFSDirEntry* entries, - int num_entries) - { - for (int i = 0; i < num_entries; ++i) - { - if (entries[i].properties) - { - for (unsigned int j = 0; j < entries[i].num_props; ++j) - { - free(entries[i].properties[j].name); - free(entries[i].properties[j].val); - } - free(entries[i].properties); - } - free(entries[i].label); - free(entries[i].title); - free(entries[i].path); - } - free(entries); - } - - inline static bool ADDON_ContainsFiles(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - VFSDirEntry** retEntries, - int* num_entries, - char* rootpath) - { - std::string cppRootPath; - std::vector addonEntries; - bool ret = static_cast(instance->toAddon->addonInstance) - ->ContainsFiles(url, addonEntries, cppRootPath); - if (ret) - { - strncpy(rootpath, cppRootPath.c_str(), ADDON_STANDARD_STRING_LENGTH); - - VFSDirEntry* entries = - static_cast(malloc(sizeof(VFSDirEntry) * addonEntries.size())); - for (size_t i = 0; i < addonEntries.size(); ++i) - { - entries[i].label = strdup(addonEntries[i].Label().c_str()); - entries[i].title = strdup(addonEntries[i].Title().c_str()); - entries[i].path = strdup(addonEntries[i].Path().c_str()); - entries[i].folder = addonEntries[i].IsFolder(); - entries[i].size = addonEntries[i].Size(); - entries[i].date_time = addonEntries[i].DateTime(); - - entries[i].num_props = 0; - const std::map& props = addonEntries[i].GetProperties(); - if (!props.empty()) - { - entries[i].properties = - static_cast(malloc(sizeof(VFSProperty) * props.size())); - for (const auto& prop : props) - { - entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); - entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str()); - ++entries[i].num_props; - } - } - else - entries[i].properties = nullptr; - } - *retEntries = entries; - *num_entries = static_cast(addonEntries.size()); - } - return ret; - } - - AddonInstance_VFSEntry* m_instanceData; -}; - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h deleted file mode 100644 index 7cf58a0ca354d..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (C) 2017-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/addon-instance/video_codec.h" -#include "inputstream/DemuxPacket.h" -#include "inputstream/StreamCodec.h" -#include "inputstream/StreamCrypto.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -class CInstanceVideoCodec; - -//============================================================================== -/// @defgroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata class VideoCodecInitdata -/// @ingroup cpp_kodi_addon_videocodec_Defs -/// @brief Initialization data to open a video codec stream. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata_Help -/// -///@{ -class ATTRIBUTE_HIDDEN VideoCodecInitdata - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceVideoCodec; - /*! \endcond */ - -public: - /// @defgroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata_Help Value Help - /// @ingroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata : - /// | Name | Type | Get call - /// |------|------|---------- - /// | **Codec type** | `VIDEOCODEC_TYPE` | @ref VideoCodecInitdata::GetCodecType "GetCodecType" - /// | **Codec profile** | `STREAMCODEC_PROFILE` | @ref VideoCodecInitdata::GetCodecProfile "GetCodecProfile" - /// | **Video formats** | `std::vector` | @ref VideoCodecInitdata::GetVideoFormats "GetVideoFormats" - /// | **Width** | `uint32_t` | @ref VideoCodecInitdata::GetWidth "GetWidth" - /// | **Height** | `uint32_t` | @ref VideoCodecInitdata::GetHeight "GetHeight" - /// | **Extra data** | `const uint8_t*` | @ref VideoCodecInitdata::GetExtraData "GetExtraData" - /// | **Extra data size** | `unsigned int` | @ref VideoCodecInitdata::GetExtraDataSize "GetExtraDataSize" - /// | **Crypto session** | `kodi::addon::StreamCryptoSession` | @ref VideoCodecInitdata::GetCryptoSession "GetCryptoSession" - /// - - /// @addtogroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata - ///@{ - - /// @brief The codec type required by Kodi to process the stream. - /// - /// See @ref VIDEOCODEC_TYPE for possible values. - VIDEOCODEC_TYPE GetCodecType() const { return m_cStructure->codec; } - - /// @brief Used profiles for non-scalable 2D video - STREAMCODEC_PROFILE GetCodecProfile() const { return m_cStructure->codecProfile; } - - /// @brief The video stream representations requested by Kodi - /// - /// This contains a list of the required video formats. One of them has to - /// select the addon to return the created image. - /// - std::vector GetVideoFormats() const - { - std::vector formats; - unsigned int i = 0; - while (i < VIDEOCODEC_FORMAT_MAXFORMATS && - m_cStructure->videoFormats[i] != VIDEOCODEC_FORMAT_UNKNOWN) - formats.emplace_back(m_cStructure->videoFormats[i++]); - if (formats.empty()) - formats.emplace_back(VIDEOCODEC_FORMAT_UNKNOWN); - return formats; - } - - /// @brief Picture width. - uint32_t GetWidth() const { return m_cStructure->width; } - - /// @brief Picture height. - uint32_t GetHeight() const { return m_cStructure->height; } - - /// @brief Depending on the required decoding, additional data given by the stream. - const uint8_t* GetExtraData() const { return m_cStructure->extraData; } - - /// @brief Size of the data given with @ref extraData. - unsigned int GetExtraDataSize() const { return m_cStructure->extraDataSize; } - - /// @brief **Data to manage stream cryptography**\n - /// To get class structure manages any encryption values required in order to have - /// them available in their stream processing. - /// - /// ---------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession_Help - /// - kodi::addon::StreamCryptoSession GetCryptoSession() const { return &m_cStructure->cryptoSession; } - - ///@} - -private: - VideoCodecInitdata() = delete; - VideoCodecInitdata(const VideoCodecInitdata& session) : CStructHdl(session) {} - VideoCodecInitdata(const VIDEOCODEC_INITDATA* session) : CStructHdl(session) {} - VideoCodecInitdata(VIDEOCODEC_INITDATA* session) : CStructHdl(session) {} -}; -///@} -//------------------------------------------------------------------------------ - -//############################################################################## -/// @defgroup cpp_kodi_addon_videocodec_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_videocodec -/// @brief **Video codec add-on general variables** -/// -/// Used to exchange the available options between Kodi and addon. -/// -/// - -//============================================================================ -/// -/// @addtogroup cpp_kodi_addon_videocodec -/// @brief \cpp_class{ kodi::addon::CInstanceVideoCodec } -/// **Video codec add-on instance** -/// -/// This is an addon instance class to add an additional video decoder to Kodi -/// using addon. -/// -/// This means that either a new type of decoding can be introduced to an input -/// stream add-on that requires special types of decoding. -/// -/// When using the inputstream addon, @ref cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo -/// to @ref cpp_kodi_addon_inputstream_Defs_Info is used to declare that the -/// decoder stored in the addon is used. -/// -/// @note At the moment this can only be used together with input stream addons, -/// independent use as a codec addon is not yet possible. -/// -/// Include the header @ref VideoCodec.h "#include " -/// to use this class. -/// -/// -------------------------------------------------------------------------- -/// -/// **Example:** -/// This as an example when used together with @ref cpp_kodi_addon_inputstream "kodi::addon::CInstanceInputStream". -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// -/// class CMyVideoCodec : public kodi::addon::CInstanceVideoCodec -/// { -/// public: -/// CMyVideoCodec(KODI_HANDLE instance, CMyInputstream* inputstream); -/// ... -/// -/// private: -/// CMyInputstream* m_inputstream; -/// }; -/// -/// CMyVideoCodec::CMyVideoCodec(KODI_HANDLE instance, -/// const std::string& version, -/// CMyInputstream* inputstream) -/// : kodi::addon::CInstanceVideoCodec(instance, version), -/// m_inputstream(inputstream) -/// { -/// ... -/// } -/// ... -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyInputstream : public kodi::addon::CInstanceInputStream -/// { -/// public: -/// CMyInputstream(KODI_HANDLE instance, const std::string& kodiVersion); -/// -/// ADDON_STATUS CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// ... -/// }; -/// -/// CMyInputstream::CMyInputstream(KODI_HANDLE instance, const std::string& kodiVersion) -/// : kodi::addon::CInstanceInputStream(instance, kodiVersion) -/// { -/// ... -/// } -/// -/// ADDON_STATUS CMyInputstream::CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_VIDEOCODEC) -/// { -/// addonInstance = new CMyVideoCodec(instance, version, this); -/// return ADDON_STATUS_OK; -/// } -/// return ADDON_STATUS_NOT_IMPLEMENTED; -/// } -/// -/// ... -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() { } -/// ADDON_STATUS CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// std::string instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_INPUTSTREAM) -/// { -/// kodi::Log(ADDON_LOG_NOTICE, "Creating my Inputstream"); -/// addonInstance = new CMyInputstream(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyInputstream` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -/// -class ATTRIBUTE_HIDDEN CInstanceVideoCodec : public IAddonInstance -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Video codec class constructor used to support multiple instance - /// types - /// - /// @param[in] instance The instance value given to `kodi::addon::CAddonBase::CreateInstance(...)`, - /// or by a inputstream instance if them declared as parent. - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - explicit CInstanceVideoCodec(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_VIDEOCODEC, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_VIDEOCODEC)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with " - "single instance way is not allowed!"); - - SetAddonStruct(instance); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Destructor - /// - ~CInstanceVideoCodec() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Open the decoder, returns true on success - /// - /// Decoders not capable of running multiple instances should return false in case - /// there is already a instance open. - /// - /// @param[in] initData Video codec init data - /// @return true if successfully done - /// - /// - /// ---------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata_Help - /// - virtual bool Open(const kodi::addon::VideoCodecInitdata& initData) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Reconfigure the decoder, returns true on success - /// - /// Decoders not capable of runnung multiple instances may be capable of reconfiguring - /// the running instance. If Reconfigure returns false, player will close / open - /// the decoder - /// - /// @param[in] initData Video codec reconfigure data - /// @return true if successfully done - /// - virtual bool Reconfigure(const kodi::addon::VideoCodecInitdata& initData) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief add data, decoder has to consume the entire packet - /// - /// @param[in] packet Data to process for decode - /// @return true if the packet was consumed or if resubmitting it is useless - /// - virtual bool AddData(const DEMUX_PACKET& packet) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief GetPicture controls decoding. - /// - /// Player calls it on every cycle it can signal a picture, request a buffer, - /// or return none, if nothing applies the data is valid until the next - /// GetPicture return @ref VC_PICTURE - /// - /// @param[in,out] Structure which contains the necessary data - /// @return The with @ref VIDEOCODEC_RETVAL return values - /// - virtual VIDEOCODEC_RETVAL GetPicture(VIDEOCODEC_PICTURE& picture) { return VC_ERROR; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief should return codecs name - /// - /// @return Codec name - /// - virtual const char* GetName() { return nullptr; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Reset the decoder - /// - virtual void Reset() {} - //---------------------------------------------------------------------------- - - /*! - * @brief AddonToKodi interface - */ - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec - /// @brief All picture members can be expected to be set correctly except - /// decodedData and pts. - /// - /// GetFrameBuffer has to set decodedData to a valid memory address and return true. - /// - /// @param[out] picture The buffer, or unmodified if false is returned - /// @return In case buffer allocation fails, it return false. - /// - /// @note If this returns true, buffer must be freed using @ref ReleaseFrameBuffer(). - /// - /// @remarks Only called from addon itself - /// - bool GetFrameBuffer(VIDEOCODEC_PICTURE& picture) - { - return m_instanceData->toKodi->get_frame_buffer(m_instanceData->toKodi->kodiInstance, &picture); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// - /// @ingroup cpp_kodi_addon_videocodec - /// @brief Release the with @ref GetFrameBuffer() given framebuffer. - /// - /// @param[in] handle the on @ref VIDEOCODEC_PICTURE.videoBufferHandle defined buffer handle - /// - /// @remarks Only called from addon itself - /// - void ReleaseFrameBuffer(void* buffer) - { - return m_instanceData->toKodi->release_frame_buffer(m_instanceData->toKodi->kodiInstance, - buffer); - } - //---------------------------------------------------------------------------- - -private: - void SetAddonStruct(KODI_HANDLE instance) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation with empty addon " - "structure not allowed, table must be given from Kodi!"); - - m_instanceData = static_cast(instance); - - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->open = ADDON_Open; - m_instanceData->toAddon->reconfigure = ADDON_Reconfigure; - m_instanceData->toAddon->add_data = ADDON_AddData; - m_instanceData->toAddon->get_picture = ADDON_GetPicture; - m_instanceData->toAddon->get_name = ADDON_GetName; - m_instanceData->toAddon->reset = ADDON_Reset; - } - - inline static bool ADDON_Open(const AddonInstance_VideoCodec* instance, - VIDEOCODEC_INITDATA* initData) - { - return static_cast(instance->toAddon->addonInstance)->Open(initData); - } - - inline static bool ADDON_Reconfigure(const AddonInstance_VideoCodec* instance, - VIDEOCODEC_INITDATA* initData) - { - return static_cast(instance->toAddon->addonInstance) - ->Reconfigure(initData); - } - - inline static bool ADDON_AddData(const AddonInstance_VideoCodec* instance, - const DEMUX_PACKET* packet) - { - return static_cast(instance->toAddon->addonInstance)->AddData(*packet); - } - - inline static VIDEOCODEC_RETVAL ADDON_GetPicture(const AddonInstance_VideoCodec* instance, - VIDEOCODEC_PICTURE* picture) - { - return static_cast(instance->toAddon->addonInstance) - ->GetPicture(*picture); - } - - inline static const char* ADDON_GetName(const AddonInstance_VideoCodec* instance) - { - return static_cast(instance->toAddon->addonInstance)->GetName(); - } - - inline static void ADDON_Reset(const AddonInstance_VideoCodec* instance) - { - return static_cast(instance->toAddon->addonInstance)->Reset(); - } - - AddonInstance_VideoCodec* m_instanceData; -}; - -} // namespace addon -} // namespace kodi - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h deleted file mode 100644 index 1dddea2561a5e..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h +++ /dev/null @@ -1,992 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/addon-instance/visualization.h" -#include "../gui/renderHelper.h" - -#ifdef __cplusplus -namespace kodi -{ -namespace addon -{ - - -//============================================================================== -/// @defgroup cpp_kodi_addon_visualization_Defs_VisualizationTrack class VisualizationTrack -/// @ingroup cpp_kodi_addon_visualization_Defs -/// @brief **Info tag data structure**\n -/// Representation of available information of processed audio file. -/// -/// This is used to store all the necessary data of audio stream and to have on -/// e.g. GUI for information. -/// -/// Called from @ref kodi::addon::CInstanceVisualization::UpdateTrack() with the -/// information of the currently-playing song. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help -/// -///@{ -class VisualizationTrack -{ - /*! \cond PRIVATE */ - friend class CInstanceVisualization; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - VisualizationTrack() = default; - VisualizationTrack(const VisualizationTrack& tag) - { - *this = tag; - } - - VisualizationTrack& operator=(const VisualizationTrack& right) - { - if (&right == this) - return *this; - - m_title = right.m_title; - m_artist = right.m_artist; - m_album = right.m_album; - m_albumArtist = right.m_albumArtist; - m_genre = right.m_genre; - m_comment = right.m_comment; - m_lyrics = right.m_lyrics; - - m_trackNumber = right.m_trackNumber; - m_discNumber = right.m_discNumber; - m_duration = right.m_duration; - m_year = right.m_year; - m_rating = right.m_rating; - return *this; - } - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help Value Help - /// @ingroup cpp_kodi_addon_visualization_Defs_VisualizationTrack - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_visualization_Defs_VisualizationTrack : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Title of the current song.** | `std::string` | @ref VisualizationTrack::SetTitle "SetTitle" | @ref VisualizationTrack::GetTitle "GetTitle" - /// | **Artist names, as a single string** | `std::string` | @ref VisualizationTrack::SetArtist "SetArtist" | @ref VisualizationTrack::GetArtist "GetArtist" - /// | **Album that the current song is from.** | `std::string` | @ref VisualizationTrack::SetAlbum "SetAlbum" | @ref VisualizationTrack::GetAlbum "GetAlbum" - /// | **Album artist names, as a single string** | `std::string` | @ref VisualizationTrack::SetAlbumArtist "SetAlbumArtist" | @ref VisualizationTrack::GetAlbumArtist "GetAlbumArtist" - /// | **The genre name from the music tag, if present** | `std::string` | @ref VisualizationTrack::SetGenre "SetGenre" | @ref VisualizationTrack::GetGenre "GetGenre" - /// | **Duration of the current song, in seconds** | `int` | @ref VisualizationTrack::SetDuration "SetDuration" | @ref VisualizationTrack::GetDuration "GetDuration" - /// | **Track number of the current song** | `int` | @ref VisualizationTrack::SetTrack "SetTrack" | @ref VisualizationTrack::GetTrack "GetTrack" - /// | **Disc number of the current song stored in the ID tag info** | `int` | @ref VisualizationTrack::SetDisc "SetDisc" | @ref VisualizationTrack::GetDisc "GetDisc" - /// | **Year that the current song was released** | `int` | @ref VisualizationTrack::SetYear "SetYear" | @ref VisualizationTrack::GetYear "GetYear" - /// | **Lyrics of the current song, if available** | `std::string` | @ref VisualizationTrack::SetLyrics "SetLyrics" | @ref VisualizationTrack::GetLyrics "GetLyrics" - /// | **The user-defined rating of the current song** | `int` | @ref VisualizationTrack::SetRating "SetRating" | @ref VisualizationTrack::GetRating "GetRating" - /// | **Comment of the current song stored in the ID tag info** | `std::string` | @ref VisualizationTrack::SetComment "SetComment" | @ref VisualizationTrack::GetComment "GetComment" - /// - - /// @addtogroup cpp_kodi_addon_visualization_Defs_VisualizationTrack - ///@{ - - /// @brief Set title of the current song. - void SetTitle(const std::string& title) { m_title = title; } - - /// @brief Get title of the current song. - const std::string& GetTitle() const { return m_title; } - - /// @brief Set artist names, as a single string- - void SetArtist(const std::string& artist) { m_artist = artist; } - - /// @brief Get artist names, as a single string- - const std::string& GetArtist() const { return m_artist; } - - /// @brief Set Album that the current song is from. - void SetAlbum(const std::string& album) { m_album = album; } - - /// @brief Get Album that the current song is from. - const std::string& GetAlbum() const { return m_album; } - - /// @brief Set album artist names, as a single stringalbum artist name - void SetAlbumArtist(const std::string& albumArtist) { m_albumArtist = albumArtist; } - - /// @brief Get album artist names, as a single string- - const std::string& GetAlbumArtist() const { return m_albumArtist; } - - /// @brief Set genre name from music as string if present. - void SetGenre(const std::string& genre) { m_genre = genre; } - - /// @brief Get genre name from music as string if present. - const std::string& GetGenre() const { return m_genre; } - - /// @brief Set the duration of music as integer from info. - void SetDuration(int duration) { m_duration = duration; } - - /// @brief Get the duration of music as integer from info. - int GetDuration() const { return m_duration; } - - /// @brief Set track number (if present) from music info as integer. - void SetTrack(int trackNumber) { m_trackNumber = trackNumber; } - - /// @brief Get track number (if present). - int GetTrack() const { return m_trackNumber; } - - /// @brief Set disk number (if present) from music info as integer. - void SetDisc(int discNumber) { m_discNumber = discNumber; } - - /// @brief Get disk number (if present) - int GetDisc() const { return m_discNumber; } - - /// @brief Set year that the current song was released. - void SetYear(int year) { m_year = year; } - - /// @brief Get year that the current song was released. - int GetYear() const { return m_year; } - - /// @brief Set string from lyrics. - void SetLyrics(const std::string& lyrics) { m_lyrics = lyrics; } - - /// @brief Get string from lyrics. - const std::string& GetLyrics() const { return m_lyrics; } - - /// @brief Set the user-defined rating of the current song. - void SetRating(int rating) { m_rating = rating; } - - /// @brief Get the user-defined rating of the current song. - int GetRating() const { return m_rating; } - - /// @brief Set additional information comment (if present). - void SetComment(const std::string& comment) { m_comment = comment; } - - /// @brief Get additional information comment (if present). - const std::string& GetComment() const { return m_comment; } - - ///@} - -private: - VisualizationTrack(const VIS_TRACK* tag) - { - if (!tag) - return; - - m_title = tag->title ? tag->title : ""; - m_artist = tag->artist ? tag->artist : ""; - m_album = tag->album ? tag->album : ""; - m_albumArtist = tag->albumArtist ? tag->albumArtist : ""; - m_genre = tag->genre ? tag->genre : ""; - m_comment = tag->comment ? tag->comment : ""; - m_lyrics = tag->lyrics ? tag->lyrics : ""; - - m_trackNumber = tag->trackNumber; - m_discNumber = tag->discNumber; - m_duration = tag->duration; - m_year = tag->year; - m_rating = tag->rating; - } - - std::string m_title; - std::string m_artist; - std::string m_album; - std::string m_albumArtist; - std::string m_genre; - std::string m_comment; - std::string m_lyrics; - - int m_trackNumber = 0; - int m_discNumber = 0; - int m_duration = 0; - int m_year = 0; - int m_rating = 0; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_visualization_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_addon_visualization -/// @brief **Visualization add-on instance definition values**\n -/// All visualization functions associated data structures. -/// -/// Used to exchange the available options between Kodi and addon. -/// - -//============================================================================== -/// @addtogroup cpp_kodi_addon_visualization -/// @brief \cpp_class{ kodi::addon::CInstanceVisualization } -/// **Visualization add-on instance**\n -/// [Music visualization](https://en.wikipedia.org/wiki/Music_visualization), -/// or music visualisation, is a feature in Kodi that generates animated -/// imagery based on a piece of music. The imagery is usually generated and -/// rendered in real time synchronized to the music. -/// -/// Visualization techniques range from simple ones (e.g., a simulation of an -/// oscilloscope display) to elaborate ones, which often include a plurality -/// of composited effects. The changes in the music's loudness and frequency -/// spectrum are among the properties used as input to the visualization. -/// -/// Include the header @ref Visualization.h "#include " -/// to use this class. -/// -/// This interface allows the creation of visualizations for Kodi, based upon -/// **DirectX** or/and **OpenGL** rendering with `C++` code. -/// -/// Additionally, there are several @ref cpp_kodi_addon_visualization_CB "other functions" -/// available in which the child class can ask about the current hardware, -/// including the device, display and several other parts. -/// -/// ---------------------------------------------------------------------------- -/// -/// **Here's an example on addon.xml:** -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// @ADDON_DEPENDS@ -/// -/// -/// My visualization addon addon -/// My visualization addon description -/// @PLATFORM@ -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// Description to visualization related addon.xml values: -/// | Name | Description -/// |:------------------------------|---------------------------------------- -/// | `point` | Addon type specification
At all addon types and for this kind always "xbmc.player.musicviz". -/// | `library_@PLATFORM@` | Sets the used library name, which is automatically set by cmake at addon build. -/// -/// -------------------------------------------------------------------------- -/// -/// **Here is an example of the minimum required code to start a visualization:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class CMyVisualization : public kodi::addon::CAddonBase, -/// public kodi::addon::CInstanceVisualization -/// { -/// public: -/// CMyVisualization(); -/// -/// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; -/// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; -/// void Render() override; -/// }; -/// -/// CMyVisualization::CMyVisualization() -/// { -/// ... -/// } -/// -/// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) -/// { -/// ... -/// return true; -/// } -/// -/// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) -/// { -/// ... -/// } -/// -/// void CMyVisualization::Render() -/// { -/// ... -/// } -/// -/// ADDONCREATOR(CMyVisualization) -/// ~~~~~~~~~~~~~ -/// -/// -/// -------------------------------------------------------------------------- -/// -/// -/// **Here is another example where the visualization is used together with -/// other instance types:** -/// -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class CMyVisualization : public kodi::addon::CInstanceVisualization -/// { -/// public: -/// CMyVisualization(KODI_HANDLE instance, const std::string& version); -/// -/// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; -/// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; -/// void Render() override; -/// }; -/// -/// CMyVisualization::CMyVisualization(KODI_HANDLE instance, const std::string& version) -/// : kodi::addon::CInstanceAudioDecoder(instance, version) -/// { -/// ... -/// } -/// -/// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) -/// { -/// ... -/// return true; -/// } -/// -/// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) -/// { -/// ... -/// } -/// -/// void CMyVisualization::Render() -/// { -/// ... -/// } -/// -/// -/// //---------------------------------------------------------------------- -/// -/// class CMyAddon : public kodi::addon::CAddonBase -/// { -/// public: -/// CMyAddon() { } -/// ADDON_STATUS CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) override; -/// }; -/// -/// // If you use only one instance in your add-on, can be instanceType and -/// // instanceID ignored -/// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, -/// const std::string& instanceID, -/// KODI_HANDLE instance, -/// const std::string& version, -/// KODI_HANDLE& addonInstance) -/// { -/// if (instanceType == ADDON_INSTANCE_VISUALIZATION) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Creating my visualization"); -/// addonInstance = new CMyVisualization(instance, version); -/// return ADDON_STATUS_OK; -/// } -/// else if (...) -/// { -/// ... -/// } -/// return ADDON_STATUS_UNKNOWN; -/// } -/// -/// ADDONCREATOR(CMyAddon) -/// ~~~~~~~~~~~~~ -/// -/// The destruction of the example class `CMyVisualization` is called from -/// Kodi's header. Manually deleting the add-on instance is not required. -/// -class ATTRIBUTE_HIDDEN CInstanceVisualization : public IAddonInstance -{ -public: - //============================================================================ - /// - /// @ingroup cpp_kodi_addon_visualization - /// @brief Visualization class constructor - /// - /// Used by an add-on that only supports visualizations. - /// - CInstanceVisualization() - : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error( - "kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on."); - - SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); - CAddonBase::m_interface->globalSingleInstance = this; - } - //---------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_addon_visualization - /// @brief Visualization class constructor used to support multiple instance - /// types. - /// - /// @param[in] instance The instance value given to - /// `kodi::addon::CAddonBase::CreateInstance(...)`. - /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to - /// allow compatibility to older Kodi versions. - /// - /// @note Recommended to set `kodiVersion`. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Here's example about the use of this:** - /// ~~~~~~~~~~~~~{.cpp} - /// class CMyVisualization : public kodi::addon::CInstanceAudioDecoder - /// { - /// public: - /// CMyVisualization(KODI_HANDLE instance, const std::string& kodiVersion) - /// : kodi::addon::CInstanceAudioDecoder(instance, kodiVersion) - /// { - /// ... - /// } - /// - /// ... - /// }; - /// - /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, - /// const std::string& instanceID, - /// KODI_HANDLE instance, - /// const std::string& version, - /// KODI_HANDLE& addonInstance) - /// { - /// kodi::Log(ADDON_LOG_INFO, "Creating my visualization"); - /// addonInstance = new CMyVisualization(instance, version); - /// return ADDON_STATUS_OK; - /// } - /// ~~~~~~~~~~~~~ - /// - explicit CInstanceVisualization(KODI_HANDLE instance, const std::string& kodiVersion = "") - : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, - !kodiVersion.empty() ? kodiVersion - : GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) - { - if (CAddonBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Destructor. - /// - ~CInstanceVisualization() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to notify the visualization that a new song has been started. - /// - /// @param[in] channels Number of channels in the stream - /// @param[in] samplesPerSec Samples per second of stream - /// @param[in] bitsPerSample Number of bits in one sample - /// @param[in] songName The name of the currently-playing song - /// @return true if start successful done - /// - virtual bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) - { - return true; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to inform the visualization that the rendering control was - /// stopped. - /// - virtual void Stop() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Pass audio data to the visualization. - /// - /// @param[in] audioData The raw audio data - /// @param[in] audioDataLength Length of the audioData array - /// @param[in] freqData The [FFT](https://en.wikipedia.org/wiki/Fast_Fourier_transform) - /// of the audio data - /// @param[in] freqDataLength Length of frequency data array - /// - /// Values **freqData** and **freqDataLength** are used if GetInfo() returns - /// true for the `wantsFreq` parameter. Otherwise, **freqData** is set to - /// `nullptr` and **freqDataLength** is `0`. - /// - virtual void AudioData(const float* audioData, - int audioDataLength, - float* freqData, - int freqDataLength) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to inform Kodi that the rendered region is dirty and need an - /// update. - /// - /// @return True if dirty - /// - virtual bool IsDirty() { return true; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to indicate when the add-on should render. - /// - virtual void Render() {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to get the number of buffers from the current visualization. - /// - /// @param[out] wantsFreq Indicates whether the add-on wants FFT data. If set - /// to true, the **freqData** and **freqDataLength** - /// parameters of @ref AudioData() are used - /// @param[out] syncDelay The number of buffers to delay before calling - /// @ref AudioData() - /// - /// @note If this function is not implemented, it will default to - /// `wantsFreq` = false and `syncDelay` = 0. - /// - virtual void GetInfo(bool& wantsFreq, int& syncDelay) - { - wantsFreq = false; - syncDelay = 0; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to get a list of visualization presets the user can select. - /// from - /// - /// @param[out] presets The vector list containing the names of presets that - /// the user can select - /// @return Return true if successful, or false if there are no presets to - /// choose from - /// - virtual bool GetPresets(std::vector& presets) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Get the index of the current preset. - /// - /// @return Index number of the current preset - /// - virtual int GetActivePreset() { return -1; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Check if the add-on is locked to the current preset. - /// - /// @return True if locked to the current preset - /// - virtual bool IsLocked() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Load the previous visualization preset. - /// - /// @return Return true if the previous preset was loaded - /// - virtual bool PrevPreset() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Load the next visualization preset. - /// - /// @return Return true if the next preset was loaded - /// - virtual bool NextPreset() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Load a visualization preset. - /// - /// This function is called after a new preset is selected. - /// - /// @param[in] select Preset index to use - /// @return Return true if the preset is loaded - /// - virtual bool LoadPreset(int select) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Switch to a new random preset. - /// - /// @return Return true if a random preset was loaded - /// - virtual bool RandomPreset() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Lock the current visualization preset, preventing it from changing. - /// - /// @param[in] lockUnlock If set to true, the preset should be locked - /// @return Return true if the current preset is locked - /// - virtual bool LockPreset(bool lockUnlock) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Used to increase/decrease the visualization preset rating. - /// - /// @param[in] plusMinus If set to true the rating is increased, otherwise - /// decreased - /// @return Return true if the rating is modified - /// - virtual bool RatePreset(bool plusMinus) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Inform the visualization of the current album art image. - /// - /// @param[in] albumart Path to the current album art image - /// @return Return true if the image is used - /// - virtual bool UpdateAlbumart(std::string albumart) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization - /// @brief Inform the visualization of the current track's tag information. - /// - /// @param[in] track Visualization track information structure - /// @return Return true if the track information is used - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help - /// - ///------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// - /// #include - /// - /// class CMyVisualization : public kodi::addon::CInstanceVisualization - /// { - /// public: - /// CMyVisualization(KODI_HANDLE instance, const std::string& version); - /// - /// ... - /// - /// private: - /// kodi::addon::VisualizationTrack m_runningTrack; - /// }; - /// - /// bool CMyVisualization::UpdateTrack(const kodi::addon::VisualizationTrack& track) - /// { - /// m_runningTrack = track; - /// return true; - /// } - /// - /// ~~~~~~~~~~~~~ - /// - virtual bool UpdateTrack(const kodi::addon::VisualizationTrack& track) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_visualization_CB Information functions - /// @ingroup cpp_kodi_addon_visualization - /// @brief **To get info about the device, display and several other parts**\n - /// These are functions to query any values or to transfer them to Kodi. - /// - ///@{ - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief To transfer available presets on addon. - /// - /// Used if @ref GetPresets not possible to use, e.g. where available presets - /// are only known during @ref Start call. - /// - /// @param[in] presets List to store available presets. - /// - /// @note The function should only be called once, if possible - /// - inline void TransferPresets(const std::vector& presets) - { - m_instanceData->toKodi->clear_presets(m_instanceData->toKodi->kodiInstance); - for (const auto& it : presets) - m_instanceData->toKodi->transfer_preset(m_instanceData->toKodi->kodiInstance, it.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Device that represents the display adapter. - /// - /// @return A pointer to the used device with @ref cpp_kodi_Defs_HardwareContext "HardwareContext" - /// - /// @note This is only available on **DirectX**, It us unused (`nullptr`) on - /// **OpenGL** - /// - ///------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// .. - /// // Note: Device() there is used inside addon child class about - /// // kodi::addon::CInstanceVisualization - /// ID3D11DeviceContext1* context = static_cast(kodi::addon::CInstanceVisualization::Device()); - /// .. - /// ~~~~~~~~~~~~~ - /// - inline kodi::HardwareContext Device() { return m_instanceData->props->device; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Returns the X position of the rendering window. - /// - /// @return The X position, in pixels - /// - inline int X() { return m_instanceData->props->x; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Returns the Y position of the rendering window. - /// - /// @return The Y position, in pixels - /// - inline int Y() { return m_instanceData->props->y; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Returns the width of the rendering window. - /// - /// @return The width, in pixels - /// - inline int Width() { return m_instanceData->props->width; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Returns the height of the rendering window. - /// - /// @return The height, in pixels - /// - inline int Height() { return m_instanceData->props->height; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Pixel aspect ratio (often abbreviated PAR) is a ratio that - /// describes how the width of a pixel compares to the height of that pixel. - /// - /// @return The pixel aspect ratio used by the display - /// - inline float PixelRatio() { return m_instanceData->props->pixelRatio; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Used to get the name of the add-on defined in `addon.xml`. - /// - /// @return The add-on name - /// - inline std::string Name() { return m_instanceData->props->name; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Used to get the full path where the add-on is installed. - /// - /// @return The add-on installation path - /// - inline std::string Presets() { return m_instanceData->props->presets; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_visualization_CB - /// @brief Used to get the full path to the add-on's user profile. - /// - /// @note The trailing folder (consisting of the add-on's ID) is not created - /// by default. If it is needed, you must call kodi::vfs::CreateDirectory() - /// to create the folder. - /// - /// @return Path to the user profile - /// - inline std::string Profile() { return m_instanceData->props->profile; } - //---------------------------------------------------------------------------- - - ///@} - -private: - void SetAddonStruct(KODI_HANDLE instance) - { - if (instance == nullptr) - throw std::logic_error("kodi::addon::CInstanceVisualization: Null pointer instance passed."); - - m_instanceData = static_cast(instance); - m_instanceData->toAddon->addonInstance = this; - m_instanceData->toAddon->start = ADDON_Start; - m_instanceData->toAddon->stop = ADDON_Stop; - m_instanceData->toAddon->audio_data = ADDON_AudioData; - m_instanceData->toAddon->is_dirty = ADDON_IsDirty; - m_instanceData->toAddon->render = ADDON_Render; - m_instanceData->toAddon->get_info = ADDON_GetInfo; - m_instanceData->toAddon->prev_preset = ADDON_PrevPreset; - m_instanceData->toAddon->next_preset = ADDON_NextPreset; - m_instanceData->toAddon->load_preset = ADDON_LoadPreset; - m_instanceData->toAddon->random_preset = ADDON_RandomPreset; - m_instanceData->toAddon->lock_preset = ADDON_LockPreset; - m_instanceData->toAddon->rate_preset = ADDON_RatePreset; - m_instanceData->toAddon->update_albumart = ADDON_UpdateAlbumart; - m_instanceData->toAddon->update_track = ADDON_UpdateTrack; - m_instanceData->toAddon->get_presets = ADDON_GetPresets; - m_instanceData->toAddon->get_active_preset = ADDON_GetActivePreset; - m_instanceData->toAddon->is_locked = ADDON_IsLocked; - } - - inline static bool ADDON_Start(const AddonInstance_Visualization* addon, - int channels, - int samplesPerSec, - int bitsPerSample, - const char* songName) - { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); - thisClass->m_renderHelper = kodi::gui::GetRenderHelper(); - return thisClass->Start(channels, samplesPerSec, bitsPerSample, songName); - } - - inline static void ADDON_Stop(const AddonInstance_Visualization* addon) - { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); - thisClass->Stop(); - thisClass->m_renderHelper = nullptr; - } - - inline static void ADDON_AudioData(const AddonInstance_Visualization* addon, - const float* audioData, - int audioDataLength, - float* freqData, - int freqDataLength) - { - static_cast(addon->toAddon->addonInstance) - ->AudioData(audioData, audioDataLength, freqData, freqDataLength); - } - - inline static bool ADDON_IsDirty(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->IsDirty(); - } - - inline static void ADDON_Render(const AddonInstance_Visualization* addon) - { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); - if (!thisClass->m_renderHelper) - return; - thisClass->m_renderHelper->Begin(); - thisClass->Render(); - thisClass->m_renderHelper->End(); - } - - inline static void ADDON_GetInfo(const AddonInstance_Visualization* addon, VIS_INFO* info) - { - static_cast(addon->toAddon->addonInstance) - ->GetInfo(info->bWantsFreq, info->iSyncDelay); - } - - inline static unsigned int ADDON_GetPresets(const AddonInstance_Visualization* addon) - { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); - std::vector presets; - if (thisClass->GetPresets(presets)) - { - for (const auto& it : presets) - thisClass->m_instanceData->toKodi->transfer_preset(addon->toKodi->kodiInstance, it.c_str()); - } - - return static_cast(presets.size()); - } - - inline static int ADDON_GetActivePreset(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->GetActivePreset(); - } - - inline static bool ADDON_PrevPreset(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->PrevPreset(); - } - - inline static bool ADDON_NextPreset(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->NextPreset(); - } - - inline static bool ADDON_LoadPreset(const AddonInstance_Visualization* addon, int select) - - { - return static_cast(addon->toAddon->addonInstance)->LoadPreset(select); - } - - inline static bool ADDON_RandomPreset(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->RandomPreset(); - } - - inline static bool ADDON_LockPreset(const AddonInstance_Visualization* addon) - { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); - thisClass->m_presetLockedByUser = !thisClass->m_presetLockedByUser; - return thisClass->LockPreset(thisClass->m_presetLockedByUser); - } - - inline static bool ADDON_RatePreset(const AddonInstance_Visualization* addon, bool plus_minus) - { - return static_cast(addon->toAddon->addonInstance) - ->RatePreset(plus_minus); - } - - inline static bool ADDON_IsLocked(const AddonInstance_Visualization* addon) - { - return static_cast(addon->toAddon->addonInstance)->IsLocked(); - } - - inline static bool ADDON_UpdateAlbumart(const AddonInstance_Visualization* addon, - const char* albumart) - { - return static_cast(addon->toAddon->addonInstance) - ->UpdateAlbumart(albumart); - } - - inline static bool ADDON_UpdateTrack(const AddonInstance_Visualization* addon, - const VIS_TRACK* track) - { - VisualizationTrack cppTrack(track); - return static_cast(addon->toAddon->addonInstance) - ->UpdateTrack(cppTrack); - } - - std::shared_ptr m_renderHelper; - bool m_presetLockedByUser = false; - AddonInstance_Visualization* m_instanceData; -}; - -} /* namespace addon */ -} /* namespace kodi */ -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/CMakeLists.txt deleted file mode 100644 index a551b4b523b6f..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set(HEADERS DemuxPacket.h - StreamCodec.h - StreamConstants.h - TimingConstants.h) - -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_inputstream) -endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/DemuxPacket.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/DemuxPacket.h deleted file mode 100644 index f965b9f64149f..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/DemuxPacket.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "TimingConstants.h" -#include "../../c-api/addon-instance/inputstream/demux_packet.h" diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCodec.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCodec.h deleted file mode 100644 index e80e2ca43b6ce..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCodec.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/addon-instance/inputstream/stream_codec.h" diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamConstants.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamConstants.h deleted file mode 100644 index 200631b6f96f5..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamConstants.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/addon-instance/inputstream/stream_constants.h" diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h deleted file mode 100644 index 8a851216a1d49..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/addon-instance/inputstream/stream_crypto.h" -#include "../../AddonBase.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -class CInstanceInputStream; -class InputstreamInfo; -class VideoCodecInitdata; - -//============================================================================== -/// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption_StreamCryptoSession class StreamCryptoSession -/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamEncryption -/// @brief **Data to manage stream cryptography**\n -/// This class structure manages any encryption values required in order to have -/// them available in their stream processing. -/// -/// Used on inputstream by @ref kodi::addon::InputstreamInfo::SetCryptoSession / -/// @ref kodi::addon::InputstreamInfo::GetCryptoSession and are given to the -/// used video codec to decrypt related data. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession_Help -/// -///@{ -class ATTRIBUTE_HIDDEN StreamCryptoSession - : public CStructHdl -{ - /*! \cond PRIVATE */ - friend class CInstanceInputStream; - friend class InputstreamInfo; - friend class VideoCodecInitdata; - /*! \endcond */ - -public: - /*! \cond PRIVATE */ - StreamCryptoSession() { memset(m_cStructure, 0, sizeof(STREAM_CRYPTO_SESSION)); } - StreamCryptoSession(const StreamCryptoSession& session) : CStructHdl(session) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession_Help Value Help - /// @ingroup cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Keysystem for encrypted media** | @ref STREAM_CRYPTO_KEY_SYSTEM | @ref StreamCryptoSession::SetKeySystem "SetKeySystem" | @ref StreamCryptoSession::GetKeySystem "GetKeySystem" - /// | **Flags for special conditions** | `uint8_t` | @ref StreamCryptoSession::SetFlags "SetFlags" | @ref StreamCryptoSession::GetFlags "GetFlags" - /// | **Crypto session key id** | `std::string` | @ref StreamCryptoSession::SetSessionId "SetSessionId" | @ref StreamCryptoSession::GetSessionId "GetSessionId" - - /// @brief To set keysystem for encrypted media, @ref STREAM_CRYPTO_KEY_SYSTEM_NONE for - /// unencrypted media. - /// - /// See @ref STREAM_CRYPTO_KEY_SYSTEM for available options. - void SetKeySystem(STREAM_CRYPTO_KEY_SYSTEM keySystem) { m_cStructure->keySystem = keySystem; } - - /// @brief Get keysystem for encrypted media. - STREAM_CRYPTO_KEY_SYSTEM GetKeySystem() const { return m_cStructure->keySystem; } - - /// @brief Set bit flags to use special conditions, see @ref STREAM_CRYPTO_FLAGS - /// for available flags. - void SetFlags(uint8_t flags) { m_cStructure->flags = flags; } - - /// @brief Get flags for special conditions. - uint8_t GetFlags() const { return m_cStructure->flags; } - - /// @brief To set the crypto session key identifier. - void SetSessionId(const std::string& sessionId) - { - strncpy(m_cStructure->sessionId, sessionId.c_str(), sizeof(m_cStructure->sessionId) - 1); - } - - /// @brief To get the crypto session key identifier. - std::string GetSessionId() const { return m_cStructure->sessionId; } - -private: - StreamCryptoSession(const STREAM_CRYPTO_SESSION* session) : CStructHdl(session) {} - StreamCryptoSession(STREAM_CRYPTO_SESSION* session) : CStructHdl(session) {} -}; - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/TimingConstants.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/TimingConstants.h deleted file mode 100644 index 22f8952577716..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/TimingConstants.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/addon-instance/inputstream/timing_constants.h" - -#ifdef __cplusplus - -// Unset the on timing_constants.h given defines -#undef STREAM_TIME_TO_MSEC -#undef STREAM_SEC_TO_TIME -#undef STREAM_MSEC_TO_TIME - -/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants -/// @brief Converts a stream time to milliseconds as an integer value. -/// -/// @param[in] x Stream time -/// @return Milliseconds -/// -/// @note Within "C" code this is used as `#define`. -/// -constexpr int STREAM_TIME_TO_MSEC(double x) -{ - return static_cast(x * 1000 / STREAM_TIME_BASE); -} - -/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants -/// @brief Converts a time in seconds to the used stream time format. -/// -/// @param[in] x Seconds -/// @return Stream time -/// -/// @note Within "C" code this is used as `#define`. -/// -constexpr double STREAM_SEC_TO_TIME(double x) -{ - return x * STREAM_TIME_BASE; -} - -/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants -/// @brief Converts a time in milliseconds to the used stream time format. -/// -/// @param[in] x Milliseconds -/// @return Stream time -/// -/// @note Within "C" code this is used as `#define`. -/// -constexpr double STREAM_MSEC_TO_TIME(double x) -{ - return x * STREAM_TIME_BASE / 1000; -} - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt index d6fba6965a2c1..135358e7df92c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt @@ -1,5 +1,10 @@ -set(HEADERS PeripheralUtils.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_peripheral) +set(HEADERS + PeripheralUtils.h +) + +if(HEADERS) + core_add_devkit_header(kodi_addon-instance_peripheral) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h index 1a6cc6323e5a4..c04408b932563 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h @@ -99,11 +99,11 @@ class PeripheralVector } } - static void FreeStructs(unsigned int structCount, THE_STRUCT* structs) + static void FreeStructs(THE_STRUCT* structs, size_t structCount) { if (structs) { - for (unsigned int i = 0; i < structCount; i++) + for (size_t i = 0; i < structCount; i++) THE_CLASS::FreeStruct(structs[i]); } PERIPHERAL_SAFE_DELETE_ARRAY(structs); diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt deleted file mode 100644 index 3443b1edc8130..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(HEADERS ChannelGroups.h - Channels.h - EDL.h - EPG.h - General.h - MenuHook.h - Recordings.h - Stream.h - Timers.h) - -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_pvr) -endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h deleted file mode 100644 index 17995bb2e3967..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 3 - PVR channel group -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup class PVRChannelGroup -/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup -/// @brief **PVR add-on channel group**\n -/// To define a group for channels, this becomes be asked from -/// @ref kodi::addon::CInstancePVRClient::GetChannelGroups() and used on -/// @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers() to get his -/// content with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember "PVRChannelGroupMember". -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help -/// -///@{ -class PVRChannelGroup : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRChannelGroup() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP)); } - PVRChannelGroup(const PVRChannelGroup& channel) : CStructHdl(channel) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Group name** | `std::string` | @ref PVRChannelGroup::SetGroupName "SetGroupName" | @ref PVRChannelGroup::GetGroupName "GetGroupName" | *required to set* - /// | **Is radio** | `bool` | @ref PVRChannelGroup::SetIsRadio "SetIsRadio" | @ref PVRChannelGroup::GetIsRadio "GetIsRadio" | *required to set* - /// | **Position** | `unsigned int` | @ref PVRChannelGroup::SetPosition "SetPosition" | @ref PVRChannelGroup::GetPosition "GetPosition" | *optional* - /// - - /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup - ///@{ - - /// @brief **required**\n - /// Name of this channel group. - void SetGroupName(const std::string& groupName) - { - strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1); - } - - /// @brief To get with @ref SetGroupName changed values. - std::string GetGroupName() const { return m_cStructure->strGroupName; } - - /// @brief **required**\n - /// **true** If this is a radio channel group, **false** otherwise. - void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; } - - /// @brief To get with @ref SetIsRadio changed values. - bool GetIsRadio() const { return m_cStructure->bIsRadio; } - - /// @brief **optional**\n - /// Sort position of the group (`0` indicates that the backend doesn't - /// support sorting of groups). - void SetPosition(unsigned int position) { m_cStructure->iPosition = position; } - - /// @brief To get with @ref SetPosition changed values. - unsigned int GetPosition() const { return m_cStructure->iPosition; } - - ///@} - -private: - PVRChannelGroup(const PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {} - PVRChannelGroup(PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet class PVRChannelGroupsResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup -/// @brief **PVR add-on channel group member transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups(). -/// -///@{ -class PVRChannelGroupsResultSet -{ -public: - /*! \cond PRIVATE */ - PVRChannelGroupsResultSet() = delete; - PVRChannelGroupsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - - /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVRChannelGroup& tag) - { - m_instance->toKodi->TransferChannelGroup(m_instance->toKodi->kodiInstance, m_handle, tag); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember class PVRChannelGroupMember -/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup -/// @brief **PVR add-on channel group member**\n -/// To define the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups() -/// given groups. -/// -/// This content becomes then requested with @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help -/// -///@{ -class PVRChannelGroupMember : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRChannelGroupMember() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); } - PVRChannelGroupMember(const PVRChannelGroupMember& channel) : CStructHdl(channel) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember : - /// | Name | Type | Set call | Get call | Usage - /// |-------|-------|-----------|----------|----------- - /// | **Group name** | `std::string` | @ref PVRChannelGroupMember::SetGroupName "SetGroupName" | @ref PVRChannelGroupMember::GetGroupName "GetGroupName" | *required to set* - /// | **Channel unique id** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelUniqueId "SetChannelUniqueId" | @ref PVRChannelGroupMember::GetChannelUniqueId "GetChannelUniqueId" | *required to set* - /// | **Channel Number** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelNumber "SetChannelNumber" | @ref PVRChannelGroupMember::GetChannelNumber "GetChannelNumber" | *optional* - /// | **Sub channel number** | `unsigned int` | @ref PVRChannelGroupMember::SetSubChannelNumber "SetSubChannelNumber"| @ref PVRChannelGroupMember::GetSubChannelNumber "GetSubChannelNumber" | *optional* - /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember - ///@{ - - /// @brief **required**\n - /// Name of the channel group to add the channel to. - void SetGroupName(const std::string& groupName) - { - strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1); - } - - /// @brief To get with @ref SetGroupName changed values. - std::string GetGroupName() const { return m_cStructure->strGroupName; } - - /// @brief **required**\n - /// Unique id of the member. - void SetChannelUniqueId(unsigned int channelUniqueId) - { - m_cStructure->iChannelUniqueId = channelUniqueId; - } - - /// @brief To get with @ref SetChannelUniqueId changed values. - unsigned int GetChannelUniqueId() const { return m_cStructure->iChannelUniqueId; } - - /// @brief **optional**\n - /// Channel number within the group. - void SetChannelNumber(unsigned int channelNumber) - { - m_cStructure->iChannelNumber = channelNumber; - } - - /// @brief To get with @ref SetChannelNumber changed values. - unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; } - - /// @brief **optional**\n - /// Sub channel number within the group (ATSC). - void SetSubChannelNumber(unsigned int subChannelNumber) - { - m_cStructure->iSubChannelNumber = subChannelNumber; - } - - /// @brief To get with @ref SetSubChannelNumber changed values. - unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; } - - /// @brief **optional**\n - /// The value denoting the order of this channel in the 'All channels' group. - void SetOrder(bool order) { m_cStructure->iOrder = order; } - - /// @brief To get with @ref SetOrder changed values. - bool GetOrder() const { return m_cStructure->iOrder; } - - ///@} - -private: - PVRChannelGroupMember(const PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {} - PVRChannelGroupMember(PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet class PVRChannelGroupMembersResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember -/// @brief **PVR add-on channel group member transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers(). -/// -///@{ -class PVRChannelGroupMembersResultSet -{ -public: - /*! \cond PRIVATE */ - PVRChannelGroupMembersResultSet() = delete; - PVRChannelGroupMembersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVRChannelGroupMember& tag) - { - m_instance->toKodi->TransferChannelGroupMember(m_instance->toKodi->kodiInstance, m_handle, tag); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h deleted file mode 100644 index 466c23874d9e3..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 2 - PVR channel -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel class PVRChannel -/// @ingroup cpp_kodi_addon_pvr_Defs_Channel -/// @brief **Channel data structure**\n -/// Representation of a TV or radio channel. -/// -/// This is used to store all the necessary TV or radio channel data and can -/// either provide the necessary data from / to Kodi for the associated -/// functions or can also be used in the addon to store its data. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help -/// -///@{ -class PVRChannel : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRChannel() - { - memset(m_cStructure, 0, sizeof(PVR_CHANNEL)); - m_cStructure->iClientProviderUid = PVR_PROVIDER_INVALID_UID; - } - PVRChannel(const PVRChannel& channel) : CStructHdl(channel) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Unique id** | `unsigned int` | @ref PVRChannel::SetUniqueId "SetUniqueId" | @ref PVRChannel::GetUniqueId "GetUniqueId" | *required to set* - /// | **Is radio** | `bool` | @ref PVRChannel::SetIsRadio "SetIsRadio" | @ref PVRChannel::GetIsRadio "GetIsRadio" | *required to set* - /// | **Channel number** | `unsigned int` | @ref PVRChannel::SetChannelNumber "SetChannelNumber" | @ref PVRChannel::GetChannelNumber "GetChannelNumber" | *optional* - /// | **Sub channel number** | `unsigned int` | @ref PVRChannel::SetSubChannelNumber "SetSubChannelNumber" | @ref PVRChannel::GetSubChannelNumber "GetSubChannelNumber" | *optional* - /// | **Channel name** | `std::string` | @ref PVRChannel::SetChannelName "SetChannelName" | @ref PVRChannel::GetChannelName "GetChannelName" | *optional* - /// | **Mime type** | `std::string` | @ref PVRChannel::SetMimeType "SetMimeType" | @ref PVRChannel::GetMimeType "GetMimeType" | *optional* - /// | **Encryption system** | `unsigned int` | @ref PVRChannel::SetEncryptionSystem "SetEncryptionSystem" | @ref PVRChannel::GetEncryptionSystem "GetEncryptionSystem" | *optional* - /// | **Icon path** | `std::string` | @ref PVRChannel::SetIconPath "SetIconPath" | @ref PVRChannel::GetIconPath "GetIconPath" | *optional* - /// | **Is hidden** | `bool` | @ref PVRChannel::SetIsHidden "SetIsHidden" | @ref PVRChannel::GetIsHidden "GetIsHidden" | *optional* - /// | **Has archive** | `bool` | @ref PVRChannel::SetHasArchive "SetHasArchive" | @ref PVRChannel::GetHasArchive "GetHasArchive" | *optional* - /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional* - /// | **Client provider unique identifier** | `int` | @ref PVRChannel::SetClientProviderUid "SetClientProviderUid" | @ref PVRTimer::GetClientProviderUid "GetClientProviderUid" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel - ///@{ - - /// @brief **required**\n - /// Unique identifier for this channel. - void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; } - - /// @brief To get with @ref SetUniqueId changed values. - unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; } - - /// @brief **required**\n - /// **true** if this is a radio channel, **false** if it's a TV channel. - void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; } - - /// @brief To get with @ref SetIsRadio changed values. - bool GetIsRadio() const { return m_cStructure->bIsRadio; } - - /// @brief **optional**\n - /// Channel number of this channel on the backend. - void SetChannelNumber(unsigned int channelNumber) - { - m_cStructure->iChannelNumber = channelNumber; - } - - /// @brief To get with @ref SetChannelNumber changed values. - unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; } - - /// @brief **optional**\n - /// Sub channel number of this channel on the backend (ATSC). - void SetSubChannelNumber(unsigned int subChannelNumber) - { - m_cStructure->iSubChannelNumber = subChannelNumber; - } - - /// @brief To get with @ref SetSubChannelNumber changed values. - unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; } - - /// @brief **optional**\n - /// Channel name given to this channel. - void SetChannelName(const std::string& channelName) - { - strncpy(m_cStructure->strChannelName, channelName.c_str(), - sizeof(m_cStructure->strChannelName) - 1); - } - - /// @brief To get with @ref SetChannelName changed values. - std::string GetChannelName() const { return m_cStructure->strChannelName; } - - /// @brief **optional**\n - /// Input format mime type. - /// - /// Available types can be found in https://www.iana.org/assignments/media-types/media-types.xhtml - /// on "application" and "video" or leave empty if unknown. - /// - void SetMimeType(const std::string& inputFormat) - { - strncpy(m_cStructure->strMimeType, inputFormat.c_str(), sizeof(m_cStructure->strMimeType) - 1); - } - - /// @brief To get with @ref SetMimeType changed values. - std::string GetMimeType() const { return m_cStructure->strMimeType; } - - /// @brief **optional**\n - /// The encryption ID or CaID of this channel (Conditional access systems). - /// - /// Lists about available ID's: - /// - http://www.dvb.org/index.php?id=174 - /// - http://en.wikipedia.org/wiki/Conditional_access_system - /// - void SetEncryptionSystem(unsigned int encryptionSystem) - { - m_cStructure->iEncryptionSystem = encryptionSystem; - } - - /// @brief To get with @ref SetEncryptionSystem changed values. - unsigned int GetEncryptionSystem() const { return m_cStructure->iEncryptionSystem; } - - /// @brief **optional**\n - /// Path to the channel icon (if present). - void SetIconPath(const std::string& iconPath) - { - strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1); - } - - /// @brief To get with @ref SetIconPath changed values. - std::string GetIconPath() const { return m_cStructure->strIconPath; } - - /// @brief **optional**\n - /// **true** if this channel is marked as hidden. - void SetIsHidden(bool isHidden) { m_cStructure->bIsHidden = isHidden; } - - /// @brief To get with @ref GetIsRadio changed values. - bool GetIsHidden() const { return m_cStructure->bIsHidden; } - - /// @brief **optional**\n - /// **true** if this channel has a server-side back buffer. - void SetHasArchive(bool hasArchive) { m_cStructure->bHasArchive = hasArchive; } - - /// @brief To get with @ref GetIsRadio changed values. - bool GetHasArchive() const { return m_cStructure->bHasArchive; } - - /// @brief **optional**\n - /// The value denoting the order of this channel in the 'All channels' group. - void SetOrder(bool order) { m_cStructure->iOrder = order; } - - /// @brief To get with @ref SetOrder changed values. - bool GetOrder() const { return m_cStructure->iOrder; } - ///@} - - /// @brief **optional**\n - /// Unique identifier of the provider this channel belongs to. - /// - /// @ref PVR_PROVIDER_INVALID_UID denotes that provider uid is not available. - void SetClientProviderUid(int iClientProviderUid) - { - m_cStructure->iClientProviderUid = iClientProviderUid; - } - - /// @brief To get with @ref SetClientProviderUid changed values - int GetClientProviderUid() const { return m_cStructure->iClientProviderUid; } - -private: - PVRChannel(const PVR_CHANNEL* channel) : CStructHdl(channel) {} - PVRChannel(PVR_CHANNEL* channel) : CStructHdl(channel) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet class PVRChannelsResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel -/// @brief **PVR add-on channel transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannels(). -/// -///@{ -class PVRChannelsResultSet -{ -public: - /*! \cond PRIVATE */ - PVRChannelsResultSet() = delete; - PVRChannelsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVRChannel& tag) - { - m_instance->toKodi->TransferChannelEntry(m_instance->toKodi->kodiInstance, m_handle, tag); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus class PVRSignalStatus -/// @ingroup cpp_kodi_addon_pvr_Defs_Channel -/// @brief **PVR Signal status information**\n -/// This class gives current status information from stream to Kodi. -/// -/// Used to get information for user by call of @ref kodi::addon::CInstancePVRClient::GetSignalStatus() -/// to see current quality and source. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help -/// -///@{ -class PVRSignalStatus : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRSignalStatus() = default; - PVRSignalStatus(const PVRSignalStatus& type) : CStructHdl(type) {} - /*! \endcond */ - - - /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Adapter name** | `std::string` | @ref PVRSignalStatus::SetAdapterName "SetAdapterName" | @ref PVRSignalStatus::GetAdapterName "GetAdapterName" | *optional* - /// | **Adapter status** | `std::string` | @ref PVRSignalStatus::SetAdapterStatus "SetAdapterStatus" | @ref PVRSignalStatus::GetAdapterStatus "GetAdapterStatus" | *optional* - /// | **Service name** | `std::string` | @ref PVRSignalStatus::SetServiceName "SetServiceName" | @ref PVRSignalStatus::GetServiceName "GetServiceName" | *optional* - /// | **Provider name** | `std::string` | @ref PVRSignalStatus::SetProviderName "SetProviderName" | @ref PVRSignalStatus::GetProviderName "GetProviderName" | *optional* - /// | **Mux name** | `std::string` | @ref PVRSignalStatus::SetMuxName "SetMuxName" | @ref PVRSignalStatus::GetMuxName "GetMuxName" | *optional* - /// | **Signal/noise ratio** | `int` | @ref PVRSignalStatus::SetSNR "SetSNR" | @ref PVRSignalStatus::GetSNR "GetSNR" | *optional* - /// | **Signal strength** | `int` | @ref PVRSignalStatus::SetSignal "SetSignal" | @ref PVRSignalStatus::GetSignal "GetSignal" | *optional* - /// | **Bit error rate** | `long` | @ref PVRSignalStatus::SetBER "SetBER" | @ref PVRSignalStatus::GetBER "GetBER" | *optional* - /// | **Uncorrected blocks** | `long` | @ref PVRSignalStatus::SetUNC "SetUNC" | @ref PVRSignalStatus::GetUNC "GetUNC" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus - ///@{ - - /// @brief **optional**\n - /// Name of the adapter that's being used. - void SetAdapterName(const std::string& adapterName) - { - strncpy(m_cStructure->strAdapterName, adapterName.c_str(), - sizeof(m_cStructure->strAdapterName) - 1); - } - - /// @brief To get with @ref SetAdapterName changed values. - std::string GetAdapterName() const { return m_cStructure->strAdapterName; } - - /// @brief **optional**\n - /// Status of the adapter that's being used. - void SetAdapterStatus(const std::string& adapterStatus) - { - strncpy(m_cStructure->strAdapterStatus, adapterStatus.c_str(), - sizeof(m_cStructure->strAdapterStatus) - 1); - } - - /// @brief To get with @ref SetAdapterStatus changed values. - std::string GetAdapterStatus() const { return m_cStructure->strAdapterStatus; } - - /// @brief **optional**\n - /// Name of the current service. - void SetServiceName(const std::string& serviceName) - { - strncpy(m_cStructure->strServiceName, serviceName.c_str(), - sizeof(m_cStructure->strServiceName) - 1); - } - - /// @brief To get with @ref SetServiceName changed values. - std::string GetServiceName() const { return m_cStructure->strServiceName; } - - /// @brief **optional**\n - /// Name of the current service's provider. - void SetProviderName(const std::string& providerName) - { - strncpy(m_cStructure->strProviderName, providerName.c_str(), - sizeof(m_cStructure->strProviderName) - 1); - } - - /// @brief To get with @ref SetProviderName changed values. - std::string GetProviderName() const { return m_cStructure->strProviderName; } - - /// @brief **optional**\n - /// Name of the current mux. - void SetMuxName(const std::string& muxName) - { - strncpy(m_cStructure->strMuxName, muxName.c_str(), sizeof(m_cStructure->strMuxName) - 1); - } - - /// @brief To get with @ref SetMuxName changed values. - std::string GetMuxName() const { return m_cStructure->strMuxName; } - - /// @brief **optional**\n - /// Signal/noise ratio. - /// - /// @note 100% is 0xFFFF 65535 - void SetSNR(int snr) { m_cStructure->iSNR = snr; } - - /// @brief To get with @ref SetSNR changed values. - int GetSNR() const { return m_cStructure->iSNR; } - - /// @brief **optional**\n - /// Signal strength. - /// - /// @note 100% is 0xFFFF 65535 - void SetSignal(int signal) { m_cStructure->iSignal = signal; } - - /// @brief To get with @ref SetSignal changed values. - int GetSignal() const { return m_cStructure->iSignal; } - - /// @brief **optional**\n - /// Bit error rate. - void SetBER(long ber) { m_cStructure->iBER = ber; } - - /// @brief To get with @ref SetBER changed values. - long GetBER() const { return m_cStructure->iBER; } - - /// @brief **optional**\n - /// Uncorrected blocks: - void SetUNC(long unc) { m_cStructure->iUNC = unc; } - - /// @brief To get with @ref SetBER changed values. - long GetUNC() const { return m_cStructure->iUNC; } - ///@} - -private: - PVRSignalStatus(const PVR_SIGNAL_STATUS* type) : CStructHdl(type) {} - PVRSignalStatus(PVR_SIGNAL_STATUS* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo class PVRDescrambleInfo -/// @ingroup cpp_kodi_addon_pvr_Defs_Channel -/// @brief **Data structure for descrample info**\n -/// Information data to give via this to Kodi. -/// -/// As description see also here https://en.wikipedia.org/wiki/Conditional_access. -/// -/// Used on @ref kodi::addon::CInstancePVRClient::GetDescrambleInfo(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help -/// -///@{ -class PVRDescrambleInfo : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRDescrambleInfo() - { - m_cStructure->iPid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; - m_cStructure->iCaid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; - m_cStructure->iProvid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; - m_cStructure->iEcmTime = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; - m_cStructure->iHops = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; - } - PVRDescrambleInfo(const PVRDescrambleInfo& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Packet identifier** | `int` | @ref PVRDescrambleInfo::SetPID "SetPID" | @ref PVRDescrambleInfo::GetPID "GetPID" | *optional* - /// | **Conditional access identifier** | `int` | @ref PVRDescrambleInfo::SetCAID "SetCAID" | @ref PVRDescrambleInfo::GetCAID "GetCAID" | *optional* - /// | **Provider-ID** | `int` | @ref PVRDescrambleInfo::SetProviderID "SetProviderID" | @ref PVRDescrambleInfo::GetProviderID "GetProviderID" | *optional* - /// | **ECM time** | `int` | @ref PVRDescrambleInfo::SetECMTime "SetECMTime" | @ref PVRDescrambleInfo::GetECMTime "GetECMTime" | *optional* - /// | **Hops** | `int` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional* - /// | **Descramble card system** | `std::string` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional* - /// | **Reader** | `std::string` | @ref PVRDescrambleInfo::SetReader "SetReader" | @ref PVRDescrambleInfo::GetReader "GetReader" | *optional* - /// | **From** | `std::string` | @ref PVRDescrambleInfo::SetFrom "SetFrom" | @ref PVRDescrambleInfo::GetFrom "GetFrom" | *optional* - /// | **Protocol** | `std::string` | @ref PVRDescrambleInfo::SetProtocol "SetProtocol" | @ref PVRDescrambleInfo::GetProtocol "GetProtocol" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo - ///@{ - - /// @brief **optional**\n - /// Packet identifier. - /// - /// Each table or elementary stream in a transport stream is identified by - /// a 13-bit packet identifier (PID). - /// - /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available - void SetPID(int pid) { m_cStructure->iPid = pid; } - - /// @brief To get with @ref SetPID changed values - int GetPID() const { return m_cStructure->iPid; } - - /// @brief **optional**\n - /// Conditional access identifier. - /// - /// Conditional access (abbreviated CA) or conditional access system (abbreviated CAS) - /// is the protection of content by requiring certain criteria to be met before granting - /// access to the content. - /// - /// Available CA system ID's listed here https://www.dvbservices.com/identifiers/ca_system_id. - /// - /// @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE if not available. - void SetCAID(int iCaid) { m_cStructure->iCaid = iCaid; } - - /// @brief To get with @ref SetCAID changed values. - int GetCAID() const { return m_cStructure->iCaid; } - - /// @brief **optional**\n - /// Provider-ID. - /// - /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. - void SetProviderID(int provid) { m_cStructure->iProvid = provid; } - - /// @brief To get with @ref SetProviderID changed values - int GetProviderID() const { return m_cStructure->iProvid; } - - /// @brief **optional**\n - /// ECM time. - /// - /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. - void SetECMTime(int ecmTime) { m_cStructure->iEcmTime = ecmTime; } - - /// @brief To get with @ref SetECMTime changed values. - int GetECMTime() const { return m_cStructure->iEcmTime; } - - /// @brief **optional**\n - /// Hops. - /// - /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. - void SetHops(int hops) { m_cStructure->iHops = hops; } - - /// @brief To get with @ref SetHops changed values. - int GetHops() const { return m_cStructure->iHops; } - - /// @brief **optional**\n - /// Empty string if not available. - void SetCardSystem(const std::string& cardSystem) - { - strncpy(m_cStructure->strCardSystem, cardSystem.c_str(), - sizeof(m_cStructure->strCardSystem) - 1); - } - - /// @brief To get with @ref SetCardSystem changed values. - std::string GetCardSystem() const { return m_cStructure->strCardSystem; } - - /// @brief **optional**\n - /// Empty string if not available. - void SetReader(const std::string& reader) - { - strncpy(m_cStructure->strReader, reader.c_str(), sizeof(m_cStructure->strReader) - 1); - } - - /// @brief To get with @ref SetReader changed values. - std::string GetReader() const { return m_cStructure->strReader; } - - /// @brief **optional**\n - /// Empty string if not available. - void SetFrom(const std::string& from) - { - strncpy(m_cStructure->strFrom, from.c_str(), sizeof(m_cStructure->strFrom) - 1); - } - - /// @brief To get with @ref SetFrom changed values. - std::string GetFrom() const { return m_cStructure->strFrom; } - - /// @brief **optional**\n - /// Empty string if not available. - void SetProtocol(const std::string& protocol) - { - strncpy(m_cStructure->strProtocol, protocol.c_str(), sizeof(m_cStructure->strProtocol) - 1); - } - - /// @brief To get with @ref SetProtocol changed values. - std::string GetProtocol() const { return m_cStructure->strProtocol; } - ///@} - -private: - PVRDescrambleInfo(const PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {} - PVRDescrambleInfo(PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h deleted file mode 100644 index 34c7c413bf93e..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr/pvr_edl.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 8 - PVR Edit definition list (EDL) -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry class PVREDLEntry -/// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry -/// @brief **Edit definition list (EDL) entry**\n -/// Time places and type of related fields. -/// -/// This used within @ref cpp_kodi_addon_pvr_EPGTag "EPG" and -/// @ref cpp_kodi_addon_pvr_Recordings "recordings". -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help -/// -///@{ -class PVREDLEntry : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVREDLEntry() { memset(m_cStructure, 0, sizeof(PVR_EDL_ENTRY)); } - PVREDLEntry(const PVREDLEntry& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Start time** | `int64_t` | @ref PVREDLEntry::SetStart "SetStart" | @ref PVREDLEntry::GetStart "GetStart" | *required to set* - /// | **End time** | `int64_t` | @ref PVREDLEntry::SetEnd "SetEnd" | @ref PVREDLEntry::GetEnd "GetEnd" | *required to set* - /// | **Type** | @ref PVR_EDL_TYPE | @ref PVREDLEntry::SetType "SetType" | @ref PVREDLEntry::GetType "GetType" | *required to set* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry - ///@{ - - /// @brief Start time in milliseconds. - void SetStart(int64_t start) { m_cStructure->start = start; } - - /// @brief To get with @ref SetStart() changed values. - int64_t GetStart() const { return m_cStructure->start; } - - /// @brief End time in milliseconds. - void SetEnd(int64_t end) { m_cStructure->end = end; } - - /// @brief To get with @ref SetEnd() changed values. - int64_t GetEnd() const { return m_cStructure->end; } - - /// @brief The with @ref PVR_EDL_TYPE used definition list type. - void SetType(PVR_EDL_TYPE type) { m_cStructure->type = type; } - - /// @brief To get with @ref SetType() changed values. - PVR_EDL_TYPE GetType() const { return m_cStructure->type; } - ///@} - -private: - PVREDLEntry(const PVR_EDL_ENTRY* type) : CStructHdl(type) {} - PVREDLEntry(PVR_EDL_ENTRY* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h deleted file mode 100644 index 1a98b92d15f09..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 4 - PVR EPG -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag class PVREPGTag -/// @ingroup cpp_kodi_addon_pvr_Defs_epg -/// @brief **PVR add-on EPG data tag**\n -/// Representation of an EPG event. -/// -/// Herewith all EPG related data are saved in one class whereby the data can -/// be exchanged with Kodi, or can also be used on the addon to save there. -/// -/// See @ref cpp_kodi_addon_pvr_EPGTag "EPG methods" about usage. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help -/// -///@{ -class PVREPGTag : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVREPGTag() - { - memset(m_cStructure, 0, sizeof(EPG_TAG)); - m_cStructure->iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE; - m_cStructure->iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE; - m_cStructure->iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE; - } - PVREPGTag(const PVREPGTag& epg) : CStructHdl(epg) - { - m_title = epg.m_title; - m_plotOutline = epg.m_plotOutline; - m_plot = epg.m_plot; - m_originalTitle = epg.m_originalTitle; - m_cast = epg.m_cast; - m_director = epg.m_director; - m_writer = epg.m_writer; - m_IMDBNumber = epg.m_IMDBNumber; - m_iconPath = epg.m_iconPath; - m_genreDescription = epg.m_genreDescription; - m_parentalRatingCode = epg.m_parentalRatingCode; - m_episodeName = epg.m_episodeName; - m_seriesLink = epg.m_seriesLink; - m_firstAired = epg.m_firstAired; - } - /*! \endcond */ - - - /// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|--------- - /// | **Unique broadcast id** | `unsigned int` | @ref PVREPGTag::SetUniqueBroadcastId "SetUniqueBroadcastId" | @ref PVREPGTag::GetUniqueBroadcastId "GetUniqueBroadcastId" | *required to set* - /// | **Unique channel id** | `unsigned int` | @ref PVREPGTag::SetUniqueChannelId "SetUniqueChannelId" | @ref PVREPGTag::GetUniqueChannelId "GetUniqueChannelId" | *required to set* - /// | **Title** | `std::string` | @ref PVREPGTag::SetTitle "SetTitle" | @ref PVREPGTag::GetTitle "GetTitle" | *required to set* - /// | **Start time** | `time_t` | @ref PVREPGTag::SetStartTime "SetStartTime" | @ref PVREPGTag::GetStartTime "GetStartTime" | *required to set* - /// | **End time** | `time_t` | @ref PVREPGTag::SetEndTime "SetEndTime" | @ref PVREPGTag::GetEndTime "GetEndTime" | *required to set* - /// | **Plot outline** | `std::string` | @ref PVREPGTag::SetPlotOutline "SetPlotOutline" | @ref PVREPGTag::GetPlotOutline "GetPlotOutline" | *optional* - /// | **Plot** | `std::string` | @ref PVREPGTag::SetPlot "SetPlot" | @ref PVREPGTag::GetPlot "GetPlot" | *optional* - /// | **Original title** | `std::string` | @ref PVREPGTag::SetOriginalTitle "SetOriginalTitle" | @ref PVREPGTag::GetOriginalTitle "GetOriginalTitle" | *optional* - /// | **Cast** | `std::string` | @ref PVREPGTag::SetCast "SetCast" | @ref PVREPGTag::GetCast "GetCast" | *optional* - /// | **Director** | `std::string` | @ref PVREPGTag::SetDirector "SetDirector" | @ref PVREPGTag::GetDirector "GetDirector" | *optional* - /// | **Writer** | `std::string` | @ref PVREPGTag::SetWriter "SetWriter" | @ref PVREPGTag::GetWriter "GetWriter" | *optional* - /// | **Year** | `int` | @ref PVREPGTag::SetYear "SetYear" | @ref PVREPGTag::GetYear "GetYear" | *optional* - /// | **IMDB number** | `std::string` | @ref PVREPGTag::SetIMDBNumber "SetIMDBNumber" | @ref PVREPGTag::GetIMDBNumber "GetIMDBNumber" | *optional* - /// | **Icon path** | `std::string` | @ref PVREPGTag::SetIconPath "SetIconPath" | @ref PVREPGTag::GetIconPath "GetIconPath" | *optional* - /// | **Genre type** | `int` | @ref PVREPGTag::SetGenreType "SetGenreType" | @ref PVREPGTag::GetGenreType "GetGenreType" | *optional* - /// | **Genre sub type** | `int` | @ref PVREPGTag::SetGenreSubType "SetGenreSubType" | @ref PVREPGTag::GetGenreSubType "GetGenreSubType" | *optional* - /// | **Genre description** | `std::string` | @ref PVREPGTag::SetGenreDescription "SetGenreDescription" | @ref PVREPGTag::GetGenreDescription "GetGenreDescription" | *optional* - /// | **First aired** | `time_t` | @ref PVREPGTag::SetFirstAired "SetFirstAired" | @ref PVREPGTag::GetFirstAired "GetFirstAired" | *optional* - /// | **Parental rating** | `int` | @ref PVREPGTag::SetParentalRating "SetParentalRating" | @ref PVREPGTag::GetParentalRating "GetParentalRating" | *optional* - /// | **Parental rating code** | `int` | @ref PVREPGTag::SetParentalRatingCode "SetParentalRatingCode" | @ref PVREPGTag::GetParentalRatingCode "GetParentalRatingCode" | *optional* - /// | **Star rating** | `int` | @ref PVREPGTag::SetStarRating "SetStarRating" | @ref PVREPGTag::GetStarRating "GetStarRating" | *optional* - /// | **Series number** | `int` | @ref PVREPGTag::SetSeriesNumber "SetSeriesNumber" | @ref PVREPGTag::GetSeriesNumber "GetSeriesNumber" | *optional* - /// | **Episode number** | `int` | @ref PVREPGTag::SetEpisodeNumber "SetEpisodeNumber" | @ref PVREPGTag::GetEpisodeNumber "GetEpisodeNumber" | *optional* - /// | **Episode part number** | `int` | @ref PVREPGTag::SetEpisodePartNumber "SetEpisodePartNumber" | @ref PVREPGTag::GetEpisodePartNumber "GetEpisodePartNumber" | *optional* - /// | **Episode name** | `std::string` | @ref PVREPGTag::SetEpisodeName "SetEpisodeName" | @ref PVREPGTag::GetEpisodeName "GetEpisodeName" | *optional* - /// | **Flags** | `unsigned int` | @ref PVREPGTag::SetFlags "SetFlags" | @ref PVREPGTag::GetFlags "GetFlags" | *optional* - /// | **Series link** | `std::string` | @ref PVREPGTag::SetSeriesLink "SetSeriesLink" | @ref PVREPGTag::GetSeriesLink "GetSeriesLink" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag - ///@{ - - /// @brief **required**\n - /// Identifier for this event. Event uids must be unique for a channel. Valid uids must be greater than @ref EPG_TAG_INVALID_UID. - void SetUniqueBroadcastId(unsigned int uniqueBroadcastId) - { - m_cStructure->iUniqueBroadcastId = uniqueBroadcastId; - } - - /// @brief To get with @ref SetUniqueBroadcastId changed values. - unsigned int GetUniqueBroadcastId() const { return m_cStructure->iUniqueBroadcastId; } - - /// @brief **required**\n - /// Unique identifier of the channel this event belongs to. - void SetUniqueChannelId(unsigned int uniqueChannelId) - { - m_cStructure->iUniqueChannelId = uniqueChannelId; - } - - /// @brief To get with @ref SetUniqueChannelId changed values - unsigned int GetUniqueChannelId() const { return m_cStructure->iUniqueChannelId; } - - /// @brief **required**\n - /// This event's title. - void SetTitle(const std::string& title) { m_title = title; } - - /// @brief To get with @ref SetTitle changed values. - std::string GetTitle() const { return m_title; } - - /// @brief **required**\n - /// Start time in UTC. - /// - /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. - void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } - - /// @brief To get with @ref SetStartTime changed values. - time_t GetStartTime() const { return m_cStructure->startTime; } - - /// @brief **required**\n - /// End time in UTC. - /// - /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. - void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; } - - /// @brief To get with @ref SetEndTime changed values. - time_t GetEndTime() const { return m_cStructure->endTime; } - - /// @brief **optional**\n - /// Plot outline name. - void SetPlotOutline(const std::string& plotOutline) { m_plotOutline = plotOutline; } - - /// @brief To get with @ref SetPlotOutline changed values. - std::string GetPlotOutline() const { return m_plotOutline; } - - /// @brief **optional**\n - /// Plot name. - void SetPlot(const std::string& plot) { m_plot = plot; } - - /// @brief To get with @ref GetPlot changed values. - std::string GetPlot() const { return m_plot; } - - /// @brief **optional**\n - /// Original title. - void SetOriginalTitle(const std::string& originalTitle) { m_originalTitle = originalTitle; } - - /// @brief To get with @ref SetOriginalTitle changed values - std::string GetOriginalTitle() const { return m_originalTitle; } - - /// @brief **optional**\n - /// Cast name(s). - /// - /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. - void SetCast(const std::string& cast) { m_cast = cast; } - - /// @brief To get with @ref SetCast changed values - std::string GetCast() const { return m_cast; } - - /// @brief **optional**\n - /// Director name(s). - /// - /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. - void SetDirector(const std::string& director) { m_director = director; } - - /// @brief To get with @ref SetDirector changed values. - std::string GetDirector() const { return m_director; } - - /// @brief **optional**\n - /// Writer name(s). - /// - /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. - void SetWriter(const std::string& writer) { m_writer = writer; } - - /// @brief To get with @ref SetDirector changed values - std::string GetWriter() const { return m_writer; } - - /// @brief **optional**\n - /// Year. - void SetYear(int year) { m_cStructure->iYear = year; } - - /// @brief To get with @ref SetYear changed values. - int GetYear() const { return m_cStructure->iYear; } - - /// @brief **optional**\n - /// [IMDB](https://en.wikipedia.org/wiki/IMDb) identification number. - void SetIMDBNumber(const std::string& IMDBNumber) { m_IMDBNumber = IMDBNumber; } - - /// @brief To get with @ref SetIMDBNumber changed values. - std::string GetIMDBNumber() const { return m_IMDBNumber; } - - /// @brief **optional**\n - /// Icon path. - void SetIconPath(const std::string& iconPath) { m_iconPath = iconPath; } - - /// @brief To get with @ref SetIconPath changed values. - std::string GetIconPath() const { return m_iconPath; } - - /// @brief **optional**\n - /// Genre type. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails EPG_EVENT_CONTENTMASK - /// - /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription. - /// - /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) - /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here - /// with backend value. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example 1:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVREPGTag tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); - /// ~~~~~~~~~~~~~ - /// - /// -------------------------------------------------------------------------- - /// - /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types): - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVREPGTag tag; - /// tag.SetGenreType(EPG_GENRE_USE_STRING); - /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language. - /// ~~~~~~~~~~~~~ - /// - void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } - - /// @brief To get with @ref SetGenreType changed values - int GetGenreType() const { return m_cStructure->iGenreType; } - - /// @brief **optional**\n - /// Genre sub type. - /// - /// @copydetails EPG_EVENT_CONTENTMASK - /// - /// Subtypes groups related to set by @ref SetGenreType: - /// | Main genre type | List with available sub genre types - /// |-----------------|----------------------------------------- - /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 - /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA - /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS - /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW - /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS - /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH - /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE - /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE - /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS - /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE - /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES - /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL - /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you - /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given. - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVREPGTag tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); - /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); - /// ~~~~~~~~~~~~~ - /// - void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } - - /// @brief To get with @ref SetGenreSubType changed values. - int GetGenreSubType() const { return m_cStructure->iGenreSubType; } - - /// @brief **optional**\n genre. Will be used only when genreType == @ref EPG_GENRE_USE_STRING - /// or genreSubType == @ref EPG_GENRE_USE_STRING. - /// - /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres. - /// - /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) - /// conform genre types or something special. - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVREPGTag tag; - /// tag.SetGenreType(EPG_GENRE_USE_STRING); - /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller"); - /// ~~~~~~~~~~~~~ - /// - void SetGenreDescription(const std::string& genreDescription) - { - m_genreDescription = genreDescription; - } - - /// @brief To get with @ref SetGenreDescription changed values. - std::string GetGenreDescription() const { return m_genreDescription; } - - /// @brief **optional**\n - /// First aired in UTC. - void SetFirstAired(const std::string& firstAired) { m_firstAired = firstAired; } - - /// @brief To get with @ref SetFirstAired changed values. - std::string GetFirstAired() const { return m_firstAired; } - - /// @brief **optional**\n - /// Parental rating. - void SetParentalRating(int parentalRating) { m_cStructure->iParentalRating = parentalRating; } - - /// @brief To get with @ref SetParentalRatinge changed values. - int GetParentalRating() const { return m_cStructure->iParentalRating; } - - /// @brief **required**\n - /// This event's parental rating code. - void SetParentalRatingCode(const std::string& parentalRatingCode) - { - m_parentalRatingCode = parentalRatingCode; - } - - /// @brief To get with @ref SetParentalRatingCode changed values. - std::string GetParentalRatingCode() const { return m_parentalRatingCode; } - - /// @brief **optional**\n - /// Star rating. - void SetStarRating(int starRating) { m_cStructure->iStarRating = starRating; } - - /// @brief To get with @ref SetStarRating changed values. - int GetStarRating() const { return m_cStructure->iStarRating; } - - /// @brief **optional**\n - /// Series number. - void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; } - - /// @brief To get with @ref SetSeriesNumber changed values. - int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; } - - /// @brief **optional**\n - /// Episode number. - void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; } - - /// @brief To get with @ref SetEpisodeNumber changed values. - int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; } - - /// @brief **optional**\n - /// Episode part number. - void SetEpisodePartNumber(int episodePartNumber) - { - m_cStructure->iEpisodePartNumber = episodePartNumber; - } - - /// @brief To get with @ref SetEpisodePartNumber changed values. - int GetEpisodePartNumber() const { return m_cStructure->iEpisodePartNumber; } - - /// @brief **optional**\n - /// Episode name. - void SetEpisodeName(const std::string& episodeName) { m_episodeName = episodeName; } - - /// @brief To get with @ref SetEpisodeName changed values. - std::string GetEpisodeName() const { return m_episodeName; } - - /// @brief **optional**\n - /// Bit field of independent flags associated with the EPG entry. - /// - /// See @ref cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG for available bit flags. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG - /// - void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; } - - /// @brief To get with @ref SetFlags changed values. - unsigned int GetFlags() const { return m_cStructure->iFlags; } - - /// @brief **optional**\n - /// Series link for this event. - void SetSeriesLink(const std::string& seriesLink) { m_seriesLink = seriesLink; } - - /// @brief To get with @ref SetSeriesLink changed values. - std::string GetSeriesLink() const { return m_seriesLink; } - - ///@} - - // Internal used, as this have own memory for strings and to translate them to "C" - EPG_TAG* GetTag() const - { - m_cStructure->strTitle = m_title.c_str(); - m_cStructure->strPlotOutline = m_plotOutline.c_str(); - m_cStructure->strPlot = m_plot.c_str(); - m_cStructure->strOriginalTitle = m_originalTitle.c_str(); - m_cStructure->strCast = m_cast.c_str(); - m_cStructure->strDirector = m_director.c_str(); - m_cStructure->strWriter = m_writer.c_str(); - m_cStructure->strIMDBNumber = m_IMDBNumber.c_str(); - m_cStructure->strIconPath = m_iconPath.c_str(); - m_cStructure->strGenreDescription = m_genreDescription.c_str(); - m_cStructure->strParentalRatingCode = m_parentalRatingCode.c_str(); - m_cStructure->strEpisodeName = m_episodeName.c_str(); - m_cStructure->strSeriesLink = m_seriesLink.c_str(); - m_cStructure->strFirstAired = m_firstAired.c_str(); - - return m_cStructure; - } - -private: - PVREPGTag(const EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); } - PVREPGTag(EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); } - - const PVREPGTag& operator=(const PVREPGTag& right); - const PVREPGTag& operator=(const EPG_TAG& right); - operator EPG_TAG*(); - - std::string m_title; - std::string m_plotOutline; - std::string m_plot; - std::string m_originalTitle; - std::string m_cast; - std::string m_director; - std::string m_writer; - std::string m_IMDBNumber; - std::string m_episodeName; - std::string m_iconPath; - std::string m_seriesLink; - std::string m_genreDescription; - std::string m_parentalRatingCode; - std::string m_firstAired; - - void SetData(const EPG_TAG* tag) - { - m_title = tag->strTitle == nullptr ? "" : tag->strTitle; - m_plotOutline = tag->strPlotOutline == nullptr ? "" : tag->strPlotOutline; - m_plot = tag->strPlot == nullptr ? "" : tag->strPlot; - m_originalTitle = tag->strOriginalTitle == nullptr ? "" : tag->strOriginalTitle; - m_cast = tag->strCast == nullptr ? "" : tag->strCast; - m_director = tag->strDirector == nullptr ? "" : tag->strDirector; - m_writer = tag->strWriter == nullptr ? "" : tag->strWriter; - m_IMDBNumber = tag->strIMDBNumber == nullptr ? "" : tag->strIMDBNumber; - m_iconPath = tag->strIconPath == nullptr ? "" : tag->strIconPath; - m_genreDescription = tag->strGenreDescription == nullptr ? "" : tag->strGenreDescription; - m_parentalRatingCode = tag->strParentalRatingCode == nullptr ? "" : tag->strParentalRatingCode; - m_episodeName = tag->strEpisodeName == nullptr ? "" : tag->strEpisodeName; - m_seriesLink = tag->strSeriesLink == nullptr ? "" : tag->strSeriesLink; - m_firstAired = tag->strFirstAired == nullptr ? "" : tag->strFirstAired; - } -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet class PVREPGTagsResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag -/// @brief **PVR add-on EPG entry transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetEPGForChannel(). -/// -/// @note This becomes only be used on addon call above, not usable outside on -/// addon itself. -///@{ -class PVREPGTagsResultSet -{ -public: - /*! \cond PRIVATE */ - PVREPGTagsResultSet() = delete; - PVREPGTagsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVREPGTag& tag) - { - m_instance->toKodi->TransferEpgEntry(m_instance->toKodi->kodiInstance, m_handle, tag.GetTag()); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h deleted file mode 100644 index 758feedd903b1..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr/pvr_general.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 1 - General PVR -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue class PVRTypeIntValue -/// @ingroup cpp_kodi_addon_pvr_Defs_General -/// @brief **PVR add-on type value**\n -/// Representation of a `` event related value. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help -/// -///@{ -class PVRTypeIntValue : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRTypeIntValue(const PVRTypeIntValue& data) : CStructHdl(data) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Value** | `int` | @ref PVRTypeIntValue::SetValue "SetValue" | @ref PVRTypeIntValue::GetValue "GetValue" - /// | **Description** | `std::string` | @ref PVRTypeIntValue::SetDescription "SetDescription" | @ref PVRTypeIntValue::GetDescription "GetDescription" - /// - /// @remark Further can there be used his class constructor to set values. - - /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue - ///@{ - - /// @brief Default class constructor. - /// - /// @note Values must be set afterwards. - PVRTypeIntValue() = default; - - /// @brief Class constructor with integrated value set. - /// - /// @param[in] value Type identification value - /// @param[in] description Type description text - PVRTypeIntValue(int value, const std::string& description) - { - SetValue(value); - SetDescription(description); - } - - /// @brief To set with the identification value. - void SetValue(int value) { m_cStructure->iValue = value; } - - /// @brief To get with the identification value. - int GetValue() const { return m_cStructure->iValue; } - - /// @brief To set with the description text of the value. - void SetDescription(const std::string& description) - { - strncpy(m_cStructure->strDescription, description.c_str(), - sizeof(m_cStructure->strDescription) - 1); - } - - /// @brief To get with the description text of the value. - std::string GetDescription() const { return m_cStructure->strDescription; } - ///@} - -private: - PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {} - PVRTypeIntValue(PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities class PVRCapabilities -/// @ingroup cpp_kodi_addon_pvr_Defs_General -/// @brief **PVR add-on capabilities**\n -/// This class is needed to tell Kodi which options are supported on the addon. -/// -/// If a capability is set to **true**, then the corresponding methods from -/// @ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient" need to be -/// implemented. -/// -/// As default them all set to **false**. -/// -/// Used on @ref kodi::addon::CInstancePVRClient::GetCapabilities(). -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help -/// -///@{ -class PVRCapabilities -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - explicit PVRCapabilities() = delete; - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_PVRCapabilities - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Supports EPG** | `boolean` | @ref PVRCapabilities::SetSupportsEPG "SetSupportsEPG" | @ref PVRCapabilities::GetSupportsEPG "GetSupportsEPG" - /// | **Supports EPG EDL** | `boolean` | @ref PVRCapabilities::SetSupportsEPGEdl "SetSupportsEPGEdl" | @ref PVRCapabilities::GetSupportsEPGEdl "GetSupportsEPGEdl" - /// | **Supports TV** | `boolean` | @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" | @ref PVRCapabilities::GetSupportsTV "GetSupportsTV" - /// | **Supports radio** | `boolean` | @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" | @ref PVRCapabilities::GetSupportsRadio "GetSupportsRadio" - /// | **Supports recordings** | `boolean` | @ref PVRCapabilities::SetSupportsRecordings "SetSupportsRecordings" | @ref PVRCapabilities::GetSupportsRecordings "GetSupportsRecordings" - /// | **Supports recordings undelete** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" | @ref PVRCapabilities::GetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" - /// | **Supports timers** | `boolean` | @ref PVRCapabilities::SetSupportsTimers "SetSupportsTimers" | @ref PVRCapabilities::GetSupportsTimers "GetSupportsTimers" - /// | **Supports providers** | `boolean` | @ref PVRCapabilities::SetSupportsProviders "SetSupportsProviders" | @ref PVRCapabilities::GetSupportsProviders "GetSupportsProviders" - /// | **Supports channel groups** | `boolean` | @ref PVRCapabilities::SetSupportsChannelGroups "SetSupportsChannelGroups" | @ref PVRCapabilities::GetSupportsChannelGroups "GetSupportsChannelGroups" - /// | **Supports channel scan** | `boolean` | @ref PVRCapabilities::SetSupportsChannelScan "SetSupportsChannelScan" | @ref PVRCapabilities::GetSupportsChannelScan "GetSupportsChannelScan" - /// | **Supports channel settings** | `boolean` | @ref PVRCapabilities::SetSupportsChannelSettings "SetSupportsChannelSettings" | @ref PVRCapabilities::GetSupportsChannelSettings "GetSupportsChannelSettings" - /// | **Handles input stream** | `boolean` | @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" | @ref PVRCapabilities::GetHandlesInputStream "GetHandlesInputStream" - /// | **Handles demuxing** | `boolean` | @ref PVRCapabilities::SetHandlesDemuxing "SetHandlesDemuxing" | @ref PVRCapabilities::GetHandlesDemuxing "GetHandlesDemuxing" - /// | **Supports recording play count** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingPlayCount "SetSupportsRecordingPlayCount" | @ref PVRCapabilities::GetSupportsRecordingPlayCount "GetSupportsRecordingPlayCount" - /// | **Supports last played position** | `boolean` | @ref PVRCapabilities::SetSupportsLastPlayedPosition "SetSupportsLastPlayedPosition" | @ref PVRCapabilities::GetSupportsLastPlayedPosition "GetSupportsLastPlayedPosition" - /// | **Supports recording EDL** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingEdl "SetSupportsRecordingEdl" | @ref PVRCapabilities::GetSupportsRecordingEdl "GetSupportsRecordingEdl" - /// | **Supports recordings rename** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsRename "SetSupportsRecordingsRename" | @ref PVRCapabilities::GetSupportsRecordingsRename "GetSupportsRecordingsRename" - /// | **Supports recordings lifetime change** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "SetSupportsRecordingsLifetimeChange" | @ref PVRCapabilities::GetSupportsRecordingsLifetimeChange "GetSupportsRecordingsLifetimeChange" - /// | **Supports descramble info** | `boolean` | @ref PVRCapabilities::SetSupportsDescrambleInfo "SetSupportsDescrambleInfo" | @ref PVRCapabilities::GetSupportsDescrambleInfo "GetSupportsDescrambleInfo" - /// | **Supports async EPG transfer** | `boolean` | @ref PVRCapabilities::SetSupportsAsyncEPGTransfer "SetSupportsAsyncEPGTransfer" | @ref PVRCapabilities::GetSupportsAsyncEPGTransfer "GetSupportsAsyncEPGTransfer" - /// | **Supports recording size** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingSize "SetSupportsRecordingSize" | @ref PVRCapabilities::GetSupportsRecordingSize "GetSupportsRecordingSize" - /// | **Supports recordings delete** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsDelete "SetSupportsRecordingsDelete" | @ref PVRCapabilities::GetSupportsRecordingsDelete "SetSupportsRecordingsDelete" - /// | **Recordings lifetime values** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRCapabilities::SetRecordingsLifetimeValues "SetRecordingsLifetimeValues" | @ref PVRCapabilities::GetRecordingsLifetimeValues "GetRecordingsLifetimeValues" - /// - /// @warning This class can not be used outside of @ref kodi::addon::CInstancePVRClient::GetCapabilities() - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRCapabilities - ///@{ - - /// @brief Set **true** if the add-on provides EPG information. - void SetSupportsEPG(bool supportsEPG) { m_capabilities->bSupportsEPG = supportsEPG; } - - /// @brief To get with @ref SetSupportsEPG changed values. - bool GetSupportsEPG() const { return m_capabilities->bSupportsEPG; } - - /// @brief Set **true** if the backend supports retrieving an edit decision - /// list for an EPG tag. - void SetSupportsEPGEdl(bool supportsEPGEdl) { m_capabilities->bSupportsEPGEdl = supportsEPGEdl; } - - /// @brief To get with @ref SetSupportsEPGEdl changed values. - bool GetSupportsEPGEdl() const { return m_capabilities->bSupportsEPGEdl; } - - /// @brief Set **true** if this add-on provides TV channels. - void SetSupportsTV(bool supportsTV) { m_capabilities->bSupportsTV = supportsTV; } - - /// @brief To get with @ref SetSupportsTV changed values. - bool GetSupportsTV() const { return m_capabilities->bSupportsTV; } - - /// @brief Set **true** if this add-on provides TV channels. - void SetSupportsRadio(bool supportsRadio) { m_capabilities->bSupportsRadio = supportsRadio; } - - /// @brief To get with @ref SetSupportsRadio changed values. - bool GetSupportsRadio() const { return m_capabilities->bSupportsRadio; } - - /// @brief **true** if this add-on supports playback of recordings stored on - /// the backend. - void SetSupportsRecordings(bool supportsRecordings) - { - m_capabilities->bSupportsRecordings = supportsRecordings; - } - - /// @brief To get with @ref SetSupportsRecordings changed values. - bool GetSupportsRecordings() const { return m_capabilities->bSupportsRecordings; } - - /// @brief Set **true** if this add-on supports undelete of recordings stored - /// on the backend. - void SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete) - { - m_capabilities->bSupportsRecordingsUndelete = supportsRecordingsUndelete; - } - - /// @brief To get with @ref SetSupportsRecordings changed values. - bool GetSupportsRecordingsUndelete() const { return m_capabilities->bSupportsRecordingsUndelete; } - - /// @brief Set **true** if this add-on supports the creation and editing of - /// timers. - void SetSupportsTimers(bool supportsTimers) { m_capabilities->bSupportsTimers = supportsTimers; } - - /// @brief To get with @ref SetSupportsTimers changed values. - bool GetSupportsTimers() const { return m_capabilities->bSupportsTimers; } - - /// @brief Set **true** if this add-on supports providers. - /// - /// It uses the following functions: - /// - @ref kodi::addon::CInstancePVRClient::GetProvidersAmount() - /// - @ref kodi::addon::CInstancePVRClient::GetProviders() - void SetSupportsProviders(bool supportsProviders) - { - m_capabilities->bSupportsProviders = supportsProviders; - } - - /// @brief To get with @ref SetSupportsProviders changed values. - bool GetSupportsProviders() const { return m_capabilities->bSupportsProviders; } - - /// @brief Set **true** if this add-on supports channel groups. - /// - /// It use the following functions: - /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupsAmount() - /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroups() - /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers() - void SetSupportsChannelGroups(bool supportsChannelGroups) - { - m_capabilities->bSupportsChannelGroups = supportsChannelGroups; - } - - /// @brief To get with @ref SetSupportsChannelGroups changed values. - bool GetSupportsChannelGroups() const { return m_capabilities->bSupportsChannelGroups; } - - /// @brief Set **true** if this add-on support scanning for new channels on - /// the backend. - /// - /// It use the following function: - /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelScan() - void SetSupportsChannelScan(bool supportsChannelScan) - { - m_capabilities->bSupportsChannelScan = supportsChannelScan; - } - - /// @brief To get with @ref SetSupportsChannelScan changed values. - bool GetSupportsChannelScan() const { return m_capabilities->bSupportsChannelScan; } - - /// @brief Set **true** if this add-on supports channel edit. - /// - /// It use the following functions: - /// - @ref kodi::addon::CInstancePVRClient::DeleteChannel() - /// - @ref kodi::addon::CInstancePVRClient::RenameChannel() - /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelSettings() - /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelAdd() - void SetSupportsChannelSettings(bool supportsChannelSettings) - { - m_capabilities->bSupportsChannelSettings = supportsChannelSettings; - } - - /// @brief To get with @ref SetSupportsChannelSettings changed values. - bool GetSupportsChannelSettings() const { return m_capabilities->bSupportsChannelSettings; } - - /// @brief Set **true** if this add-on provides an input stream. false if Kodi - /// handles the stream. - void SetHandlesInputStream(bool handlesInputStream) - { - m_capabilities->bHandlesInputStream = handlesInputStream; - } - - /// @brief To get with @ref SetHandlesInputStream changed values. - bool GetHandlesInputStream() const { return m_capabilities->bHandlesInputStream; } - - /// @brief Set **true** if this add-on demultiplexes packets. - void SetHandlesDemuxing(bool handlesDemuxing) - { - m_capabilities->bHandlesDemuxing = handlesDemuxing; - } - - /// @brief To get with @ref SetHandlesDemuxing changed values. - bool GetHandlesDemuxing() const { return m_capabilities->bHandlesDemuxing; } - - /// @brief Set **true** if the backend supports play count for recordings. - void SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount) - { - m_capabilities->bSupportsRecordingPlayCount = supportsRecordingPlayCount; - } - - /// @brief To get with @ref SetSupportsRecordingPlayCount changed values. - bool GetSupportsRecordingPlayCount() const { return m_capabilities->bSupportsRecordingPlayCount; } - - /// @brief Set **true** if the backend supports store/retrieve of last played - /// position for recordings. - void SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition) - { - m_capabilities->bSupportsLastPlayedPosition = supportsLastPlayedPosition; - } - - /// @brief To get with @ref SetSupportsLastPlayedPosition changed values. - bool GetSupportsLastPlayedPosition() const { return m_capabilities->bSupportsLastPlayedPosition; } - - /// @brief Set **true** if the backend supports retrieving an edit decision - /// list for recordings. - void SetSupportsRecordingEdl(bool supportsRecordingEdl) - { - m_capabilities->bSupportsRecordingEdl = supportsRecordingEdl; - } - - /// @brief To get with @ref SetSupportsRecordingEdl changed values. - bool GetSupportsRecordingEdl() const { return m_capabilities->bSupportsRecordingEdl; } - - /// @brief Set **true** if the backend supports renaming recordings. - void SetSupportsRecordingsRename(bool supportsRecordingsRename) - { - m_capabilities->bSupportsRecordingsRename = supportsRecordingsRename; - } - - /// @brief To get with @ref SetSupportsRecordingsRename changed values. - bool GetSupportsRecordingsRename() const { return m_capabilities->bSupportsRecordingsRename; } - - /// @brief Set **true** if the backend supports changing lifetime for - /// recordings. - void SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange) - { - m_capabilities->bSupportsRecordingsLifetimeChange = supportsRecordingsLifetimeChange; - } - - /// @brief To get with @ref SetSupportsRecordingsLifetimeChange changed - /// values. - bool GetSupportsRecordingsLifetimeChange() const - { - return m_capabilities->bSupportsRecordingsLifetimeChange; - } - - /// @brief Set **true** if the backend supports descramble information for - /// playing channels. - void SetSupportsDescrambleInfo(bool supportsDescrambleInfo) - { - m_capabilities->bSupportsDescrambleInfo = supportsDescrambleInfo; - } - - /// @brief To get with @ref SetSupportsDescrambleInfo changed values. - bool GetSupportsDescrambleInfo() const { return m_capabilities->bSupportsDescrambleInfo; } - - /// @brief Set **true** if this addon-on supports asynchronous transfer of epg - /// events to Kodi using the callback function - /// @ref kodi::addon::CInstancePVRClient::EpgEventStateChange(). - void SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer) - { - m_capabilities->bSupportsAsyncEPGTransfer = supportsAsyncEPGTransfer; - } - - /// @brief To get with @ref SetSupportsAsyncEPGTransfer changed values. - bool GetSupportsAsyncEPGTransfer() const { return m_capabilities->bSupportsAsyncEPGTransfer; } - - /// @brief Set **true** if this addon-on supports retrieving size of recordings. - void SetSupportsRecordingSize(bool supportsRecordingSize) - { - m_capabilities->bSupportsRecordingSize = supportsRecordingSize; - } - - /// @brief To get with @ref SetSupportsRecordingSize changed values. - bool GetSupportsRecordingSize() const { return m_capabilities->bSupportsRecordingSize; } - - /// @brief Set **true** if this add-on supports delete of recordings stored - /// on the backend. - void SetSupportsRecordingsDelete(bool supportsRecordingsDelete) - { - m_capabilities->bSupportsRecordingsDelete = supportsRecordingsDelete; - } - - /// @brief To get with @ref SetSupportsRecordingsDelete changed values. - bool GetSupportsRecordingsDelete() const { return m_capabilities->bSupportsRecordingsDelete; } - - /// @brief **optional**\n - /// Set array containing the possible values for @ref PVRRecording::SetLifetime(). - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetRecordingsLifetimeValues( - const std::vector& recordingsLifetimeValues) - { - m_capabilities->iRecordingsLifetimesSize = 0; - for (unsigned int i = 0; i < recordingsLifetimeValues.size() && - i < sizeof(m_capabilities->recordingsLifetimeValues); - ++i) - { - m_capabilities->recordingsLifetimeValues[i].iValue = - recordingsLifetimeValues[i].GetCStructure()->iValue; - strncpy(m_capabilities->recordingsLifetimeValues[i].strDescription, - recordingsLifetimeValues[i].GetCStructure()->strDescription, - sizeof(m_capabilities->recordingsLifetimeValues[i].strDescription) - 1); - ++m_capabilities->iRecordingsLifetimesSize; - } - } - - /// @brief To get with @ref SetRecordingsLifetimeValues changed values. - std::vector GetRecordingsLifetimeValues() const - { - std::vector recordingsLifetimeValues; - for (unsigned int i = 0; i < m_capabilities->iRecordingsLifetimesSize; ++i) - recordingsLifetimeValues.emplace_back( - m_capabilities->recordingsLifetimeValues[i].iValue, - m_capabilities->recordingsLifetimeValues[i].strDescription); - return recordingsLifetimeValues; - } - ///@} - -private: - PVRCapabilities(PVR_ADDON_CAPABILITIES* capabilities) : m_capabilities(capabilities) {} - - PVR_ADDON_CAPABILITIES* m_capabilities; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty class PVRStreamProperty -/// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream -/// @brief **PVR stream property value handler**\n -/// To set for Kodi wanted stream properties. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help -/// -///--------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// ... -/// -/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, -/// std::vector& properties) -/// { -/// ... -/// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// ... -/// ~~~~~~~~~~~~~ -/// -/// -/// **Example 2:** -/// ~~~~~~~~~~~~~{.cpp} -/// ... -/// -/// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, -/// std::vector& properties) -/// { -/// ... -/// kodi::addon::PVRStreamProperty property; -/// property.SetName(PVR_STREAM_PROPERTY_INPUTSTREAM); -/// property.SetValue("inputstream.adaptive"); -/// properties.emplace_back(property); -/// return PVR_ERROR_NO_ERROR; -/// } -/// -/// ... -/// ~~~~~~~~~~~~~ -/// -///@{ -class PVRStreamProperty : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRStreamProperty(const PVRStreamProperty& data) : CStructHdl(data) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Name** | `int` | @ref PVRStreamProperty::SetValue "SetName" | @ref PVRStreamProperty::GetName "GetName" - /// | **Value** | `std::string` | @ref PVRStreamProperty::SetValue "SetValue" | @ref PVRStreamProperty::GetValue "GetValue" - /// - /// @remark Further can there be used his class constructor to set values. - - /// @addtogroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty - ///@{ - - /// @brief Default class constructor. - /// - /// @note Values must be set afterwards. - PVRStreamProperty() = default; - - /// @brief Class constructor with integrated value set. - /// - /// @param[in] name Type identification - /// @param[in] value Type used property value - PVRStreamProperty(const std::string& name, const std::string& value) - { - SetName(name); - SetValue(value); - } - - /// @brief To set with the identification name. - void SetName(const std::string& name) - { - strncpy(m_cStructure->strName, name.c_str(), sizeof(m_cStructure->strName) - 1); - } - - /// @brief To get with the identification name. - std::string GetName() const { return m_cStructure->strName; } - - /// @brief To set with the used property value. - void SetValue(const std::string& value) - { - strncpy(m_cStructure->strValue, value.c_str(), sizeof(m_cStructure->strValue) - 1); - } - - /// @brief To get with the used property value. - std::string GetValue() const { return m_cStructure->strValue; } - ///@} - -private: - PVRStreamProperty(const PVR_NAMED_VALUE* data) : CStructHdl(data) {} - PVRStreamProperty(PVR_NAMED_VALUE* data) : CStructHdl(data) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h deleted file mode 100644 index 053a4d5cf1269..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr/pvr_menu_hook.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 7 - Menu hook -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook class PVRMenuhook -/// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook -/// @brief **Context menu hook**\n -/// Menu hooks that are available in the context menus while playing a stream via this add-on. -/// And in the Live TV settings dialog. -/// -/// Possible menu's given to Kodi. -/// -/// This can be becomes used on this, if @ref kodi::addon::CInstancePVRClient::AddMenuHook() -/// was set to related type: -/// - @ref kodi::addon::CInstancePVRClient::CallSettingsMenuHook() -/// - @ref kodi::addon::CInstancePVRClient::CallChannelMenuHook() -/// - @ref kodi::addon::CInstancePVRClient::CallEPGMenuHook() -/// - @ref kodi::addon::CInstancePVRClient::CallRecordingMenuHook() -/// - @ref kodi::addon::CInstancePVRClient::CallTimerMenuHook() -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help -/// -///@{ -class PVRMenuhook : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook - /// @brief Optional class constructor with value set. - /// - /// @param[in] hookId This hook's identifier - /// @param[in] localizedStringId Localized string identifier - /// @param[in] category Category of menu hook, defined with @ref PVR_MENUHOOK_CAT - /// - /// - /// -------------------------------------------------------------------------- - /// - /// Example: - /// ~~~~~~~~~~~~~{.cpp} - /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30001, PVR_MENUHOOK_CHANNEL)); - /// ~~~~~~~~~~~~~ - /// - PVRMenuhook(unsigned int hookId, unsigned int localizedStringId, PVR_MENUHOOK_CAT category) - { - m_cStructure->iHookId = hookId; - m_cStructure->iLocalizedStringId = localizedStringId; - m_cStructure->category = category; - } - - /*! \cond PRIVATE */ - PVRMenuhook() - { - m_cStructure->iHookId = 0; - m_cStructure->iLocalizedStringId = 0; - m_cStructure->category = PVR_MENUHOOK_UNKNOWN; - } - PVRMenuhook(const PVRMenuhook& data) : CStructHdl(data) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **This hook's identifier** | `unsigned int` | @ref PVRMenuhook::SetHookId "SetHookId" | @ref PVRMenuhook::GetHookId "GetHookId" | *required to set* - /// | **Localized string Identifier** | `unsigned int` | @ref PVRMenuhook::SetLocalizedStringId "SetLocalizedStringId" | @ref PVRMenuhook::GetLocalizedStringId "GetLocalizedStringId" | *required to set* - /// | **Category of menu hook** | @ref PVR_MENUHOOK_CAT | @ref PVRMenuhook::SetCategory "SetCategory" | @ref PVRMenuhook::GetCategory "GetCategory" | *required to set* - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook - ///@{ - - /// @brief **required**\n - /// This hook's identifier. - void SetHookId(unsigned int hookId) { m_cStructure->iHookId = hookId; } - - /// @brief To get with @ref SetHookId() changed values. - unsigned int GetHookId() const { return m_cStructure->iHookId; } - - /// @brief **required**\n - /// The id of the label for this hook in @ref kodi::GetLocalizedString(). - void SetLocalizedStringId(unsigned int localizedStringId) - { - m_cStructure->iLocalizedStringId = localizedStringId; - } - - /// @brief To get with @ref SetLocalizedStringId() changed values. - unsigned int GetLocalizedStringId() const { return m_cStructure->iLocalizedStringId; } - - /// @brief **required**\n - /// Category of menu hook. - void SetCategory(PVR_MENUHOOK_CAT category) { m_cStructure->category = category; } - - /// @brief To get with @ref SetCategory() changed values. - PVR_MENUHOOK_CAT GetCategory() const { return m_cStructure->category; } - ///@} - -private: - PVRMenuhook(const PVR_MENUHOOK* data) : CStructHdl(data) {} - PVRMenuhook(PVR_MENUHOOK* data) : CStructHdl(data) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Providers.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Providers.h deleted file mode 100644 index ddbb1887ccf84..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Providers.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" -#include "../../tools/StringUtils.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 2 - PVR provider -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_PVRProvider class PVRProvider -/// @ingroup cpp_kodi_addon_pvr_Defs_Provider -/// @brief **Provider data structure**\n -/// Representation of a provider. -/// -/// This is used to store all the necessary provider data and can -/// either provide the necessary data from / to Kodi for the associated -/// functions or can also be used in the addon to store its data. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_PVRProvider_Help -/// -///@{ -class PVRProvider : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRProvider() { memset(m_cStructure, 0, sizeof(PVR_PROVIDER)); } - PVRProvider(const PVRProvider& provider) : CStructHdl(provider) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_PVRProvider_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_PVRProvider - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRProvider : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Unique id** | `unsigned int` | @ref PVRProvider::SetUniqueId "SetUniqueId" | @ref PVRProvider::GetUniqueId "GetUniqueId" | *required to set* - /// | **Provider name** | `std::string` | @ref PVRProvider::SetName "SetName" | @ref PVRProvider::GetName "GetName" | *required to set* - /// | **Provider type** | @ref PVR_PROVIDER_TYPE | @ref PVRProvider::SetType "SetType" | @ref PVRProvider::GetType "GetType" | *optional* - /// | **Icon path** | `std::string` | @ref PVRProvider::SetIconPath "SetIconPath" | @ref PVRProvider::GetIconPath "GetIconPath" | *optional* - /// | **Countries** | `std::vecotr` | @ref PVRProvider::SetCountries "SetCountries" | @ref PVRProvider::GetCountries "GetCountries" | *optional* - /// | **Langauges** | `std::vecotr` | @ref PVRProvider::SetLangauges "SetLangauges" | @ref PVRProvider::GetLangauges "GetLangauges" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRProvider - ///@{ - - /// @brief **required**\n - /// Unique identifier for this provider. - void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; } - - /// @brief To get with @ref SetUniqueId changed values. - unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; } - - /// @brief **required**\n - /// Name given to this provider. - void SetName(const std::string& name) - { - strncpy(m_cStructure->strName, name.c_str(), sizeof(m_cStructure->strName) - 1); - } - - /// @brief To get with @ref SetName changed values. - std::string GetName() const { return m_cStructure->strName; } - - /// @brief **optional**\n - /// Provider type. - /// - /// Set to @ref PVR_PVR_PROVIDER_TYPE_UNKNOWN if the type cannot be - /// determined. - /// - /// -------------------------------------------------------------------------- - /// - /// Example: - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRProvider tag; - /// tag.SetType(PVR_PROVIDER_TYPE_SATELLITE); - /// ~~~~~~~~~~~~~ - /// - void SetType(PVR_PROVIDER_TYPE type) { m_cStructure->type = type; } - - /// @brief To get with @ref SetType changed values - PVR_PROVIDER_TYPE GetType() const { return m_cStructure->type; } - - /// @brief **optional**\n - /// Path to the provider icon (if present). - void SetIconPath(const std::string& iconPath) - { - strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1); - } - - /// @brief To get with @ref SetIconPath changed values. - std::string GetIconPath() const { return m_cStructure->strIconPath; } - ///@} - - /// @brief **optional**\n - /// The country codes for the provider. - /// - /// @note ISO 3166 country codes required (e.g 'GB,IE,CA'). - void SetCountries(const std::vector& countries) - { - const std::string str = tools::StringUtils::Join(countries, PROVIDER_STRING_TOKEN_SEPARATOR); - strncpy(m_cStructure->strCountries, str.c_str(), sizeof(m_cStructure->strCountries) - 1); - } - - /// @brief To get with @ref SetCountries changed values. - std::vector GetCountries() const - { - return tools::StringUtils::Split(m_cStructure->strCountries, PROVIDER_STRING_TOKEN_SEPARATOR); - } - ///@} - - /// @brief **optional**\n - /// The language codes for the provider. - /// - /// @note RFC 5646 standard codes required (e.g.: 'en_GB,fr_CA'). - void SetLanguages(const std::vector& languages) - { - const std::string str = tools::StringUtils::Join(languages, PROVIDER_STRING_TOKEN_SEPARATOR); - strncpy(m_cStructure->strLanguages, str.c_str(), sizeof(m_cStructure->strLanguages) - 1); - } - - /// @brief To get with @ref SetLanguages changed values. - std::vector GetLanguages() const - { - return tools::StringUtils::Split(m_cStructure->strLanguages, PROVIDER_STRING_TOKEN_SEPARATOR); - } - ///@} - -private: - PVRProvider(const PVR_PROVIDER* provider) : CStructHdl(provider) {} - PVRProvider(PVR_PROVIDER* provider) : CStructHdl(provider) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_PVRProvidersResultSet class PVRProvidersResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_PVRProvider -/// @brief **PVR add-on provider transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetProviders(). -/// -///@{ -class PVRProvidersResultSet -{ -public: - /*! \cond PRIVATE */ - PVRProvidersResultSet() = delete; - PVRProvidersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRProvidersResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] provider The to transferred data. - void Add(const kodi::addon::PVRProvider& provider) - { - m_instance->toKodi->TransferProviderEntry(m_instance->toKodi->kodiInstance, m_handle, provider); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h deleted file mode 100644 index 7dc2f7e98c5d6..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 5 - PVR recordings -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording class PVRRecording -/// @ingroup cpp_kodi_addon_pvr_Defs_Recording -/// @brief **Data structure with available recordings data**\n -/// With this, recordings related data are transferred between addon and Kodi -/// and can also be used by the addon itself. -/// -/// The related values here are automatically initiated to defaults and need -/// only be set if supported and used. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help -/// -///@{ -class PVRRecording : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRRecording() - { - m_cStructure->iSeriesNumber = PVR_RECORDING_INVALID_SERIES_EPISODE; - m_cStructure->iEpisodeNumber = PVR_RECORDING_INVALID_SERIES_EPISODE; - m_cStructure->recordingTime = 0; - m_cStructure->iDuration = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iPriority = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iLifetime = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iGenreType = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iGenreSubType = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iPlayCount = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->iLastPlayedPosition = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->bIsDeleted = false; - m_cStructure->iEpgEventId = 0; - m_cStructure->iChannelUid = PVR_RECORDING_VALUE_NOT_AVAILABLE; - m_cStructure->channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; - m_cStructure->iFlags = 0; - m_cStructure->sizeInBytes = PVR_RECORDING_VALUE_NOT_AVAILABLE; - } - PVRRecording(const PVRRecording& recording) : CStructHdl(recording) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Recording id** | `std::string` | @ref PVRRecording::SetRecordingId "SetRecordingId" | @ref PVRRecording::GetRecordingId "GetRecordingId" | *required to set* - /// | **Title** | `std::string` | @ref PVRRecording::SetTitle "SetTitle" | @ref PVRRecording::GetTitle "GetTitle" | *required to set* - /// | **Episode name** | `std::string` | @ref PVRRecording::SetEpisodeName "SetEpisodeName" | @ref PVRRecording::GetEpisodeName "GetEpisodeName" | *optional* - /// | **Series number** | `int` | @ref PVRRecording::SetSeriesNumber "SetSeriesNumber" | @ref PVRRecording::GetSeriesNumber "GetSeriesNumber" | *optional* - /// | **Episode number** | `int` | @ref PVRRecording::SetEpisodeNumber "SetEpisodeNumber" | @ref PVRRecording::GetEpisodeNumber "GetEpisodeNumber" | *optional* - /// | **Year** | `int` | @ref PVRRecording::SetYear "SetYear" | @ref PVRRecording::GetYear "GetYear" | *optional* - /// | **Directory** | `std::string` | @ref PVRRecording::SetDirectory "SetDirectory" | @ref PVRRecording::GetDirectory "GetDirectory" | *optional* - /// | **Plot outline** | `std::string` | @ref PVRRecording::SetPlotOutline "SetPlotOutline" | @ref PVRRecording::GetPlotOutline "GetPlotOutline" | *optional* - /// | **Plot** | `std::string` | @ref PVRRecording::SetPlot "SetPlot" | @ref PVRRecording::GetPlot "GetPlot" | *optional* - /// | **Genre description** | `std::string` | @ref PVRRecording::SetGenreDescription "SetGenreDescription" | @ref PVRRecording::GetGenreDescription "GetGenreDescription" | *optional* - /// | **Channel name** | `std::string` | @ref PVRRecording::SetChannelName "SetChannelName" | @ref PVRRecording::GetChannelName "GetChannelName" | *optional* - /// | **Icon path** | `std::string` | @ref PVRRecording::SetIconPath "SetIconPath" | @ref PVRRecording::GetIconPath "GetIconPath" | *optional* - /// | **Thumbnail path** | `std::string` | @ref PVRRecording::SetThumbnailPath "SetThumbnailPath" | @ref PVRRecording::GetThumbnailPath "GetThumbnailPath" | *optional* - /// | **Fanart path** | `std::string` | @ref PVRRecording::SetFanartPath "SetFanartPath" | @ref PVRRecording::GetFanartPath "GetFanartPath" | *optional* - /// | **Recording time** | `time_t` | @ref PVRRecording::SetRecordingTime "SetRecordingTime" | @ref PVRRecording::GetRecordingTime "GetRecordingTime" | *optional* - /// | **Duration** | `int` | @ref PVRRecording::SetDuration "SetDuration" | @ref PVRRecording::GetDuration "GetDuration" | *optional* - /// | **Priority** | `int` | @ref PVRRecording::SetPriority "SetPriority" | @ref PVRRecording::GetPriority "GetPriority" | *optional* - /// | **Lifetime** | `int` | @ref PVRRecording::SetLifetime "SetLifetime" | @ref PVRRecording::GetLifetime "GetLifetime" | *optional* - /// | **Genre type** | `int` | @ref PVRRecording::SetGenreType "SetGenreType" | @ref PVRRecording::GetGenreType "GetGenreType" | *optional* - /// | **Genre sub type** | `int` | @ref PVRRecording::SetGenreSubType "SetGenreSubType" | @ref PVRRecording::GetGenreSubType "GetGenreSubType" | *optional* - /// | **Play count** | `int` | @ref PVRRecording::SetPlayCount "SetPlayCount" | @ref PVRRecording::GetPlayCount "GetPlayCount" | *optional* - /// | **Last played position** | `int` | @ref PVRRecording::SetLastPlayedPosition "SetLastPlayedPosition" | @ref PVRRecording::GetLastPlayedPosition "GetLastPlayedPosition" | *optional* - /// | **Is deleted** | `bool` | @ref PVRRecording::SetIsDeleted "SetIsDeleted" | @ref PVRRecording::GetIsDeleted "GetIsDeleted" | *optional* - /// | **EPG event id** | `unsigned int` | @ref PVRRecording::SetEPGEventId "SetEPGEventId" | @ref PVRRecording::GetEPGEventId "GetEPGEventId" | *optional* - /// | **Channel unique id** | `int` | @ref PVRRecording::SetChannelUid "SetChannelUid" | @ref PVRRecording::GetChannelUid "GetChannelUid" | *optional* - /// | **Channel type** | @ref PVR_RECORDING_CHANNEL_TYPE | @ref PVRRecording::SetChannelType "SetChannelType" | @ref PVRRecording::GetChannelType "GetChannelType" | *optional* - /// | **First aired** | `std::string` | @ref PVRRecording::SetFirstAired "SetFirstAired" | @ref PVRRecording::GetFirstAired "GetFirstAired" | *optional* - /// | **Flags** | `std::string` | @ref PVRRecording::SetFlags "SetFlags" | @ref PVRRecording::GetFlags "GetFlags" | *optional* - /// | **Size in bytes** | `std::string` | @ref PVRRecording::SetSizeInBytes "SetSizeInBytes" | @ref PVRRecording::GetSizeInBytes "GetSizeInBytes" | *optional* - /// | **Client provider unique identifier** | `int` | @ref PVRChannel::SetClientProviderUid "SetClientProviderUid" | @ref PVRTimer::GetClientProviderUid "GetClientProviderUid" | *optional* - /// | **Provider name** | `std::string` | @ref PVRChannel::SetProviderName "SetProviderlName" | @ref PVRChannel::GetProviderName "GetProviderName" | *optional* - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording - ///@{ - - /// @brief **required**\n - /// Unique identifier of the recording on the client. - void SetRecordingId(const std::string& recordingId) - { - strncpy(m_cStructure->strRecordingId, recordingId.c_str(), - sizeof(m_cStructure->strRecordingId) - 1); - } - - /// @brief To get with @ref SetRecordingId changed values. - std::string GetRecordingId() const { return m_cStructure->strRecordingId; } - - /// @brief **required**\n - /// The title of this recording. - void SetTitle(const std::string& title) - { - strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1); - } - - /// @brief To get with @ref SetTitle changed values. - std::string GetTitle() const { return m_cStructure->strTitle; } - - /// @brief **optional**\n - /// Episode name (also known as subtitle). - void SetEpisodeName(const std::string& episodeName) - { - strncpy(m_cStructure->strEpisodeName, episodeName.c_str(), - sizeof(m_cStructure->strEpisodeName) - 1); - } - - /// @brief To get with @ref SetEpisodeName changed values. - std::string GetEpisodeName() const { return m_cStructure->strEpisodeName; } - - /// @brief **optional**\n - /// Series number (usually called season). - /// - /// Set to "0" for specials/pilot. For 'invalid' see @ref SetEpisodeNumber or set to -1. - void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; } - - /// @brief To get with @ref SetSeriesNumber changed values. - int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; } - - /// @brief **optional**\n - /// Eepisode number within the "iSeriesNumber" season. - /// - /// For 'invalid' set to -1 or seriesNumber=episodeNumber=0 to show both are invalid. - void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; } - - /// @brief To get with @ref SetEpisodeNumber changed values. - int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; } - - /// @brief **optional**\n - /// Year of first release (use to identify a specific movie re-make) / first - /// airing for TV shows. - /// - /// Set to '0' for invalid. - void SetYear(int year) { m_cStructure->iYear = year; } - - /// @brief To get with @ref SetYear changed values. - int GetYear() const { return m_cStructure->iYear; } - - /// @brief **optional**\n - /// - /// Directory of this recording on the client. - void SetDirectory(const std::string& directory) - { - strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1); - } - - /// @brief To get with @ref SetDirectory changed values. - std::string GetDirectory() const { return m_cStructure->strDirectory; } - - /// @brief **optional**\n - /// Plot outline name. - void SetPlotOutline(const std::string& plotOutline) - { - strncpy(m_cStructure->strPlotOutline, plotOutline.c_str(), - sizeof(m_cStructure->strPlotOutline) - 1); - } - - /// @brief To get with @ref SetPlotOutline changed values. - std::string GetPlotOutline() const { return m_cStructure->strPlotOutline; } - - /// @brief **optional**\n - /// Plot name. - void SetPlot(const std::string& plot) - { - strncpy(m_cStructure->strPlot, plot.c_str(), sizeof(m_cStructure->strPlot) - 1); - } - - /// @brief To get with @ref SetPlot changed values. - std::string GetPlot() const { return m_cStructure->strPlot; } - - /// @brief **optional**\n - /// Channel name. - void SetChannelName(const std::string& channelName) - { - strncpy(m_cStructure->strChannelName, channelName.c_str(), - sizeof(m_cStructure->strChannelName) - 1); - } - - /// @brief To get with @ref SetChannelName changed values. - std::string GetChannelName() const { return m_cStructure->strChannelName; } - - /// @brief **optional**\n - /// Channel logo (icon) path. - void SetIconPath(const std::string& iconPath) - { - strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1); - } - - /// @brief To get with @ref SetIconPath changed values. - std::string GetIconPath() const { return m_cStructure->strIconPath; } - - /// @brief **optional**\n - /// Thumbnail path. - void SetThumbnailPath(const std::string& thumbnailPath) - { - strncpy(m_cStructure->strThumbnailPath, thumbnailPath.c_str(), - sizeof(m_cStructure->strThumbnailPath) - 1); - } - - /// @brief To get with @ref SetThumbnailPath changed values. - std::string GetThumbnailPath() const { return m_cStructure->strThumbnailPath; } - - /// @brief **optional**\n - /// Fanart path. - void SetFanartPath(const std::string& fanartPath) - { - strncpy(m_cStructure->strFanartPath, fanartPath.c_str(), - sizeof(m_cStructure->strFanartPath) - 1); - } - - /// @brief To get with @ref SetFanartPath changed values. - std::string GetFanartPath() const { return m_cStructure->strFanartPath; } - - /// @brief **optional**\n - /// Start time of the recording. - void SetRecordingTime(time_t recordingTime) { m_cStructure->recordingTime = recordingTime; } - - /// @brief To get with @ref SetRecordingTime changed values. - time_t GetRecordingTime() const { return m_cStructure->recordingTime; } - - /// @brief **optional**\n - /// Duration of the recording in seconds. - void SetDuration(int duration) { m_cStructure->iDuration = duration; } - - /// @brief To get with @ref SetDuration changed values. - int GetDuration() const { return m_cStructure->iDuration; } - - /// @brief **optional**\n - /// Priority of this recording (from 0 - 100). - void SetPriority(int priority) { m_cStructure->iPriority = priority; } - - /// @brief To get with @ref SetPriority changed values. - int GetPriority() const { return m_cStructure->iPriority; } - - /// @brief **optional**\n - /// Life time in days of this recording. - void SetLifetime(int lifetime) { m_cStructure->iLifetime = lifetime; } - - /// @brief To get with @ref SetLifetime changed values. - int GetLifetime() const { return m_cStructure->iLifetime; } - - /// @brief **optional**\n - /// Genre type. - /// - /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription. - /// - /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) - /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here - /// with backend value. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example 1:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); - /// ~~~~~~~~~~~~~ - /// - /// -------------------------------------------------------------------------- - /// - /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types): - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetGenreType(EPG_GENRE_USE_STRING); - /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language. - /// ~~~~~~~~~~~~~ - /// - void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } - - /// @brief To get with @ref SetGenreType changed values. - int GetGenreType() const { return m_cStructure->iGenreType; } - - /// @brief **optional**\n - /// Genre sub type. - /// - /// Subtypes groups related to set by @ref SetGenreType: - /// | Main genre type | List with available sub genre types - /// |-----------------|----------------------------------------- - /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 - /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA - /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS - /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW - /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS - /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH - /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE - /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE - /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS - /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE - /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES - /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL - /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you - /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given. - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); - /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); - /// ~~~~~~~~~~~~~ - /// - void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } - - /// @brief To get with @ref SetGenreSubType changed values. - int GetGenreSubType() const { return m_cStructure->iGenreSubType; } - - /// @brief **optional**\n - /// To set own genre description name. - /// - /// Will be used only when genreType == @ref EPG_GENRE_USE_STRING or - /// genreSubType == @ref EPG_GENRE_USE_STRING. - /// - /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres. - /// - /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) - /// conform genre types or something special. - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetGenreType(EPG_GENRE_USE_STRING); - /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller"); - /// ~~~~~~~~~~~~~ - /// - void SetGenreDescription(const std::string& genreDescription) - { - strncpy(m_cStructure->strGenreDescription, genreDescription.c_str(), - sizeof(m_cStructure->strGenreDescription) - 1); - } - - /// @brief To get with @ref SetGenreDescription changed values. - std::string GetGenreDescription() const { return m_cStructure->strGenreDescription; } - - /// @brief **optional**\n - /// Play count of this recording on the client. - void SetPlayCount(int playCount) { m_cStructure->iPlayCount = playCount; } - - /// @brief To get with @ref SetPlayCount changed values. - int GetPlayCount() const { return m_cStructure->iPlayCount; } - - /// @brief **optional**\n - /// Last played position of this recording on the client. - void SetLastPlayedPosition(int lastPlayedPosition) - { - m_cStructure->iLastPlayedPosition = lastPlayedPosition; - } - - /// @brief To get with @ref SetLastPlayedPosition changed values. - int GetLastPlayedPosition() const { return m_cStructure->iLastPlayedPosition; } - - /// @brief **optional**\n - /// Shows this recording is deleted and can be undelete. - void SetIsDeleted(int isDeleted) { m_cStructure->bIsDeleted = isDeleted; } - - /// @brief To get with @ref SetIsDeleted changed values. - int GetIsDeleted() const { return m_cStructure->bIsDeleted; } - - /// @brief **optional**\n - /// EPG event id associated with this recording. Valid ids must be greater than @ref EPG_TAG_INVALID_UID. - void SetEPGEventId(unsigned int epgEventId) { m_cStructure->iEpgEventId = epgEventId; } - - /// @brief To get with @ref SetEPGEventId changed values. - unsigned int GetEPGEventId() const { return m_cStructure->iEpgEventId; } - - /// @brief **optional**\n - /// Unique identifier of the channel for this recording. @ref PVR_CHANNEL_INVALID_UID - /// denotes that channel uid is not available. - void SetChannelUid(int channelUid) { m_cStructure->iChannelUid = channelUid; } - - /// @brief To get with @ref SetChannelUid changed values - int GetChannelUid() const { return m_cStructure->iChannelUid; } - - /// @brief **optional**\n - /// Channel type. - /// - /// Set to @ref PVR_RECORDING_CHANNEL_TYPE_UNKNOWN if the type cannot be - /// determined. - /// - /// -------------------------------------------------------------------------- - /// - /// Example: - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_TV); - /// ~~~~~~~~~~~~~ - /// - void SetChannelType(PVR_RECORDING_CHANNEL_TYPE channelType) - { - m_cStructure->channelType = channelType; - } - - /// @brief To get with @ref SetChannelType changed values - PVR_RECORDING_CHANNEL_TYPE GetChannelType() const { return m_cStructure->channelType; } - - /// @brief **optional**\n - /// First aired date of this recording. - /// - /// Used only for display purposes. Specify in W3C date format "YYYY-MM-DD". - /// - /// -------------------------------------------------------------------------- - /// - /// Example: - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRRecording tag; - /// tag.SetFirstAired(1982-10-22); - /// ~~~~~~~~~~~~~ - /// - void SetFirstAired(const std::string& firstAired) - { - strncpy(m_cStructure->strFirstAired, firstAired.c_str(), - sizeof(m_cStructure->strFirstAired) - 1); - } - - /// @brief To get with @ref SetFirstAired changed values - std::string GetFirstAired() const { return m_cStructure->strFirstAired; } - - /// @brief **optional**\n - /// Bit field of independent flags associated with the recording. - /// - /// See @ref cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG for - /// available bit flags. - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG - /// - void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; } - - /// @brief To get with @ref SetFlags changed values. - unsigned int GetFlags() const { return m_cStructure->iFlags; } - - /// @brief **optional**\n - /// Size of the recording in bytes. - void SetSizeInBytes(int64_t sizeInBytes) { m_cStructure->sizeInBytes = sizeInBytes; } - - /// @brief To get with @ref SetSizeInBytes changed values. - int64_t GetSizeInBytes() const { return m_cStructure->sizeInBytes; } - ///@} - - /// @brief **optional**\n - /// Unique identifier of the provider this channel belongs to. - /// - /// @ref PVR_PROVIDER_INVALID_UID denotes that provider uid is not available. - void SetClientProviderUid(int iClientProviderUid) - { - m_cStructure->iClientProviderUid = iClientProviderUid; - } - - /// @brief To get with @ref SetClientProviderUid changed values - int GetClientProviderUid() const { return m_cStructure->iClientProviderUid; } - - /// @brief **optional**\n - /// Name for the provider of this channel. - void SetProviderName(const std::string& providerName) - { - strncpy(m_cStructure->strProviderName, providerName.c_str(), - sizeof(m_cStructure->strProviderName) - 1); - } - - /// @brief To get with @ref SetProviderName changed values. - std::string GetProviderName() const { return m_cStructure->strProviderName; } - -private: - PVRRecording(const PVR_RECORDING* recording) : CStructHdl(recording) {} - PVRRecording(PVR_RECORDING* recording) : CStructHdl(recording) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet class PVRRecordingsResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording -/// @brief **PVR add-on recording transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetRecordings(). -/// -/// @note This becomes only be used on addon call above, not usable outside on -/// addon itself. -///@{ -class PVRRecordingsResultSet -{ -public: - /*! \cond PRIVATE */ - PVRRecordingsResultSet() = delete; - PVRRecordingsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVRRecording& tag) - { - m_instance->toKodi->TransferRecordingEntry(m_instance->toKodi->kodiInstance, m_handle, tag); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h deleted file mode 100644 index 4241c233f5be8..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr/pvr_stream.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 9 - PVR stream definitions (NOTE: Becomes replaced -// in future by inputstream addon instance way) - -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec class PVRCodec -/// @ingroup cpp_kodi_addon_pvr_Defs_Stream -/// @brief **PVR codec identifier**\n -/// Used to exchange the desired codec type between Kodi and addon. -/// -/// @ref kodi::addon::CInstancePVRClient::GetCodecByName is used to get this data. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help -/// -///@{ -class PVRCodec : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRCodec() - { - m_cStructure->codec_type = PVR_CODEC_TYPE_UNKNOWN; - m_cStructure->codec_id = PVR_INVALID_CODEC_ID; - } - PVRCodec(const PVRCodec& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRCodec : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRCodec::SetCodecType "SetCodecType" | @ref PVRCodec::GetCodecType "GetCodecType" - /// | **Codec identifier** | `unsigned int` | @ref PVRCodec::SetCodecId "SetCodecId" | @ref PVRCodec::GetCodecId "GetCodecId" - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec - ///@{ - - /// @brief Codec type. - void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->codec_type = codecType; } - - /// @brief To get with @ref SetCodecType() changed values. - PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->codec_type; } - - /// @brief Codec id. - /// - /// Related codec identifier, normally match the ffmpeg id's. - void SetCodecId(unsigned int codecId) { m_cStructure->codec_id = codecId; } - - /// @brief To get with @ref SetCodecId() changed values. - unsigned int GetCodecId() const { return m_cStructure->codec_id; } - ///@} - -private: - PVRCodec(const PVR_CODEC& type) : CStructHdl(&type) {} - PVRCodec(const PVR_CODEC* type) : CStructHdl(type) {} - PVRCodec(PVR_CODEC* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties class PVRStreamProperties -/// @ingroup cpp_kodi_addon_pvr_Defs_Stream -/// @brief **PVR stream properties**\n -/// All information about a respective stream is stored in this, so that Kodi -/// can process the data given by the addon after demux. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help -/// -///@{ -class PVRStreamProperties - : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRStreamProperties() { memset(m_cStructure, 0, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); } - PVRStreamProperties(const PVRStreamProperties& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **PID** | `unsigned int` | @ref PVRStreamProperties::SetPID "SetPID" | @ref PVRStreamProperties::GetPID "GetPID" - /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRStreamProperties::SetCodecType "SetCodecType" | @ref PVRStreamProperties::GetCodecType "GetCodecType" - /// | **Codec identifier** | `unsigned int` | @ref PVRStreamProperties::SetCodecId "SetCodecId" | @ref PVRStreamProperties::GetCodecId "GetCodecId" - /// | **Language** | `std::string` | @ref PVRStreamProperties::SetLanguage "SetLanguage" | @ref PVRStreamProperties::GetLanguage "GetLanguage" - /// | **Subtitle info** | `int` | @ref PVRStreamProperties::SetSubtitleInfo "SetSubtitleInfo" | @ref PVRStreamProperties::GetSubtitleInfo "GetSubtitleInfo" - /// | **FPS scale** | `int` | @ref PVRStreamProperties::SetFPSScale "SetFPSScale" | @ref PVRStreamProperties::GetFPSScale "GetFPSScale" - /// | **FPS rate** | `int` | @ref PVRStreamProperties::SetFPSRate "SetFPSRate" | @ref PVRStreamProperties::GetFPSRate "GetFPSRate" - /// | **Height** | `int` | @ref PVRStreamProperties::SetHeight "SetHeight" | @ref PVRStreamProperties::GetHeight "GetHeight" - /// | **Width** | `int` | @ref PVRStreamProperties::SetWidth "SetWidth" | @ref PVRStreamProperties::GetWidth "GetWidth" - /// | **Aspect ratio** | `float` | @ref PVRStreamProperties::SetAspect "SetAspect" | @ref PVRStreamProperties::GetAspect "GetAspect" - /// | **Channels** | `int` | @ref PVRStreamProperties::SetChannels "SetChannels" | @ref PVRStreamProperties::GetChannels "GetChannels" - /// | **Samplerate** | `int` | @ref PVRStreamProperties::SetSampleRate "SetSampleRate" | @ref PVRStreamProperties::GetSampleRate "GetSampleRate" - /// | **Block align** | `int` | @ref PVRStreamProperties::SetBlockAlign "SetBlockAlign" | @ref PVRStreamProperties::GetBlockAlign "GetBlockAlign" - /// | **Bit rate** | `int` | @ref PVRStreamProperties::SetBitRate "SetBitRate" | @ref PVRStreamProperties::GetBitRate "GetBitRate" - /// | **Bits per sample** | `int` | @ref PVRStreamProperties::SetBitsPerSample "SetBitsPerSample" | @ref PVRStreamProperties::GetBitsPerSample "GetBitsPerSample" - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties - ///@{ - - /// @brief PID. - void SetPID(unsigned int pid) { m_cStructure->iPID = pid; } - - /// @brief To get with @ref SetPID() changed values. - unsigned int GetPID() const { return m_cStructure->iPID; } - - /// @brief Codec type this stream. - void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->iCodecType = codecType; } - - /// @brief To get with @ref SetCodecType() changed values. - PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->iCodecType; } - - /// @brief Codec id of this stream. - void SetCodecId(unsigned int codecId) { m_cStructure->iCodecId = codecId; } - - /// @brief To get with @ref SetCodecId() changed values. - unsigned int GetCodecId() const { return m_cStructure->iCodecId; } - - /// @brief 3 letter language id. - void SetLanguage(const std::string& language) - { - if (language.size() > 3) - { - kodi::Log(ADDON_LOG_ERROR, - "PVRStreamProperties::%s: Language string size '%li' higher as needed 3", __func__, - language.size()); - return; - } - m_cStructure->strLanguage[0] = language[0]; - m_cStructure->strLanguage[1] = language[1]; - m_cStructure->strLanguage[2] = language[2]; - m_cStructure->strLanguage[3] = 0; - } - - /// @brief To get with @ref SetLanguage() changed values. - std::string GetLanguage() const { return m_cStructure->strLanguage; } - - /// @brief Subtitle Info - void SetSubtitleInfo(int subtitleInfo) { m_cStructure->iSubtitleInfo = subtitleInfo; } - - /// @brief To get with @ref SetSubtitleInfo() changed values. - int GetSubtitleInfo() const { return m_cStructure->iSubtitleInfo; } - - /// @brief To set scale of 1000 and a rate of 29970 will result in 29.97 fps. - void SetFPSScale(int fpsScale) { m_cStructure->iFPSScale = fpsScale; } - - /// @brief To get with @ref SetFPSScale() changed values. - int GetFPSScale() const { return m_cStructure->iFPSScale; } - - /// @brief FPS rate - void SetFPSRate(int fpsRate) { m_cStructure->iFPSRate = fpsRate; } - - /// @brief To get with @ref SetFPSRate() changed values. - int GetFPSRate() const { return m_cStructure->iFPSRate; } - - /// @brief Height of the stream reported by the demuxer - void SetHeight(int height) { m_cStructure->iHeight = height; } - - /// @brief To get with @ref SetHeight() changed values. - int GetHeight() const { return m_cStructure->iHeight; } - - /// @brief Width of the stream reported by the demuxer. - void SetWidth(int width) { m_cStructure->iWidth = width; } - - /// @brief To get with @ref SetWidth() changed values. - int GetWidth() const { return m_cStructure->iWidth; } - - /// @brief Display aspect ratio of the stream. - void SetAspect(float aspect) { m_cStructure->fAspect = aspect; } - - /// @brief To get with @ref SetAspect() changed values. - float GetAspect() const { return m_cStructure->fAspect; } - - /// @brief Amount of channels. - void SetChannels(int channels) { m_cStructure->iChannels = channels; } - - /// @brief To get with @ref SetChannels() changed values. - int GetChannels() const { return m_cStructure->iChannels; } - - /// @brief Sample rate. - void SetSampleRate(int sampleRate) { m_cStructure->iSampleRate = sampleRate; } - - /// @brief To get with @ref SetSampleRate() changed values. - int GetSampleRate() const { return m_cStructure->iSampleRate; } - - /// @brief Block alignment - void SetBlockAlign(int blockAlign) { m_cStructure->iBlockAlign = blockAlign; } - - /// @brief To get with @ref SetBlockAlign() changed values. - int GetBlockAlign() const { return m_cStructure->iBlockAlign; } - - /// @brief Bit rate. - void SetBitRate(int bitRate) { m_cStructure->iBitRate = bitRate; } - - /// @brief To get with @ref SetBitRate() changed values. - int GetBitRate() const { return m_cStructure->iBitRate; } - - /// @brief Bits per sample. - void SetBitsPerSample(int bitsPerSample) { m_cStructure->iBitsPerSample = bitsPerSample; } - - /// @brief To get with @ref SetBitsPerSample() changed values. - int GetBitsPerSample() const { return m_cStructure->iBitsPerSample; } - ///@} - -private: - PVRStreamProperties(const PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {} - PVRStreamProperties(PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes class PVRStreamTimes -/// @ingroup cpp_kodi_addon_pvr_Defs_Stream -/// @brief **Times of playing stream (Live TV and recordings)**\n -/// This class is used to transfer the necessary data when -/// @ref kodi::addon::PVRStreamProperties::GetStreamTimes is called. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help -/// -///@{ -class PVRStreamTimes : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRStreamTimes() { memset(m_cStructure, 0, sizeof(PVR_STREAM_TIMES)); } - PVRStreamTimes(const PVRStreamTimes& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes : - /// | Name | Type | Set call | Get call - /// |------|------|----------|---------- - /// | **Start time** | `time_t` | @ref PVRStreamTimes::SetStartTime "SetStartTime" | @ref PVRStreamTimes::GetStartTime "GetStartTime" - /// | **PTS start** | `int64_t` | @ref PVRStreamTimes::SetPTSStart "SetPTSStart" | @ref PVRStreamTimes::GetPTSStart "GetPTSStart" - /// | **PTS begin** | `int64_t` | @ref PVRStreamTimes::SetPTSBegin "SetPTSBegin" | @ref PVRStreamTimes::GetPTSBegin "GetPTSBegin" - /// | **PTS end** | `int64_t` | @ref PVRStreamTimes::SetPTSEnd "SetPTSEnd" | @ref PVRStreamTimes::GetPTSEnd "GetPTSEnd" - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes - ///@{ - - /// @brief For recordings, this must be zero. For Live TV, this is a reference - /// time in units of time_t (UTC) from which time elapsed starts. Ideally start - /// of tv show, but can be any other value. - void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } - - /// @brief To get with @ref SetStartTime() changed values. - time_t GetStartTime() const { return m_cStructure->startTime; } - - /// @brief The pts of startTime. - void SetPTSStart(int64_t ptsStart) { m_cStructure->ptsStart = ptsStart; } - - /// @brief To get with @ref SetPTSStart() changed values. - int64_t GetPTSStart() const { return m_cStructure->ptsStart; } - - /// @brief Earliest pts player can seek back. Value is in micro seconds, - /// relative to PTS start. For recordings, this must be zero. For Live TV, this - /// must be zero if not timeshifting and must point to begin of the timeshift - /// buffer, otherwise. - void SetPTSBegin(int64_t ptsBegin) { m_cStructure->ptsBegin = ptsBegin; } - - /// @brief To get with @ref SetPTSBegin() changed values. - int64_t GetPTSBegin() const { return m_cStructure->ptsBegin; } - - /// @brief Latest pts player can seek forward. Value is in micro seconds, - /// relative to PTS start. For recordings, this must be the total length. For - /// Live TV, this must be zero if not timeshifting and must point to end of - /// the timeshift buffer, otherwise. - void SetPTSEnd(int64_t ptsEnd) { m_cStructure->ptsEnd = ptsEnd; } - - /// @brief To get with @ref SetPTSEnd() changed values. - int64_t GetPTSEnd() const { return m_cStructure->ptsEnd; } - ///@} - -private: - PVRStreamTimes(const PVR_STREAM_TIMES* type) : CStructHdl(type) {} - PVRStreamTimes(PVR_STREAM_TIMES* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h deleted file mode 100644 index 6e05e55b6f7a5..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h +++ /dev/null @@ -1,896 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "General.h" -#include "../../AddonBase.h" -#include "../../c-api/addon-instance/pvr.h" - -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C++" Definitions group 6 - PVR timers -#ifdef __cplusplus - -namespace kodi -{ -namespace addon -{ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer class PVRTimer -/// @ingroup cpp_kodi_addon_pvr_Defs_Timer -/// @brief **PVR add-on timer type**\n -/// Representation of a timer event. -/// -/// The related values here are automatically initiated to defaults and need -/// only be set if supported and used. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help -/// -///@{ -class PVRTimer : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRTimer() - { - m_cStructure->iClientIndex = 0; - m_cStructure->state = PVR_TIMER_STATE_NEW; - m_cStructure->iTimerType = PVR_TIMER_TYPE_NONE; - m_cStructure->iParentClientIndex = 0; - m_cStructure->iClientChannelUid = PVR_TIMER_VALUE_NOT_AVAILABLE; - m_cStructure->startTime = 0; - m_cStructure->endTime = 0; - m_cStructure->bStartAnyTime = false; - m_cStructure->bEndAnyTime = false; - m_cStructure->bFullTextEpgSearch = false; - m_cStructure->iPriority = PVR_TIMER_VALUE_NOT_AVAILABLE; - m_cStructure->iLifetime = PVR_TIMER_VALUE_NOT_AVAILABLE; - m_cStructure->iMaxRecordings = PVR_TIMER_VALUE_NOT_AVAILABLE; - m_cStructure->iRecordingGroup = 0; - m_cStructure->firstDay = 0; - m_cStructure->iWeekdays = PVR_WEEKDAY_NONE; - m_cStructure->iPreventDuplicateEpisodes = 0; - m_cStructure->iEpgUid = 0; - m_cStructure->iMarginStart = 0; - m_cStructure->iMarginEnd = 0; - m_cStructure->iGenreType = PVR_TIMER_VALUE_NOT_AVAILABLE; - m_cStructure->iGenreSubType = PVR_TIMER_VALUE_NOT_AVAILABLE; - } - PVRTimer(const PVRTimer& data) : CStructHdl(data) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Client index** | `unsigned int` | @ref PVRTimer::SetClientIndex "SetClientIndex" | @ref PVRTimer::GetClientIndex "GetClientIndex" | *required to set* - /// | **State** | @ref PVR_TIMER_STATE | @ref PVRTimer::SetState "SetState" | @ref PVRTimer::GetState "GetState" | *required to set* - /// | **Type** | `unsigned int` | @ref PVRTimer::SetTimerType "SetTimerType" | @ref PVRTimer::GetTimerType "GetTimerType" | *required to set* - /// | **Title** | `std::string` | @ref PVRTimer::SetTitle "SetTitle" | @ref PVRTimer::GetTitle "GetTitle" | *required to set* - /// | **Parent client index** | `unsigned int` | @ref PVRTimer::SetParentClientIndex "SetParentClientIndex" | @ref PVRTimer::GetParentClientIndex "GetParentClientIndex" | *optional* - /// | **Client channel unique identifier** | `int` | @ref PVRTimer::SetClientChannelUid "SetClientChannelUid" | @ref PVRTimer::GetClientChannelUid "GetClientChannelUid" | *optional* - /// | **Start time** | `time_t` | @ref PVRTimer::SetStartTime "SetStartTime" | @ref PVRTimer::GetStartTime "GetStartTime" | *optional* - /// | **End time** | `time_t` | @ref PVRTimer::SetEndTime "SetEndTime" | @ref PVRTimer::GetEndTime "GetEndTime" | *optional* - /// | **Start any time** | `bool` | @ref PVRTimer::SetStartAnyTime "SetStartAnyTime" | @ref PVRTimer::GetStartAnyTime "GetStartAnyTime" | *optional* - /// | **End any time** | `bool` | @ref PVRTimer::SetEndAnyTime "SetEndAnyTime" | @ref PVRTimer::GetEndAnyTime "GetEndAnyTime" | *optional* - /// | **EPG search string** | `std::string` | @ref PVRTimer::SetEPGSearchString "SetEPGSearchString" | @ref PVRTimer::GetEPGSearchString "GetEPGSearchString" | *optional* - /// | **Full text EPG search** | `bool` | @ref PVRTimer::SetFullTextEpgSearch "SetFullTextEpgSearch" | @ref PVRTimer::GetFullTextEpgSearch "GetFullTextEpgSearch" | *optional* - /// | **Recording store directory** | `std::string` | @ref PVRTimer::SetDirectory "SetDirectory" | @ref PVRTimer::GetDirectory "GetDirectory" | *optional* - /// | **Timer priority** | `int` | @ref PVRTimer::SetPriority "SetPriority" | @ref PVRTimer::GetPriority "GetPriority" | *optional* - /// | **Timer lifetime** | `int` | @ref PVRTimer::SetLifetime "SetLifetime" | @ref PVRTimer::GetLifetime "GetLifetime" | *optional* - /// | **Max recordings** | `int` | @ref PVRTimer::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimer::GetMaxRecordings "GetMaxRecordings" | *optional* - /// | **Recording group** | `unsigned int` | @ref PVRTimer::SetRecordingGroup "SetRecordingGroup" | @ref PVRTimer::GetRecordingGroup "GetRecordingGroup" | *optional* - /// | **First start day** | `time_t` | @ref PVRTimer::SetFirstDay "SetFirstDay" | @ref PVRTimer::GetFirstDay "GetFirstDay" | *optional* - /// | **Used timer weekdays** | `unsigned int` | @ref PVRTimer::SetWeekdays "SetWeekdays" | @ref PVRTimer::GetWeekdays "GetWeekdays" | *optional* - /// | **Prevent duplicate episodes** | `unsigned int` | @ref PVRTimer::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimer::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional* - /// | **EPG unique identifier** | `unsigned int` | @ref PVRTimer::SetEPGUid "SetEPGUid" | @ref PVRTimer::GetEPGUid "GetEPGUid" | *optional* - /// | **Margin start** | `unsigned int` | @ref PVRTimer::SetMarginStart "SetMarginStart" | @ref PVRTimer::GetMarginStart "GetMarginStart" | *optional* - /// | **Margin end** | `unsigned int` | @ref PVRTimer::SetMarginEnd "SetMarginEnd" | @ref PVRTimer::GetMarginEnd "GetMarginEnd" | *optional* - /// | **Genre type** | `int` | @ref PVRTimer::SetGenreType "SetGenreType" | @ref PVRTimer::GetGenreType "GetGenreType" | *optional* - /// | **Genre sub type** | `int` | @ref PVRTimer::SetGenreSubType "SetGenreSubType" | @ref PVRTimer::GetGenreSubType "GetGenreSubType" | *optional* - /// | **Series link** | `std::string` | @ref PVRTimer::SetSeriesLink "SetSeriesLink" | @ref PVRTimer::GetSeriesLink "GetSeriesLink" | *optional* - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer - ///@{ - - /// @brief **required**\n - /// The index of this timer given by the client. - /// - /// @ref PVR_TIMER_NO_CLIENT_INDEX indicates that the index was not yet set - /// by the client, for example for new timers created by Kodi and passed the - /// first time to the client. A valid index must be greater than - /// @ref PVR_TIMER_NO_CLIENT_INDEX. - /// - void SetClientIndex(unsigned int clientIndex) { m_cStructure->iClientIndex = clientIndex; } - - /// @brief To get with @ref SetClientIndex changed values. - unsigned int GetClientIndex() const { return m_cStructure->iClientIndex; } - - /// @brief **required**\n - /// The state of this timer. - /// - /// @note @ref PVR_TIMER_STATE_NEW is default. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRTimer tag; - /// tag.SetState(PVR_TIMER_STATE_RECORDING); - /// ~~~~~~~~~~~~~ - /// - void SetState(PVR_TIMER_STATE state) { m_cStructure->state = state; } - - /// @brief To get with @ref SetState changed values. - PVR_TIMER_STATE GetState() const { return m_cStructure->state; } - - /// @brief **required**\n - /// The type of this timer. - /// - /// It is private to the addon and can be freely defined by the addon. - /// The value must be greater than @ref PVR_TIMER_TYPE_NONE. - /// - /// Kodi does not interpret this value (except for checking for @ref PVR_TIMER_TYPE_NONE), - /// but will pass the right id to the addon with every @ref PVRTimer instance, - /// thus the addon easily can determine the timer type. - /// - /// @note @ref PVR_TIMER_TYPE_NONE is default. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRTimer tag; - /// tag.SetTimerType(123); - /// ~~~~~~~~~~~~~ - /// - void SetTimerType(unsigned int timerType) { m_cStructure->iTimerType = timerType; } - - /// @brief To get with @ref SetTimerType changed values. - unsigned int GetTimerType() const { return m_cStructure->iTimerType; } - - /// @brief **required**\n - /// A title for this timer. - void SetTitle(const std::string& title) - { - strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1); - } - - /// @brief To get with @ref SetTitle changed values. - std::string GetTitle() const { return m_cStructure->strTitle; } - - /// @brief **optional**\n - /// For timers scheduled by a repeating timer. - /// - /// The index of the repeating timer that scheduled this timer (it's - /// @ref clientIndex value). Use @ref PVR_TIMER_NO_PARENT to indicate that - /// this timer was no scheduled by a repeating timer. - void SetParentClientIndex(unsigned int parentClientIndex) - { - m_cStructure->iParentClientIndex = parentClientIndex; - } - - /// @brief To get with @ref SetParentClientIndex changed values. - unsigned int GetParentClientIndex() const { return m_cStructure->iParentClientIndex; } - - /// @brief **optional**\n - /// Unique identifier of the channel to record on. - /// - /// @ref PVR_TIMER_ANY_CHANNEL will denote "any channel", not a specific one. - /// @ref PVR_CHANNEL_INVALID_UID denotes that channel uid is not available. - void SetClientChannelUid(int clientChannelUid) - { - m_cStructure->iClientChannelUid = clientChannelUid; - } - - /// @brief To get with @ref SetClientChannelUid changed values - int GetClientChannelUid() const { return m_cStructure->iClientChannelUid; } - - /// @brief **optional**\n - /// Start time of the recording in UTC. - /// - /// Instant timers that are sent to the add-on by Kodi will have this value - /// set to 0. - void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } - - /// @brief To get with @ref SetStartTime changed values. - time_t GetStartTime() const { return m_cStructure->startTime; } - - /// @brief **optional**\n - /// End time of the recording in UTC. - void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; } - - /// @brief To get with @ref SetEndTime changed values. - time_t GetEndTime() const { return m_cStructure->endTime; } - - /// @brief **optional**\n - /// For EPG based (not Manual) timers indicates startTime does not apply. - /// - /// Default = false. - void SetStartAnyTime(bool startAnyTime) { m_cStructure->bStartAnyTime = startAnyTime; } - - /// @brief To get with @ref SetStartAnyTime changed values. - bool GetStartAnyTime() const { return m_cStructure->bStartAnyTime; } - - /// @brief **optional**\n - /// For EPG based (not Manual) timers indicates endTime does not apply. - /// - /// Default = false - void SetEndAnyTime(bool endAnyTime) { m_cStructure->bEndAnyTime = endAnyTime; } - - /// @brief To get with @ref SetEndAnyTime changed values. - bool GetEndAnyTime() const { return m_cStructure->bEndAnyTime; } - - /// @brief **optional**\n - /// A string used to search epg data for repeating epg-based timers. - /// - /// Format is backend-dependent, for example regexp. - void SetEPGSearchString(const std::string& epgSearchString) - { - strncpy(m_cStructure->strEpgSearchString, epgSearchString.c_str(), - sizeof(m_cStructure->strEpgSearchString) - 1); - } - - /// @brief To get with @ref SetEPGSearchString changed values - std::string GetEPGSearchString() const { return m_cStructure->strEpgSearchString; } - - /// @brief **optional**\n - /// Indicates, whether @ref SetEPGSearchString() is to match against the epg - /// episode title only or also against "other" epg data (backend-dependent). - void SetFullTextEpgSearch(bool fullTextEpgSearch) - { - m_cStructure->bFullTextEpgSearch = fullTextEpgSearch; - } - - /// @brief To get with @ref SetFullTextEpgSearch changed values. - bool GetFullTextEpgSearch() const { return m_cStructure->bFullTextEpgSearch; } - - /// @brief **optional**\n - /// The (relative) directory where the recording will be stored in. - void SetDirectory(const std::string& directory) - { - strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1); - } - - /// @brief To get with @ref SetDirectory changed values. - std::string GetDirectory() const { return m_cStructure->strDirectory; } - - /// @brief **optional**\n - /// The summary for this timer. - void SetSummary(const std::string& summary) - { - strncpy(m_cStructure->strSummary, summary.c_str(), sizeof(m_cStructure->strSummary) - 1); - } - - /// @brief To get with @ref SetDirectory changed values. - std::string GetSummary() const { return m_cStructure->strSummary; } - - /// @brief **optional**\n - /// The priority of this timer. - void SetPriority(int priority) { m_cStructure->iPriority = priority; } - - /// @brief To get with @ref SetPriority changed values. - int GetPriority() const { return m_cStructure->iPriority; } - - /// @brief **optional**\n - /// Lifetime of recordings created by this timer. - /// - /// Value > 0 days after which recordings will be deleted by the backend, < 0 - /// addon defined integer list reference, == 0 disabled. - void SetLifetime(int priority) { m_cStructure->iLifetime = priority; } - - /// @brief To get with @ref SetLifetime changed values. - int GetLifetime() const { return m_cStructure->iLifetime; } - - /// @brief **optional**\n - /// Maximum number of recordings this timer shall create. - /// - /// Value > 0 number of recordings, < 0 addon defined integer list reference, == 0 disabled. - void SetMaxRecordings(int maxRecordings) { m_cStructure->iMaxRecordings = maxRecordings; } - - /// @brief To get with @ref SetMaxRecordings changed values. - int GetMaxRecordings() const { return m_cStructure->iMaxRecordings; } - - /// @brief **optional**\n - /// Integer ref to addon/backend defined list of recording groups. - void SetRecordingGroup(unsigned int recordingGroup) - { - m_cStructure->iRecordingGroup = recordingGroup; - } - - /// @brief To get with @ref SetRecordingGroup changed values. - unsigned int GetRecordingGroup() const { return m_cStructure->iRecordingGroup; } - - /// @brief **optional**\n - /// The first day this timer is active, for repeating timers. - void SetFirstDay(time_t firstDay) { m_cStructure->firstDay = firstDay; } - - /// @brief To get with @ref SetFirstDay changed values. - time_t GetFirstDay() const { return m_cStructure->firstDay; } - - /// @brief **optional**\n - /// Week days, for repeating timers (see - /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVR_WEEKDAY "PVR_WEEKDAY_*" constant values) - /// - /// @note @ref PVR_WEEKDAY_NONE is default. - /// - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// kodi::addon::PVRTimer tag; - /// tag.SetWeekdays(PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_SATURDAY); - /// ... - /// ~~~~~~~~~~~~~ - void SetWeekdays(unsigned int weekdays) { m_cStructure->iWeekdays = weekdays; } - - /// @brief To get with @ref SetFirstDay changed values. - unsigned int GetWeekdays() const { return m_cStructure->iWeekdays; } - - /// @brief **optional**\n - /// Prevent duplicate episodes. - /// - /// Should 1 if backend should only record new episodes in case of a repeating - /// epg-based timer, 0 if all episodes shall be recorded (no duplicate detection). - /// - /// Actual algorithm for duplicate detection is defined by the backend. - /// Addons may define own values for different duplicate detection - /// algorithms, thus this is not just a bool. - void SetPreventDuplicateEpisodes(unsigned int preventDuplicateEpisodes) - { - m_cStructure->iPreventDuplicateEpisodes = preventDuplicateEpisodes; - } - - /// @brief To get with @ref SetPreventDuplicateEpisodes changed values. - unsigned int GetPreventDuplicateEpisodes() const - { - return m_cStructure->iPreventDuplicateEpisodes; - } - - /// @brief **optional**\n - /// EPG event id associated with this timer. Event ids must be unique for a - /// channel. - /// - /// Valid ids must be greater than @ref EPG_TAG_INVALID_UID. - void SetEPGUid(unsigned int epgUid) { m_cStructure->iEpgUid = epgUid; } - - /// @brief To get with @ref SetEPGUid changed values. - unsigned int GetEPGUid() const { return m_cStructure->iEpgUid; } - - /// @brief **optional**\n - /// If set, the backend starts the recording selected minutes before - /// @ref SetStartTime. - void SetMarginStart(unsigned int marginStart) { m_cStructure->iMarginStart = marginStart; } - - /// @brief To get with @ref SetMarginStart changed values. - unsigned int GetMarginStart() const { return m_cStructure->iMarginStart; } - - /// @brief **optional**\n - /// If set, the backend ends the recording selected minutes after - /// @ref SetEndTime. - void SetMarginEnd(unsigned int marginEnd) { m_cStructure->iMarginEnd = marginEnd; } - - /// @brief To get with @ref SetMarginEnd changed values. - unsigned int GetMarginEnd() const { return m_cStructure->iMarginEnd; } - - /// @brief **optional**\n - /// Genre type. - /// - /// @copydetails EPG_EVENT_CONTENTMASK - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// kodi::addon::PVRTimer tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); - /// ... - /// ~~~~~~~~~~~~~ - /// - /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) - /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here - /// with backend value. - /// - void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } - - /// @brief To get with @ref SetGenreType changed values. - int GetGenreType() const { return m_cStructure->iGenreType; } - - /// @brief **optional**\n - /// Genre sub type. - /// - /// @copydetails EPG_EVENT_CONTENTMASK - /// - /// Subtypes groups related to set by @ref SetGenreType: - /// | Main genre type | List with available sub genre types - /// |-----------------|----------------------------------------- - /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 - /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA - /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS - /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW - /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS - /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH - /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE - /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE - /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS - /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE - /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES - /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL - /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you - /// - /// -------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// kodi::addon::PVRTimer tag; - /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); - /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); - /// ... - /// ~~~~~~~~~~~~~ - /// - void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } - - /// @brief To get with @ref SetGenreType changed values. - int GetGenreSubType() const { return m_cStructure->iGenreSubType; } - - /// @brief **optional**\n - /// Series link for this timer. - /// - /// If set for an epg-based timer rule, matching events will be found by - /// checking with here, instead of @ref SetTitle() (and @ref SetFullTextEpgSearch()). - void SetSeriesLink(const std::string& seriesLink) - { - strncpy(m_cStructure->strSeriesLink, seriesLink.c_str(), - sizeof(m_cStructure->strSeriesLink) - 1); - } - - /// @brief To get with @ref SetSeriesLink changed values. - std::string GetSeriesLink() const { return m_cStructure->strSeriesLink; } - ///@} - -private: - PVRTimer(const PVR_TIMER* data) : CStructHdl(data) {} - PVRTimer(PVR_TIMER* data) : CStructHdl(data) {} -}; - -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet class PVRTimersResultSet -/// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer -/// @brief **PVR add-on timer transfer class**\n -/// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetTimers(). -/// -/// @note This becomes only be used on addon call above, not usable outside on -/// addon itself. -///@{ -class PVRTimersResultSet -{ -public: - /*! \cond PRIVATE */ - PVRTimersResultSet() = delete; - PVRTimersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) - : m_instance(instance), m_handle(handle) - { - } - /*! \endcond */ - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet - ///@{ - - /// @brief To add and give content from addon to Kodi on related call. - /// - /// @param[in] tag The to transferred data. - void Add(const kodi::addon::PVRTimer& tag) - { - m_instance->toKodi->TransferTimerEntry(m_instance->toKodi->kodiInstance, m_handle, tag); - } - - ///@} - -private: - const AddonInstance_PVR* m_instance = nullptr; - const ADDON_HANDLE m_handle; -}; -///@} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType class PVRTimerType -/// @ingroup cpp_kodi_addon_pvr_Defs_Timer -/// @brief **PVR add-on timer type**\n -/// To define the content of @ref kodi::addon::CInstancePVRClient::GetTimerTypes() -/// given groups. -/// -/// ---------------------------------------------------------------------------- -/// -/// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help -/// -///@{ -class PVRTimerType : public CStructHdl -{ - friend class CInstancePVRClient; - -public: - /*! \cond PRIVATE */ - PVRTimerType() - { - memset(m_cStructure, 0, sizeof(PVR_TIMER_TYPE)); - m_cStructure->iPrioritiesDefault = -1; - m_cStructure->iLifetimesDefault = -1; - m_cStructure->iPreventDuplicateEpisodesDefault = -1; - m_cStructure->iRecordingGroupDefault = -1; - m_cStructure->iMaxRecordingsDefault = -1; - } - PVRTimerType(const PVRTimerType& type) : CStructHdl(type) {} - /*! \endcond */ - - /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help Value Help - /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType - /// ---------------------------------------------------------------------------- - /// - /// The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType : - /// | Name | Type | Set call | Get call | Usage - /// |------|------|----------|----------|----------- - /// | **Identifier** | `unsigned int` | @ref PVRTimerType::SetId "SetId" | @ref PVRTimerType::GetId "GetId" | *required to set* - /// | **Attributes** | `unsigned int` | @ref PVRTimerType::SetAttributes "SetAttributes" | @ref PVRTimerType::GetAttributes "GetAttributes" | *required to set* - /// | **Description** | `std::string` | @ref PVRTimerType::SetDescription "SetDescription" | @ref PVRTimerType::GetDescription "GetDescription" | *optional* - /// | | | | | | - /// | **Priority selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPriorities "SetPriorities" | @ref PVRTimerType::GetPriorities "GetPriorities" | *optional* - /// | **Priority default selection** | `int`| @ref PVRTimerType::SetPrioritiesDefault "SetPrioritiesDefault" | @ref PVRTimerType::GetPrioritiesDefault "GetPrioritiesDefault" | *optional* - /// | | | | | | - /// | **Lifetime selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetLifetimes "SetLifetimes" | @ref PVRTimerType::GetLifetimes "GetLifetimes" | *optional* - /// | **Lifetime default selection** | `int`| @ref PVRTimerType::SetLifetimesDefault "SetLifetimesDefault" | @ref PVRTimerType::GetLifetimesDefault "GetLifetimesDefault" | *optional* - /// | | | | | | - /// | **Prevent duplicate episodes selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimerType::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional* - /// | **Prevent duplicate episodes default** | `int`| @ref PVRTimerType::SetPreventDuplicateEpisodesDefault "SetPreventDuplicateEpisodesDefault" | @ref PVRTimerType::GetPreventDuplicateEpisodesDefault "GetPreventDuplicateEpisodesDefault" | *optional* - /// | | | | | | - /// | **Recording group selection**| @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetRecordingGroups "SetRecordingGroups" | @ref PVRTimerType::GetRecordingGroups "GetRecordingGroups" | *optional* - /// | **Recording group default** | `int`| @ref PVRTimerType::SetRecordingGroupDefault "SetRecordingGroupDefault" | @ref PVRTimerType::GetRecordingGroupDefault "GetRecordingGroupDefault" | *optional* - /// | | | | | | - /// | **Max recordings selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimerType::GetMaxRecordings "GetMaxRecordings" | *optional* - /// | **Max recordings default** | `int`| @ref PVRTimerType::SetMaxRecordingsDefault "SetMaxRecordingsDefault" | @ref PVRTimerType::GetMaxRecordingsDefault "GetMaxRecordingsDefault" | *optional* - /// - - /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType - ///@{ - - /// @brief **required**\n - /// This type's identifier. Ids must be > @ref PVR_TIMER_TYPE_NONE. - void SetId(unsigned int id) { m_cStructure->iId = id; } - - /// @brief To get with @ref SetAttributes changed values. - unsigned int GetId() const { return m_cStructure->iId; } - - /// @brief **required**\n - /// Defines the attributes for this type (@ref cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_TYPE "PVR_TIMER_TYPE_*" constants). - /// - /// To defines the attributes for a type. These values are bit fields that can be - /// used together. - /// - ///-------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::addon::PVRTimerType tag; - /// tag.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_REPEATING); - /// ~~~~~~~~~~~~~ - /// - void SetAttributes(uint64_t attributes) { m_cStructure->iAttributes = attributes; } - - /// @brief To get with @ref SetAttributes changed values. - uint64_t GetAttributes() const { return m_cStructure->iAttributes; } - - /// @brief **optional**\n - /// A short localized string describing the purpose of the type. (e.g. - /// "Any time at this channel if title matches"). - /// - /// If left blank, Kodi will generate a description based on the attributes - /// REPEATING and MANUAL. (e.g. "Repeating EPG-based.") - void SetDescription(const std::string& description) - { - strncpy(m_cStructure->strDescription, description.c_str(), - sizeof(m_cStructure->strDescription) - 1); - } - - /// @brief To get with @ref SetDescription changed values. - std::string GetDescription() const { return m_cStructure->strDescription; } - - //---------------------------------------------------------------------------- - - /// @brief **optional**\n - /// Priority value definitions. - /// - /// Array containing the possible values for @ref PVRTimer::SetPriority(). - /// - /// @param[in] priorities List of priority values - /// @param[in] prioritiesDefault [opt] The default value in list, can also be - /// set by @ref SetPrioritiesDefault() - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetPriorities(const std::vector& priorities, int prioritiesDefault = -1) - { - m_cStructure->iPrioritiesSize = static_cast(priorities.size()); - for (unsigned int i = 0; - i < m_cStructure->iPrioritiesSize && i < sizeof(m_cStructure->priorities); ++i) - { - m_cStructure->priorities[i].iValue = priorities[i].GetCStructure()->iValue; - strncpy(m_cStructure->priorities[i].strDescription, - priorities[i].GetCStructure()->strDescription, - sizeof(m_cStructure->priorities[i].strDescription) - 1); - } - if (prioritiesDefault != -1) - m_cStructure->iPrioritiesDefault = prioritiesDefault; - } - - /// @brief To get with @ref SetPriorities changed values. - std::vector GetPriorities() const - { - std::vector ret; - for (unsigned int i = 0; i < m_cStructure->iPrioritiesSize; ++i) - ret.emplace_back(m_cStructure->priorities[i].iValue, - m_cStructure->priorities[i].strDescription); - return ret; - } - - /// @brief **optional**\n - /// The default value for @ref PVRTimer::SetPriority(). - /// - /// @note Must be filled if @ref SetPriorities contain values and not - /// defined there on second function value. - void SetPrioritiesDefault(int prioritiesDefault) - { - m_cStructure->iPrioritiesDefault = prioritiesDefault; - } - - /// @brief To get with @ref SetPrioritiesDefault changed values. - int GetPrioritiesDefault() const { return m_cStructure->iPrioritiesDefault; } - - //---------------------------------------------------------------------------- - - /// @brief **optional**\n - /// Lifetime value definitions. - /// - /// Array containing the possible values for @ref PVRTimer::SetLifetime(). - /// - /// @param[in] lifetimes List of lifetimes values - /// @param[in] lifetimesDefault [opt] The default value in list, can also be - /// set by @ref SetLifetimesDefault() - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetLifetimes(const std::vector& lifetimes, int lifetimesDefault = -1) - { - m_cStructure->iLifetimesSize = static_cast(lifetimes.size()); - for (unsigned int i = 0; - i < m_cStructure->iLifetimesSize && i < sizeof(m_cStructure->lifetimes); ++i) - { - m_cStructure->lifetimes[i].iValue = lifetimes[i].GetCStructure()->iValue; - strncpy(m_cStructure->lifetimes[i].strDescription, - lifetimes[i].GetCStructure()->strDescription, - sizeof(m_cStructure->lifetimes[i].strDescription) - 1); - } - if (lifetimesDefault != -1) - m_cStructure->iLifetimesDefault = lifetimesDefault; - } - - /// @brief To get with @ref SetLifetimes changed values. - std::vector GetLifetimes() const - { - std::vector ret; - for (unsigned int i = 0; i < m_cStructure->iLifetimesSize; ++i) - ret.emplace_back(m_cStructure->lifetimes[i].iValue, - m_cStructure->lifetimes[i].strDescription); - return ret; - } - - /// @brief **optional**\n - /// The default value for @ref SetLifetimes(). - /// - /// @note Must be filled if @ref SetLifetimes contain values and not - /// defined there on second function value. - void SetLifetimesDefault(int lifetimesDefault) - { - m_cStructure->iLifetimesDefault = lifetimesDefault; - } - - /// @brief To get with @ref SetLifetimesDefault changed values. - int GetLifetimesDefault() const { return m_cStructure->iLifetimesDefault; } - - //---------------------------------------------------------------------------- - - /// @brief **optional**\n - /// Prevent duplicate episodes value definitions. - /// - /// Array containing the possible values for @ref PVRTimer::SetPreventDuplicateEpisodes(). - /// - /// @note Must be filled if @ref PVRTimer::SetPreventDuplicateEpisodes() is not empty. - /// - /// @param[in] preventDuplicateEpisodes List of duplicate episodes values - /// @param[in] preventDuplicateEpisodesDefault [opt] The default value in list, can also be - /// set by @ref SetPreventDuplicateEpisodesDefault() - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetPreventDuplicateEpisodes( - const std::vector& preventDuplicateEpisodes, - int preventDuplicateEpisodesDefault = -1) - { - m_cStructure->iPreventDuplicateEpisodesSize = - static_cast(preventDuplicateEpisodes.size()); - for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize && - i < sizeof(m_cStructure->preventDuplicateEpisodes); - ++i) - { - m_cStructure->preventDuplicateEpisodes[i].iValue = - preventDuplicateEpisodes[i].GetCStructure()->iValue; - strncpy(m_cStructure->preventDuplicateEpisodes[i].strDescription, - preventDuplicateEpisodes[i].GetCStructure()->strDescription, - sizeof(m_cStructure->preventDuplicateEpisodes[i].strDescription) - 1); - } - if (preventDuplicateEpisodesDefault != -1) - m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault; - } - - /// @brief To get with @ref SetPreventDuplicateEpisodes changed values. - std::vector GetPreventDuplicateEpisodes() const - { - std::vector ret; - for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize; ++i) - ret.emplace_back(m_cStructure->preventDuplicateEpisodes[i].iValue, - m_cStructure->preventDuplicateEpisodes[i].strDescription); - return ret; - } - - /// @brief **optional**\n - /// The default value for @ref PVRTimer::SetPreventDuplicateEpisodes(). - /// - /// @note Must be filled if @ref SetPreventDuplicateEpisodes contain values and not - /// defined there on second function value. - void SetPreventDuplicateEpisodesDefault(int preventDuplicateEpisodesDefault) - { - m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault; - } - - /// @brief To get with @ref SetPreventDuplicateEpisodesDefault changed values. - int GetPreventDuplicateEpisodesDefault() const - { - return m_cStructure->iPreventDuplicateEpisodesDefault; - } - - //---------------------------------------------------------------------------- - - /// @brief **optional**\n - /// Array containing the possible values of @ref PVRTimer::SetRecordingGroup() - /// - /// @param[in] recordingGroup List of recording group values - /// @param[in] recordingGroupDefault [opt] The default value in list, can also be - /// set by @ref SetRecordingGroupDefault() - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetRecordingGroups(const std::vector& recordingGroup, - int recordingGroupDefault = -1) - { - m_cStructure->iRecordingGroupSize = static_cast(recordingGroup.size()); - for (unsigned int i = 0; - i < m_cStructure->iRecordingGroupSize && i < sizeof(m_cStructure->recordingGroup); ++i) - { - m_cStructure->recordingGroup[i].iValue = recordingGroup[i].GetCStructure()->iValue; - strncpy(m_cStructure->recordingGroup[i].strDescription, - recordingGroup[i].GetCStructure()->strDescription, - sizeof(m_cStructure->recordingGroup[i].strDescription) - 1); - } - if (recordingGroupDefault != -1) - m_cStructure->iRecordingGroupDefault = recordingGroupDefault; - } - - /// @brief To get with @ref SetRecordingGroups changed values - std::vector GetRecordingGroups() const - { - std::vector ret; - for (unsigned int i = 0; i < m_cStructure->iRecordingGroupSize; ++i) - ret.emplace_back(m_cStructure->recordingGroup[i].iValue, - m_cStructure->recordingGroup[i].strDescription); - return ret; - } - - /// @brief **optional**\n - /// The default value for @ref PVRTimer::SetRecordingGroup(). - /// - /// @note Must be filled if @ref SetRecordingGroups contain values and not - /// defined there on second function value. - void SetRecordingGroupDefault(int recordingGroupDefault) - { - m_cStructure->iRecordingGroupDefault = recordingGroupDefault; - } - - /// @brief To get with @ref SetRecordingGroupDefault changed values - int GetRecordingGroupDefault() const { return m_cStructure->iRecordingGroupDefault; } - - //---------------------------------------------------------------------------- - - /// @brief **optional**\n - /// Array containing the possible values of @ref PVRTimer::SetMaxRecordings(). - /// - /// @param[in] maxRecordings List of lifetimes values - /// @param[in] maxRecordingsDefault [opt] The default value in list, can also be - /// set by @ref SetMaxRecordingsDefault() - /// - /// -------------------------------------------------------------------------- - /// - /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help - void SetMaxRecordings(const std::vector& maxRecordings, - int maxRecordingsDefault = -1) - { - m_cStructure->iMaxRecordingsSize = static_cast(maxRecordings.size()); - for (unsigned int i = 0; - i < m_cStructure->iMaxRecordingsSize && i < sizeof(m_cStructure->maxRecordings); ++i) - { - m_cStructure->maxRecordings[i].iValue = maxRecordings[i].GetCStructure()->iValue; - strncpy(m_cStructure->maxRecordings[i].strDescription, - maxRecordings[i].GetCStructure()->strDescription, - sizeof(m_cStructure->maxRecordings[i].strDescription) - 1); - } - if (maxRecordingsDefault != -1) - m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault; - } - - /// @brief To get with @ref SetMaxRecordings changed values - std::vector GetMaxRecordings() const - { - std::vector ret; - for (unsigned int i = 0; i < m_cStructure->iMaxRecordingsSize; ++i) - ret.emplace_back(m_cStructure->maxRecordings[i].iValue, - m_cStructure->maxRecordings[i].strDescription); - return ret; - } - - /// @brief **optional**\n - /// The default value for @ref SetMaxRecordings(). - /// - /// Can be set with here if on @ref SetMaxRecordings not given as second value. - void SetMaxRecordingsDefault(int maxRecordingsDefault) - { - m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault; - } - - /// @brief To get with @ref SetMaxRecordingsDefault changed values - int GetMaxRecordingsDefault() const { return m_cStructure->iMaxRecordingsDefault; } - ///@} - -private: - PVRTimerType(const PVR_TIMER_TYPE* type) : CStructHdl(type) {} - PVRTimerType(PVR_TIMER_TYPE* type) : CStructHdl(type) {} -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace addon */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/CMakeLists.txt index 091e0fe5b824e..13ddea8d7d6f1 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/CMakeLists.txt @@ -1,13 +1,16 @@ -set(HEADERS addon_base.h - audio_engine.h - filesystem.h - general.h - network.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(CORE_SYSTEM_NAME STREQUAL android) - list(APPEND SOURCES platform/android/system.h) -endif() +set(HEADERS + addon_base.h + audio_engine.h + filesystem.h + general.h + monitor.h + network.h + version.h +) -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api) +if(HEADERS) + core_add_devkit_header(kodi_c-api) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt index b5d0382e8c528..fd11ddf7b566d 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/CMakeLists.txt @@ -1,15 +1,20 @@ -set(HEADERS audio_decoder.h - audio_encoder.h - game.h - image_decoder.h - inputstream.h - peripheral.h - pvr.h - screensaver.h - vfs.h - video_codec.h - visualization.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_addon-instance) +set(HEADERS + audiodecoder.h + audioencoder.h + game.h + imagedecoder.h + inputstream.h + peripheral.h + pvr.h + screensaver.h + vfs.h + videocodec.h + visualization.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_addon-instance) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_decoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_decoder.h deleted file mode 100644 index be6ad16d12902..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_decoder.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_ADDONINSTANCE_AUDIO_DECODER_H -#define C_API_ADDONINSTANCE_AUDIO_DECODER_H - -#include "../addon_base.h" -#include "../audio_engine.h" - -#define AUDIO_DECODER_LYRICS_SIZE 65535 - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - // WARNING About size use malloc/new! - struct AUDIO_DECODER_INFO_TAG - { - char title[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char artist[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char album[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char album_artist[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char media_type[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char genre[ADDON_STANDARD_STRING_LENGTH_SMALL]; - int duration; - int track; - int disc; - char disc_subtitle[ADDON_STANDARD_STRING_LENGTH_SMALL]; - int disc_total; - char release_date[ADDON_STANDARD_STRING_LENGTH_SMALL]; - char lyrics[AUDIO_DECODER_LYRICS_SIZE]; - int samplerate; - int channels; - int bitrate; - char comment[ADDON_STANDARD_STRING_LENGTH]; - }; - - typedef struct AddonProps_AudioDecoder - { - int dummy; - } AddonProps_AudioDecoder; - - typedef struct AddonToKodiFuncTable_AudioDecoder - { - KODI_HANDLE kodiInstance; - } AddonToKodiFuncTable_AudioDecoder; - - struct AddonInstance_AudioDecoder; - typedef struct KodiToAddonFuncTable_AudioDecoder - { - KODI_HANDLE addonInstance; - bool(__cdecl* init)(const struct AddonInstance_AudioDecoder* instance, - const char* file, - unsigned int filecache, - int* channels, - int* samplerate, - int* bitspersample, - int64_t* totaltime, - int* bitrate, - enum AudioEngineDataFormat* format, - const enum AudioEngineChannel** info); - int(__cdecl* read_pcm)(const struct AddonInstance_AudioDecoder* instance, - uint8_t* buffer, - int size, - int* actualsize); - int64_t(__cdecl* seek)(const struct AddonInstance_AudioDecoder* instance, int64_t time); - bool(__cdecl* read_tag)(const struct AddonInstance_AudioDecoder* instance, - const char* file, - struct AUDIO_DECODER_INFO_TAG* tag); - int(__cdecl* track_count)(const struct AddonInstance_AudioDecoder* instance, const char* file); - } KodiToAddonFuncTable_AudioDecoder; - - typedef struct AddonInstance_AudioDecoder - { - struct AddonProps_AudioDecoder* props; - struct AddonToKodiFuncTable_AudioDecoder* toKodi; - struct KodiToAddonFuncTable_AudioDecoder* toAddon; - } AddonInstance_AudioDecoder; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !C_API_ADDONINSTANCE_AUDIO_DECODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_encoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_encoder.h deleted file mode 100644 index b9f2ab5e5f467..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audio_encoder.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_ADDONINSTANCE_AUDIO_ENCODER_H -#define C_API_ADDONINSTANCE_AUDIO_ENCODER_H - -#include "../addon_base.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - typedef struct AddonProps_AudioEncoder - { - int dummy; - } AddonProps_AudioEncoder; - - typedef struct AddonToKodiFuncTable_AudioEncoder - { - KODI_HANDLE kodiInstance; - int (*write)(KODI_HANDLE kodiInstance, const uint8_t* data, int len); - int64_t (*seek)(KODI_HANDLE kodiInstance, int64_t pos, int whence); - } AddonToKodiFuncTable_AudioEncoder; - - struct AddonInstance_AudioEncoder; - typedef struct KodiToAddonFuncTable_AudioEncoder - { - KODI_HANDLE addonInstance; - bool(__cdecl* start)(const struct AddonInstance_AudioEncoder* instance, - int in_channels, - int in_rate, - int in_bits, - const char* title, - const char* artist, - const char* albumartist, - const char* album, - const char* year, - const char* track, - const char* genre, - const char* comment, - int track_length); - int(__cdecl* encode)(const struct AddonInstance_AudioEncoder* instance, - int num_bytes_read, - const uint8_t* pbt_stream); - bool(__cdecl* finish)(const struct AddonInstance_AudioEncoder* instance); - } KodiToAddonFuncTable_AudioEncoder; - - typedef struct AddonInstance_AudioEncoder - { - struct AddonProps_AudioEncoder* props; - struct AddonToKodiFuncTable_AudioEncoder* toKodi; - struct KodiToAddonFuncTable_AudioEncoder* toAddon; - } AddonInstance_AudioEncoder; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !C_API_ADDONINSTANCE_AUDIO_ENCODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h new file mode 100644 index 0000000000000..0b9649ea5e4bf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_ADDONINSTANCE_AUDIODECODER_H +#define C_API_ADDONINSTANCE_AUDIODECODER_H + +#include "../addon_base.h" +#include "../audio_engine.h" + +//============================================================================ +/// @ingroup cpp_kodi_addon_audiodecoder_Defs +/// @brief Identifier which is attached to stream files and with defined names +/// in addon.xml (`name="???"`) if addon supports "tracks" (set in addon.xml +/// `tracks="true"`). +/// +/// @note This macro is largely unnecessary to use directly on the addon, +/// addon can use the @ref KODI_ADDON_AUDIODECODER_GET_TRACK_EXT around its +/// associated name. +/// +///@{ +#define KODI_ADDON_AUDIODECODER_TRACK_EXT "_adecstrm" +///@} +//---------------------------------------------------------------------------- + +//============================================================================ +/// @ingroup cpp_kodi_addon_audiodecoder_Defs +/// @brief Macro to get file extension to track supported files. +/// +/// This macro can be used if `tracks="true"` is set in addon.xml, in this +/// case the addon.xml field `name="???"` is used to identify stream. +/// Which must then also be used for here. +/// +///@{ +#define KODI_ADDON_AUDIODECODER_GET_TRACK_EXT(name) "." name KODI_ADDON_AUDIODECODER_TRACK_EXT +///@} +//---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if __KODI_API__ >= 1 + + typedef void* KODI_ADDON_AUDIODECODER_HDL; + + //============================================================================ + /// @defgroup cpp_kodi_addon_audiodecoder_Defs_AUDIODECODER_READ_RETURN enum AUDIODECODER_READ_RETURN + /// @ingroup cpp_kodi_addon_audiodecoder_Defs + /// @brief **Return value about** @ref kodi::addon::CInstanceAudioDecoder::ReadPCM() + /// + /// Possible values are: + /// | Value | enum | Description + /// |:-----:|:-------------------------------|:-------------------------- + /// | 0 | @ref AUDIODECODER_READ_SUCCESS | on success + /// | -1 | @ref AUDIODECODER_READ_EOF | on end of stream + /// | 1 | @ref AUDIODECODER_READ_ERROR | on failure + /// + ///@{ + typedef enum AUDIODECODER_READ_RETURN + { + /// @brief On end of stream + AUDIODECODER_READ_EOF = -1, + + /// @brief On success + AUDIODECODER_READ_SUCCESS = 0, + + /// @brief On failure + AUDIODECODER_READ_ERROR = 1 + } AUDIODECODER_READ_RETURN; + ///@} + //---------------------------------------------------------------------------- + + struct KODI_ADDON_AUDIODECODER_INFO_TAG + { + char* title; + char* artist; + char* album; + char* album_artist; + char* media_type; + char* genre; + int duration; + int track; + int disc; + char* disc_subtitle; + int disc_total; + char* release_date; + char* lyrics; + int samplerate; + int channels; + int bitrate; + char* comment; + char* cover_art_path; + char* cover_art_mem_mimetype; +// uint8_t* cover_art_mem; + size_t cover_art_mem_size; + }; + + typedef KODI_ADDON_AUDIODECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CREATE_V1)( + KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1)( + KODI_ADDON_AUDIODECODER_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_INIT_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + unsigned int filecache, + int* channels, + int* samplerate, + int* bitspersample, + int64_t* totaltime, + int* bitrate, + enum AudioEngineDataFormat* format, + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, uint8_t* buffer, size_t size, size_t* actualsize); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SEEK_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( + const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + + typedef struct KODI_ADDON_AUDIODECODER_FUNC + { + PFN_KODI_ADDON_AUDIODECODER_CREATE_V1 create; + PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1 destroy; + PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1 can_operate_file; + PFN_KODI_ADDON_AUDIODECODER_INIT_V1 init; + PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1 read_pcm; + PFN_KODI_ADDON_AUDIODECODER_SEEK_V1 seek; + PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1 read_tag; + PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1 track_count; + } KODI_ADDON_AUDIODECODER_FUNC; + +#endif /* __KODI_API__ >= 1 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_AUDIODECODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audioencoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audioencoder.h new file mode 100644 index 0000000000000..ff66541bbc104 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audioencoder.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_ADDONINSTANCE_AUDIOENCODER_H +#define C_API_ADDONINSTANCE_AUDIOENCODER_H + +#include "../addon_base.h" + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + typedef void* KODI_ADDON_AUDIOENCODER_HDL; + + struct AUDIOENCODER_INFO_TAG + { + const char* title; + const char* artist; + const char* album; + const char* album_artist; + const char* media_type; + const char* genre; + int duration; + int track; + int disc; + const char* disc_subtitle; + int disc_total; + const char* release_date; + const char* lyrics; + int samplerate; + int channels; + int bits_per_sample; + int track_length; + const char* comment; + }; + + typedef KODI_ADDON_AUDIOENCODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct AUDIOENCODER_INFO_TAG* tag); + typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, + const uint8_t* pbt_stream, + size_t num_bytes_read); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + + typedef struct KODI_ADDON_AUDIOENCODER_FUNC + { + PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1 create; + PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1 destroy; + PFN_KODI_ADDON_AUDIOENCODER_START_V1 start; + PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1 encode; + PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1 finish; + } KODI_ADDON_AUDIOENCODER_FUNC; + + ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_OWN_HDL hdl, + const uint8_t* data, size_t len) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_OWN_HDL hdl, size_t pos, int whence) __INTRODUCED_IN_KODI(1); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_AUDIOENCODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h index 97448156418de..8c45ad35a4b22 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h @@ -1,17 +1,20 @@ /* - * Copyright (C) 2014-2020 Team Kodi + * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ +/*---AUTO_GEN_PARSE---*/ + #ifndef C_API_ADDONINSTANCE_GAME_H #define C_API_ADDONINSTANCE_GAME_H #include "../addon_base.h" -#include /* size_t */ +#include +#include //============================================================================== /// @ingroup cpp_kodi_addon_game_Defs @@ -24,771 +27,269 @@ extern "C" { #endif /* __cplusplus */ - //============================================================================ - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Game add-on error codes** - /// - /// Used as return values on most Game related functions. - /// + typedef void* KODI_ADDON_GAME_HDL; + typedef enum GAME_ERROR { - /// @brief no error occurred GAME_ERROR_NO_ERROR, - - /// @brief an unknown error occurred GAME_ERROR_UNKNOWN, - - /// @brief the method that the frontend called is not implemented GAME_ERROR_NOT_IMPLEMENTED, - - /// @brief the command was rejected by the game client GAME_ERROR_REJECTED, - - /// @brief the parameters of the method that was called are invalid for this operation GAME_ERROR_INVALID_PARAMETERS, - - /// @brief the command failed GAME_ERROR_FAILED, - - /// @brief no game is loaded GAME_ERROR_NOT_LOADED, - - /// @brief game requires restricted resources GAME_ERROR_RESTRICTED, } GAME_ERROR; - //---------------------------------------------------------------------------- - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_AudioStream 1. Audio stream - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **The for Audio stream used data system** - /// - /// Used to give Addon currently used audio stream configuration on Kodi and - /// arrays to give related data to Kodi on callbacks. - /// - ///@{ - //============================================================================ - /// @brief **Stream Format** - /// - /// From Kodi requested specified audio sample format. - /// typedef enum GAME_PCM_FORMAT { GAME_PCM_FORMAT_UNKNOWN, - - /// @brief S16NE sample format GAME_PCM_FORMAT_S16NE, } GAME_PCM_FORMAT; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Audio channel** - /// - /// Channel identification flags. - /// typedef enum GAME_AUDIO_CHANNEL { - /// @brief Channel list terminator GAME_CH_NULL, - - /// @brief Channel front left GAME_CH_FL, - - /// @brief Channel front right GAME_CH_FR, - - /// @brief Channel front center GAME_CH_FC, - - /// @brief Channel Low Frequency Effects / Subwoofer GAME_CH_LFE, - - /// @brief Channel back left GAME_CH_BL, - - /// @brief Channel back right GAME_CH_BR, - - /// @brief Channel front left over center GAME_CH_FLOC, - - /// @brief Channel front right over center GAME_CH_FROC, - - /// @brief Channel back center GAME_CH_BC, - - /// @brief Channel surround/side left GAME_CH_SL, - - /// @brief Channel surround/side right GAME_CH_SR, - - /// @brief Channel top front left GAME_CH_TFL, - - /// @brief Channel top front right GAME_CH_TFR, - - /// @brief Channel top front center GAME_CH_TFC, - - /// @brief Channel top center GAME_CH_TC, - - /// @brief Channel top back left GAME_CH_TBL, - - /// @brief Channel top back right GAME_CH_TBR, - - /// @brief Channel top back center GAME_CH_TBC, - - /// @brief Channel bacl left over center GAME_CH_BLOC, - - /// @brief Channel back right over center GAME_CH_BROC, } GAME_AUDIO_CHANNEL; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Game audio stream properties** - /// - /// Used by Kodi to pass the currently required audio stream settings to the addon - /// typedef struct game_stream_audio_properties { - GAME_PCM_FORMAT format; - const GAME_AUDIO_CHANNEL* channel_map; - } ATTRIBUTE_PACKED game_stream_audio_properties; - //---------------------------------------------------------------------------- + enum GAME_PCM_FORMAT format; + const enum GAME_AUDIO_CHANNEL* channel_map; + } game_stream_audio_properties; - //============================================================================ - /// @brief **Audio stream packet** - /// - /// This packet contains audio stream data passed to Kodi. - /// typedef struct game_stream_audio_packet { - /// @brief Pointer for audio stream data given to Kodi const uint8_t* data; - - /// @brief Size of data array size_t size; - } ATTRIBUTE_PACKED game_stream_audio_packet; - //---------------------------------------------------------------------------- - - ///@} + } game_stream_audio_packet; - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_VideoStream 2. Video stream - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **The for Video stream used data system** - /// - /// Used to give Addon currently used video stream configuration on Kodi and - /// arrays to give related data to Kodi on callbacks. - /// - ///@{ - - //============================================================================ - /// @brief **Pixel format** - /// - /// From Kodi requested specified video RGB color model format. - /// typedef enum GAME_PIXEL_FORMAT { GAME_PIXEL_FORMAT_UNKNOWN, - - /// @brief 0RGB8888 Format GAME_PIXEL_FORMAT_0RGB8888, - - /// @brief RGB565 Format GAME_PIXEL_FORMAT_RGB565, - - /// @brief 0RGB1555 Format GAME_PIXEL_FORMAT_0RGB1555, } GAME_PIXEL_FORMAT; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Video rotation position** - /// - /// To define position how video becomes shown. - /// typedef enum GAME_VIDEO_ROTATION { - /// @brief 0° and Without rotation GAME_VIDEO_ROTATION_0, - - /// @brief rotate 90° counterclockwise GAME_VIDEO_ROTATION_90_CCW, - - /// @brief rotate 180° counterclockwise GAME_VIDEO_ROTATION_180_CCW, - - /// @brief rotate 270° counterclockwise GAME_VIDEO_ROTATION_270_CCW, } GAME_VIDEO_ROTATION; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Game video stream properties** - /// - /// Used by Kodi to pass the currently required video stream settings to the addon - /// typedef struct game_stream_video_properties { - /// @brief The stream's pixel format - GAME_PIXEL_FORMAT format; - - /// @brief The nominal used width + enum GAME_PIXEL_FORMAT format; unsigned int nominal_width; - - /// @brief The nominal used height unsigned int nominal_height; - - /// @brief The maximal used width unsigned int max_width; - - /// @brief The maximal used height unsigned int max_height; - - /// @brief On video stream used aspect ration - /// - /// @note If aspect_ratio is <= 0.0, an aspect ratio of nominal_width / nominal_height is assumed float aspect_ratio; - } ATTRIBUTE_PACKED game_stream_video_properties; - //---------------------------------------------------------------------------- + } game_stream_video_properties; - //============================================================================ - /// @brief **Video stream packet** - /// - /// This packet contains video stream data passed to Kodi. - /// typedef struct game_stream_video_packet { - /// @brief Video height unsigned int width; - - /// @brief Video width unsigned int height; - - /// @brief Width @ref GAME_VIDEO_ROTATION defined rotation angle. - GAME_VIDEO_ROTATION rotation; - - /// @brief Pointer for video stream data given to Kodi + enum GAME_VIDEO_ROTATION rotation; const uint8_t* data; - - /// @brief Size of data array size_t size; - } ATTRIBUTE_PACKED game_stream_video_packet; - //---------------------------------------------------------------------------- - - ///@} - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_HardwareFramebuffer 3. Hardware framebuffer stream - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Hardware framebuffer stream data** - /// - ///@{ + } game_stream_video_packet; - //============================================================================ - /// @brief **Hardware framebuffer type** - /// typedef enum GAME_HW_CONTEXT_TYPE { - /// @brief None context GAME_HW_CONTEXT_NONE, - - /// @brief OpenGL 2.x. Driver can choose to use latest compatibility context GAME_HW_CONTEXT_OPENGL, - - /// @brief OpenGL ES 2.0 GAME_HW_CONTEXT_OPENGLES2, - - /// @brief Modern desktop core GL context. Use major/minor fields to set GL version GAME_HW_CONTEXT_OPENGL_CORE, - - /// @brief OpenGL ES 3.0 GAME_HW_CONTEXT_OPENGLES3, - - /// @brief OpenGL ES 3.1+. Set major/minor fields. GAME_HW_CONTEXT_OPENGLES_VERSION, - - /// @brief Vulkan GAME_HW_CONTEXT_VULKAN } GAME_HW_CONTEXT_TYPE; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Hardware framebuffer properties** - /// typedef struct game_stream_hw_framebuffer_properties { - /// @brief The API to use. - /// - GAME_HW_CONTEXT_TYPE context_type; - - /// @brief Set if render buffers should have depth component attached. - /// - /// @todo: Obsolete - /// + enum GAME_HW_CONTEXT_TYPE context_type; bool depth; - - /// @brief Set if stencil buffers should be attached. - /// - /// If depth and stencil are true, a packed 24/8 buffer will be added. - /// Only attaching stencil is invalid and will be ignored. - /// - /// @todo: Obsolete. - /// bool stencil; - - /// @brief Use conventional bottom-left origin convention. - /// - /// If false, standard top-left origin semantics are used. - /// - /// @todo: Move to GL specific interface - /// bool bottom_left_origin; - - /// @brief Major version number for core GL context or GLES 3.1+. unsigned int version_major; - - /// @brief Minor version number for core GL context or GLES 3.1+. unsigned int version_minor; - - /// @brief If this is true, the frontend will go very far to avoid resetting context - /// in scenarios like toggling fullscreen, etc. - /// - /// @todo: Obsolete? Maybe frontend should just always assume this... - /// - /// The reset callback might still be called in extreme situations such as if - /// the context is lost beyond recovery. - /// - /// For optimal stability, set this to false, and allow context to be reset at - /// any time. - /// bool cache_context; - - /// @brief Creates a debug context. bool debug_context; - } ATTRIBUTE_PACKED game_stream_hw_framebuffer_properties; - //---------------------------------------------------------------------------- + } game_stream_hw_framebuffer_properties; - //============================================================================ - /// @brief **Hardware framebuffer buffer** - /// typedef struct game_stream_hw_framebuffer_buffer { - /// @brief uintptr_t framebuffer; - } ATTRIBUTE_PACKED game_stream_hw_framebuffer_buffer; - //---------------------------------------------------------------------------- + } game_stream_hw_framebuffer_buffer; - //============================================================================ - /// @brief **Hardware framebuffer packet** - /// typedef struct game_stream_hw_framebuffer_packet { - /// @brief uintptr_t framebuffer; - } ATTRIBUTE_PACKED game_stream_hw_framebuffer_packet; - //---------------------------------------------------------------------------- + } game_stream_hw_framebuffer_packet; - //============================================================================ - /// @brief **Hardware framebuffer process function address** - /// typedef void (*game_proc_address_t)(void); - //---------------------------------------------------------------------------- - ///@} - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_SoftwareFramebuffer 4. Software framebuffer stream - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Software framebuffer stream data** - /// - ///@{ - - //============================================================================ - /// @brief **Game video stream properties** - /// - /// Used by Kodi to pass the currently required video stream settings to the addon - /// typedef game_stream_video_properties game_stream_sw_framebuffer_properties; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Hardware framebuffer type** - /// typedef struct game_stream_sw_framebuffer_buffer { - GAME_PIXEL_FORMAT format; + enum GAME_PIXEL_FORMAT format; uint8_t* data; size_t size; - } ATTRIBUTE_PACKED game_stream_sw_framebuffer_buffer; - //---------------------------------------------------------------------------- + } game_stream_sw_framebuffer_buffer; - //============================================================================ - /// @brief **Video stream packet** - /// - /// This packet contains video stream data passed to Kodi. - /// typedef game_stream_video_packet game_stream_sw_framebuffer_packet; - //---------------------------------------------------------------------------- - - ///@} - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_StreamTypes 5. Stream types - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Stream types data** - /// - ///@{ - //============================================================================ - /// @brief **Game stream types** - /// typedef enum GAME_STREAM_TYPE { - /// @brief Unknown GAME_STREAM_UNKNOWN, - - /// @brief Audio stream GAME_STREAM_AUDIO, - - /// @brief Video stream GAME_STREAM_VIDEO, - - /// @brief Hardware framebuffer GAME_STREAM_HW_FRAMEBUFFER, - - /// @brief Software framebuffer GAME_STREAM_SW_FRAMEBUFFER, } GAME_STREAM_TYPE; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Immutable stream metadata** - /// - /// This metadata is provided when the stream is opened. If any stream - /// properties change, a new stream must be opened. - /// typedef struct game_stream_properties { - /// @brief - GAME_STREAM_TYPE type; + enum GAME_STREAM_TYPE type; union { - /// @brief game_stream_audio_properties audio; - - /// @brief game_stream_video_properties video; - - /// @brief game_stream_hw_framebuffer_properties hw_framebuffer; - - /// @brief game_stream_sw_framebuffer_properties sw_framebuffer; }; - } ATTRIBUTE_PACKED game_stream_properties; - //---------------------------------------------------------------------------- + } game_stream_properties; - //============================================================================ - /// @brief **Stream buffers for hardware rendering and zero-copy support** - /// typedef struct game_stream_buffer { - /// @brief GAME_STREAM_TYPE type; union { - /// @brief game_stream_hw_framebuffer_buffer hw_framebuffer; - - /// @brief game_stream_sw_framebuffer_buffer sw_framebuffer; }; - } ATTRIBUTE_PACKED game_stream_buffer; - //---------------------------------------------------------------------------- + } game_stream_buffer; - //============================================================================ - /// @brief **Stream packet and ephemeral metadata** - /// - /// This packet contains stream data and accompanying metadata. The metadata - /// is ephemeral, meaning it only applies to the current packet and can change - /// from packet to packet in the same stream. - /// typedef struct game_stream_packet { - /// @brief GAME_STREAM_TYPE type; union { - /// @brief game_stream_audio_packet audio; - - /// @brief game_stream_video_packet video; - - /// @brief game_stream_hw_framebuffer_packet hw_framebuffer; - - /// @brief game_stream_sw_framebuffer_packet sw_framebuffer; }; - } ATTRIBUTE_PACKED game_stream_packet; - //---------------------------------------------------------------------------- - - ///@} - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_GameTypes 6. Game types - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Game types data** - /// - ///@{ + } game_stream_packet; - //============================================================================ - /// @brief **Game reguin definition** - /// - /// Returned from game_get_region() typedef enum GAME_REGION { - /// @brief Game region unknown GAME_REGION_UNKNOWN, - - /// @brief Game region NTSC GAME_REGION_NTSC, - - /// @brief Game region PAL GAME_REGION_PAL, } GAME_REGION; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Special game types passed into game_load_game_special().** - /// - /// @remark Only used when multiple ROMs are required. - /// typedef enum SPECIAL_GAME_TYPE { - /// @brief Game Type BSX SPECIAL_GAME_TYPE_BSX, - - /// @brief Game Type BSX slotted SPECIAL_GAME_TYPE_BSX_SLOTTED, - - /// @brief Game Type sufami turbo SPECIAL_GAME_TYPE_SUFAMI_TURBO, - - /// @brief Game Type super game boy SPECIAL_GAME_TYPE_SUPER_GAME_BOY, } SPECIAL_GAME_TYPE; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **Game Memory** - /// typedef enum GAME_MEMORY { - /// @brief Passed to game_get_memory_data/size(). If the memory type doesn't apply - /// to the implementation NULL/0 can be returned. GAME_MEMORY_MASK = 0xff, - - /// @brief Regular save ram. - /// - /// This ram is usually found on a game cartridge, backed - /// up by a battery. If save game data is too complex for a single memory - /// buffer, the SYSTEM_DIRECTORY environment callback can be used. GAME_MEMORY_SAVE_RAM = 0, - - /// @brief Some games have a built-in clock to keep track of time. - /// - /// This memory is usually just a couple of bytes to keep track of time. GAME_MEMORY_RTC = 1, - - /// @brief System ram lets a frontend peek into a game systems main RAM GAME_MEMORY_SYSTEM_RAM = 2, - - /// @brief Video ram lets a frontend peek into a game systems video RAM (VRAM) GAME_MEMORY_VIDEO_RAM = 3, - - /// @brief Special memory type GAME_MEMORY_SNES_BSX_RAM = ((1 << 8) | GAME_MEMORY_SAVE_RAM), - - /// @brief Special memory type GAME_MEMORY_SNES_BSX_PRAM = ((2 << 8) | GAME_MEMORY_SAVE_RAM), - - /// @brief Special memory type GAME_MEMORY_SNES_SUFAMI_TURBO_A_RAM = ((3 << 8) | GAME_MEMORY_SAVE_RAM), - - /// @brief Special memory type GAME_MEMORY_SNES_SUFAMI_TURBO_B_RAM = ((4 << 8) | GAME_MEMORY_SAVE_RAM), - - /// @brief Special memory type GAME_MEMORY_SNES_GAME_BOY_RAM = ((5 << 8) | GAME_MEMORY_SAVE_RAM), - - /// @brief Special memory type GAME_MEMORY_SNES_GAME_BOY_RTC = ((6 << 8) | GAME_MEMORY_RTC), } GAME_MEMORY; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief **ID values for SIMD CPU features** typedef enum GAME_SIMD { - /// @brief SIMD CPU SSE GAME_SIMD_SSE = (1 << 0), - - /// @brief SIMD CPU SSE2 GAME_SIMD_SSE2 = (1 << 1), - - /// @brief SIMD CPU VMX GAME_SIMD_VMX = (1 << 2), - - /// @brief SIMD CPU VMX128 GAME_SIMD_VMX128 = (1 << 3), - - /// @brief SIMD CPU AVX GAME_SIMD_AVX = (1 << 4), - - /// @brief SIMD CPU NEON GAME_SIMD_NEON = (1 << 5), - - /// @brief SIMD CPU SSE3 GAME_SIMD_SSE3 = (1 << 6), - - /// @brief SIMD CPU SSSE3 GAME_SIMD_SSSE3 = (1 << 7), - - /// @brief SIMD CPU MMX GAME_SIMD_MMX = (1 << 8), - - /// @brief SIMD CPU MMXEXT GAME_SIMD_MMXEXT = (1 << 9), - - /// @brief SIMD CPU SSE4 GAME_SIMD_SSE4 = (1 << 10), - - /// @brief SIMD CPU SSE42 GAME_SIMD_SSE42 = (1 << 11), - - /// @brief SIMD CPU AVX2 GAME_SIMD_AVX2 = (1 << 12), - - /// @brief SIMD CPU VFPU GAME_SIMD_VFPU = (1 << 13), } GAME_SIMD; - //---------------------------------------------------------------------------- - - ///@} - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_InputTypes 7. Input types - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Input types** - /// - ///@{ - - //============================================================================ - /// @brief typedef enum GAME_INPUT_EVENT_SOURCE { - /// @brief GAME_INPUT_EVENT_DIGITAL_BUTTON, - - /// @brief GAME_INPUT_EVENT_ANALOG_BUTTON, - - /// @brief GAME_INPUT_EVENT_AXIS, - - /// @brief GAME_INPUT_EVENT_ANALOG_STICK, - - /// @brief GAME_INPUT_EVENT_ACCELEROMETER, - - /// @brief GAME_INPUT_EVENT_KEY, - - /// @brief GAME_INPUT_EVENT_RELATIVE_POINTER, - - /// @brief GAME_INPUT_EVENT_ABSOLUTE_POINTER, - - /// @brief GAME_INPUT_EVENT_MOTOR, } GAME_INPUT_EVENT_SOURCE; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef enum GAME_KEY_MOD { - /// @brief GAME_KEY_MOD_NONE = 0x0000, - - /// @brief GAME_KEY_MOD_SHIFT = 0x0001, - - /// @brief GAME_KEY_MOD_CTRL = 0x0002, - - /// @brief GAME_KEY_MOD_ALT = 0x0004, - - /// @brief GAME_KEY_MOD_META = 0x0008, - - /// @brief GAME_KEY_MOD_SUPER = 0x0010, - - /// @brief GAME_KEY_MOD_NUMLOCK = 0x0100, - - /// @brief GAME_KEY_MOD_CAPSLOCK = 0x0200, - - /// @brief GAME_KEY_MOD_SCROLLOCK = 0x0400, } GAME_KEY_MOD; - //---------------------------------------------------------------------------- - //============================================================================ - /// @brief Type of port on the virtual game console typedef enum GAME_PORT_TYPE { - /// @brief Game port unknown GAME_PORT_UNKNOWN, - - /// @brief Game port Keyboard GAME_PORT_KEYBOARD, - - /// @brief Game port mouse GAME_PORT_MOUSE, - - /// @brief Game port controller GAME_PORT_CONTROLLER, } GAME_PORT_TYPE; - //---------------------------------------------------------------------------- - /*! @cond PRIVATE */ - /*! - * @brief "C" Game add-on controller layout. - * - * Structure used to interface in "C" between Kodi and Addon. - * - * See @ref AddonGameControllerLayout for description of values. - */ typedef struct game_controller_layout { char* controller_id; @@ -809,402 +310,243 @@ extern "C" unsigned int abs_pointer_count; char** motors; unsigned int motor_count; - } ATTRIBUTE_PACKED game_controller_layout; - /*! @endcond */ + } game_controller_layout; struct game_input_port; - //============================================================================ - /// @brief Device that can provide input typedef struct game_input_device { - /// @brief ID used in the Kodi controller API const char* controller_id; - - /// @brief const char* port_address; - - /// @brief struct game_input_port* available_ports; - - /// @brief unsigned int port_count; - } ATTRIBUTE_PACKED game_input_device; - //---------------------------------------------------------------------------- + } game_input_device; - //============================================================================ - /// @brief Port that can provide input - /// - /// Ports can accept multiple devices and devices can have multiple ports, so - /// the topology of possible configurations is a tree structure of alternating - /// port and device nodes. - /// typedef struct game_input_port { - /// @brief - GAME_PORT_TYPE type; - - /// @brief Required for GAME_PORT_CONTROLLER type + enum GAME_PORT_TYPE type; const char* port_id; - - /// @brief - game_input_device* accepted_devices; - - /// @brief + struct game_input_device* accepted_devices; unsigned int device_count; - } ATTRIBUTE_PACKED game_input_port; - //---------------------------------------------------------------------------- + } game_input_port; - //============================================================================ - /// @brief The input topology is the possible ways to connect input devices - /// - /// This represents the logical topology, which is the possible connections that - /// the game client's logic can handle. It is strictly a subset of the physical - /// topology. Loops are not allowed. - /// typedef struct game_input_topology { - /// @brief The list of ports on the virtual game console - game_input_port* ports; - - /// @brief The number of ports + struct game_input_port* ports; unsigned int port_count; - - /// @brief A limit on the number of input-providing devices, or -1 for no limit int player_limit; - } ATTRIBUTE_PACKED game_input_topology; - //---------------------------------------------------------------------------- + } game_input_topology; - //============================================================================ - /// @brief typedef struct game_digital_button_event { - /// @brief bool pressed; - } ATTRIBUTE_PACKED game_digital_button_event; - //---------------------------------------------------------------------------- + } game_digital_button_event; - //============================================================================ - /// @brief typedef struct game_analog_button_event { - /// @brief float magnitude; - } ATTRIBUTE_PACKED game_analog_button_event; - //---------------------------------------------------------------------------- + } game_analog_button_event; - //============================================================================ - /// @brief typedef struct game_axis_event { /// @brief float position; - } ATTRIBUTE_PACKED game_axis_event; - //---------------------------------------------------------------------------- + } game_axis_event; - //============================================================================ - /// @brief typedef struct game_analog_stick_event { - /// @brief float x; - - /// @brief float y; - } ATTRIBUTE_PACKED game_analog_stick_event; - //---------------------------------------------------------------------------- + } game_analog_stick_event; - //============================================================================ - /// @brief typedef struct game_accelerometer_event { - /// @brief float x; - - /// @brief float y; - - /// @brief float z; - } ATTRIBUTE_PACKED game_accelerometer_event; - //---------------------------------------------------------------------------- + } game_accelerometer_event; - //============================================================================ - /// @brief typedef struct game_key_event { - /// @brief bool pressed; - - /// @brief If the keypress generates a printing character - /// - /// The unicode value contains the character generated. If the key is a - /// non-printing character, e.g. a function or arrow key, the unicode value - /// is zero. uint32_t unicode; + enum GAME_KEY_MOD modifiers; + } game_key_event; - /// @brief - GAME_KEY_MOD modifiers; - } ATTRIBUTE_PACKED game_key_event; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @brief typedef struct game_rel_pointer_event { - /// @brief int x; - - /// @brief int y; - } ATTRIBUTE_PACKED game_rel_pointer_event; - //---------------------------------------------------------------------------- + } game_rel_pointer_event; - //============================================================================ - /// @brief typedef struct game_abs_pointer_event { - /// @brief bool pressed; - - /// @brief float x; - - /// @brief float y; - } ATTRIBUTE_PACKED game_abs_pointer_event; - //---------------------------------------------------------------------------- + } game_abs_pointer_event; - //============================================================================ - /// @brief typedef struct game_motor_event { - /// @brief float magnitude; - } ATTRIBUTE_PACKED game_motor_event; - //---------------------------------------------------------------------------- + } game_motor_event; - //============================================================================ - /// @brief typedef struct game_input_event { - /// @brief - GAME_INPUT_EVENT_SOURCE type; - - /// @brief + enum GAME_INPUT_EVENT_SOURCE type; const char* controller_id; - - /// @brief - GAME_PORT_TYPE port_type; - - /// @brief + enum GAME_PORT_TYPE port_type; const char* port_address; - - /// @brief const char* feature_name; union { - /// @brief struct game_digital_button_event digital_button; - - /// @brief struct game_analog_button_event analog_button; - - /// @brief struct game_axis_event axis; - - /// @brief struct game_analog_stick_event analog_stick; - - /// @brief struct game_accelerometer_event accelerometer; - - /// @brief struct game_key_event key; - - /// @brief struct game_rel_pointer_event rel_pointer; - - /// @brief struct game_abs_pointer_event abs_pointer; - - /// @brief struct game_motor_event motor; }; - } ATTRIBUTE_PACKED game_input_event; - //---------------------------------------------------------------------------- - - ///@} + } game_input_event; - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - /// @defgroup cpp_kodi_addon_game_Defs_EnvironmentTypes 8. Environment types - /// @ingroup cpp_kodi_addon_game_Defs - /// @brief **Environment types** - /// - ///@{ - - //============================================================================ - /// @brief Game system timing - /// struct game_system_timing { - /// @brief FPS of video content. double fps; - - /// @brief Sampling rate of audio. double sample_rate; }; - //---------------------------------------------------------------------------- - ///@} - - - //--==----==----==----==----==----==----==----==----==----==----==----==----==-- - - /*! - * @brief Game properties - * - * Not to be used outside this header. - */ - typedef struct AddonProps_Game + struct GAME_PROPS { - /*! - * The path of the game client being loaded. - */ const char* game_client_dll_path; - - /*! - * Paths to proxy DLLs used to load the game client. - */ const char** proxy_dll_paths; - - /*! - * Number of proxy DLL paths provided. - */ unsigned int proxy_dll_count; - - /*! - * The "system" directories of the frontend. These directories can be used to - * store system-specific ROMs such as BIOSes, configuration data, etc. - */ const char** resource_directories; - - /*! - * Number of resource directories provided - */ unsigned int resource_directory_count; - - /*! - * The writable directory of the frontend. This directory can be used to store - * SRAM, memory cards, high scores, etc, if the game client cannot use the - * regular memory interface, GetMemoryData(). - */ const char* profile_directory; - - /*! - * The value of the property from addon.xml - */ bool supports_vfs; - - /*! - * The extensions in the property from addon.xml - */ const char** extensions; - - /*! - * Number of extensions provided - */ unsigned int extension_count; - } AddonProps_Game; - - typedef void* KODI_GAME_STREAM_HANDLE; - - /*! Structure to transfer the methods from kodi_game_dll.h to Kodi */ - - struct AddonInstance_Game; - - /*! - * @brief Game callbacks - * - * Not to be used outside this header. - */ - typedef struct AddonToKodiFuncTable_Game - { - KODI_HANDLE kodiInstance; + }; - void (*CloseGame)(KODI_HANDLE kodiInstance); - KODI_GAME_STREAM_HANDLE (*OpenStream)(KODI_HANDLE, const struct game_stream_properties*); - bool (*GetStreamBuffer)(KODI_HANDLE, - KODI_GAME_STREAM_HANDLE, - unsigned int, - unsigned int, - struct game_stream_buffer*); - void (*AddStreamData)(KODI_HANDLE, KODI_GAME_STREAM_HANDLE, const struct game_stream_packet*); - void (*ReleaseStreamBuffer)(KODI_HANDLE, KODI_GAME_STREAM_HANDLE, struct game_stream_buffer*); - void (*CloseStream)(KODI_HANDLE, KODI_GAME_STREAM_HANDLE); - game_proc_address_t (*HwGetProcAddress)(KODI_HANDLE kodiInstance, const char* symbol); - bool (*InputEvent)(KODI_HANDLE kodiInstance, const struct game_input_event* event); - } AddonToKodiFuncTable_Game; + typedef KODI_ADDON_GAME_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_DESTROY_V1)(KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_GAME_V1)(const KODI_ADDON_GAME_HDL hdl, + const char* url); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1)(const KODI_ADDON_GAME_HDL hdl, + enum SPECIAL_GAME_TYPE type, + const char** urls, + size_t urlCount); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_LOAD_STANDALONE_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_UNLOAD_GAME_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_GAME_TIMING_V1)(const KODI_ADDON_GAME_HDL hdl, + struct game_system_timing* timing_info); + typedef enum GAME_REGION(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_REGION_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RUN_FRAME_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_HAS_FEATURE_V1)(const KODI_ADDON_GAME_HDL hdl, + const char* controller_id, + const char* feature_name); + typedef struct game_input_topology*(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_TOPOLOGY_V1)( + const KODI_ADDON_GAME_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_FREE_TOPOLOGY_V1)(const KODI_ADDON_GAME_HDL hdl, + struct game_input_topology* topology); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1)( + const KODI_ADDON_GAME_HDL hdl, const struct game_controller_layout* controllers, size_t controller_count); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1)(const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_ENABLE_MOUSE_V1)(const KODI_ADDON_GAME_HDL hdl, bool enable, const char* controller_id); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1)(const KODI_ADDON_GAME_HDL hdl, + bool connect, + const char* port_address, + const char* controller_id); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_INPUT_EVENT_V1)(const KODI_ADDON_GAME_HDL hdl, + const struct game_input_event* event); + typedef size_t(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SERIALIZE_SIZE_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SERIALIZE_V1)(const KODI_ADDON_GAME_HDL hdl, + uint8_t* data, + size_t size); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_DESERIALIZE_V1)(const KODI_ADDON_GAME_HDL hdl, + const uint8_t* data, + size_t size); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CHEAT_RESET_V1)(const KODI_ADDON_GAME_HDL hdl); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_GET_MEMORY_V1)(const KODI_ADDON_GAME_HDL hdl, + enum GAME_MEMORY type, + uint8_t** data, + size_t* size); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_SET_CHEAT_V1)(const KODI_ADDON_GAME_HDL hdl, + unsigned int index, + bool enabled, + const char* code); + + typedef struct KODI_ADDON_GAME_FUNC + { + PFN_KODI_ADDON_GAME_CREATE_V1 create; + PFN_KODI_ADDON_GAME_DESTROY_V1 destroy; + PFN_KODI_ADDON_GAME_LOAD_GAME_V1 load_game; + PFN_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1 load_game_special; + PFN_KODI_ADDON_GAME_LOAD_STANDALONE_V1 load_standalone; + PFN_KODI_ADDON_GAME_UNLOAD_GAME_V1 unload_game; + PFN_KODI_ADDON_GAME_GET_GAME_TIMING_V1 get_game_timing; + PFN_KODI_ADDON_GAME_GET_REGION_V1 get_region; + PFN_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1 requires_game_loop; + PFN_KODI_ADDON_GAME_RUN_FRAME_V1 run_frame; + PFN_KODI_ADDON_GAME_RESET_V1 reset; + PFN_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1 hw_context_reset; + PFN_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1 hw_context_destroy; + PFN_KODI_ADDON_GAME_HAS_FEATURE_V1 has_feature; + PFN_KODI_ADDON_GAME_GET_TOPOLOGY_V1 get_topology; + PFN_KODI_ADDON_GAME_FREE_TOPOLOGY_V1 free_topology; + PFN_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1 set_controller_layouts; + PFN_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1 enable_keyboard; + PFN_KODI_ADDON_GAME_ENABLE_MOUSE_V1 enable_mouse; + PFN_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1 connect_controller; + PFN_KODI_ADDON_GAME_INPUT_EVENT_V1 input_event; + PFN_KODI_ADDON_GAME_SERIALIZE_SIZE_V1 serialize_size; + PFN_KODI_ADDON_GAME_SERIALIZE_V1 serialize; + PFN_KODI_ADDON_GAME_DESERIALIZE_V1 deserialize; + PFN_KODI_ADDON_GAME_CHEAT_RESET_V1 cheat_reset; + PFN_KODI_ADDON_GAME_GET_MEMORY_V1 get_memory; + PFN_KODI_ADDON_GAME_SET_CHEAT_V1 set_cheat; + } KODI_ADDON_GAME_FUNC; - /*! - * @brief Game function hooks - * - * Not to be used outside this header. - */ - typedef struct KodiToAddonFuncTable_Game - { - KODI_HANDLE addonInstance; + typedef void* KODI_GAME_STREAM_HANDLE; - GAME_ERROR(__cdecl* LoadGame)(const struct AddonInstance_Game*, const char*); - GAME_ERROR(__cdecl* LoadGameSpecial) - (const struct AddonInstance_Game*, enum SPECIAL_GAME_TYPE, const char**, size_t); - GAME_ERROR(__cdecl* LoadStandalone)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* UnloadGame)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* GetGameTiming) - (const struct AddonInstance_Game*, struct game_system_timing*); - GAME_REGION(__cdecl* GetRegion)(const struct AddonInstance_Game*); - bool(__cdecl* RequiresGameLoop)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* RunFrame)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* Reset)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* HwContextReset)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* HwContextDestroy)(const struct AddonInstance_Game*); - bool(__cdecl* HasFeature)(const struct AddonInstance_Game*, const char*, const char*); - game_input_topology*(__cdecl* GetTopology)(const struct AddonInstance_Game*); - void(__cdecl* FreeTopology)(const struct AddonInstance_Game*, struct game_input_topology*); - void(__cdecl* SetControllerLayouts)(const struct AddonInstance_Game*, - const struct game_controller_layout*, - unsigned int); - bool(__cdecl* EnableKeyboard)(const struct AddonInstance_Game*, bool, const char*); - bool(__cdecl* EnableMouse)(const struct AddonInstance_Game*, bool, const char*); - bool(__cdecl* ConnectController)(const struct AddonInstance_Game*, - bool, - const char*, - const char*); - bool(__cdecl* InputEvent)(const struct AddonInstance_Game*, const struct game_input_event*); - size_t(__cdecl* SerializeSize)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* Serialize)(const struct AddonInstance_Game*, uint8_t*, size_t); - GAME_ERROR(__cdecl* Deserialize)(const struct AddonInstance_Game*, const uint8_t*, size_t); - GAME_ERROR(__cdecl* CheatReset)(const struct AddonInstance_Game*); - GAME_ERROR(__cdecl* GetMemory) - (const struct AddonInstance_Game*, enum GAME_MEMORY, uint8_t**, size_t*); - GAME_ERROR(__cdecl* SetCheat) - (const struct AddonInstance_Game*, unsigned int, bool, const char*); - } KodiToAddonFuncTable_Game; + ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GAME_STREAM_HANDLE + kodi_addon_game_open_stream(KODI_OWN_HDL hdl, const struct game_stream_properties* properties) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_game_get_stream_buffer(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + unsigned int width, + unsigned int height, + struct game_stream_buffer* buffer) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_game_add_stream_data(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + const struct game_stream_packet* packet) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_game_release_stream_buffer(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + struct game_stream_buffer* buffer) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_game_close_stream(KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT game_proc_address_t kodi_addon_hw_get_proc_address(KODI_OWN_HDL hdl, + const char* symbol) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_OWN_HDL hdl, + const struct game_input_event* event) + __INTRODUCED_IN_KODI(1); - /*! - * @brief Game instance - * - * Not to be used outside this header. - */ - typedef struct AddonInstance_Game - { - struct AddonProps_Game* props; - struct AddonToKodiFuncTable_Game* toKodi; - struct KodiToAddonFuncTable_Game* toAddon; - } AddonInstance_Game; #ifdef __cplusplus -} +} /* extern "C" */ #endif /* __cplusplus */ #endif /* !C_API_ADDONINSTANCE_GAME_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h deleted file mode 100644 index 7093212786850..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/image_decoder.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_ADDONINSTANCE_IMAGE_DECODER_H -#define C_API_ADDONINSTANCE_IMAGE_DECODER_H - -#include "../addon_base.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - //============================================================================ - /// @ingroup cpp_kodi_addon_imagedecoder_Defs - /// @brief **Image format types**\n - /// Used to define wanted target format where image decoder should give to - /// Kodi. - /// - typedef enum ImageFormat - { - /// @brief A 32-bit ARGB pixel format, with alpha, that uses 8 bits per - /// channel, ARGBARGB... - ADDON_IMG_FMT_A8R8G8B8 = 1, - - /// @brief A 8, alpha only, 8bpp, AAA... - ADDON_IMG_FMT_A8 = 2, - - /// @brief RGBA 8:8:8:8, with alpha, 32bpp, RGBARGBA... - ADDON_IMG_FMT_RGBA8 = 3, - - /// @brief RGB 8:8:8, with alpha, 24bpp, RGBRGB... - ADDON_IMG_FMT_RGB8 = 4 - } ImageFormat; - //---------------------------------------------------------------------------- - - typedef struct AddonProps_ImageDecoder - { - const char* mimetype; - } AddonProps_ImageDecoder; - - typedef struct AddonToKodiFuncTable_ImageDecoder - { - KODI_HANDLE kodi_instance; - } AddonToKodiFuncTable_ImageDecoder; - - struct AddonInstance_ImageDecoder; - typedef struct KodiToAddonFuncTable_ImageDecoder - { - KODI_HANDLE addonInstance; - bool(__cdecl* load_image_from_memory)(const struct AddonInstance_ImageDecoder* instance, - unsigned char* buffer, - unsigned int buf_size, - unsigned int* width, - unsigned int* height); - - bool(__cdecl* decode)(const struct AddonInstance_ImageDecoder* instance, - unsigned char* pixels, - unsigned int width, - unsigned int height, - unsigned int pitch, - enum ImageFormat format); - } KodiToAddonFuncTable_ImageDecoder; - - typedef struct AddonInstance_ImageDecoder - { - struct AddonProps_ImageDecoder* props; - struct AddonToKodiFuncTable_ImageDecoder* toKodi; - struct KodiToAddonFuncTable_ImageDecoder* toAddon; - } AddonInstance_ImageDecoder; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !C_API_ADDONINSTANCE_IMAGE_DECODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/imagedecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/imagedecoder.h new file mode 100644 index 0000000000000..752f6f7ef82c2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/imagedecoder.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_ADDONINSTANCE_IMAGEDECODER_H +#define C_API_ADDONINSTANCE_IMAGEDECODER_H + +#include "../addon_base.h" + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + typedef void* KODI_ADDON_IMAGEDECODER_HDL; + + typedef enum ADDON_IMG_FMT + { + ADDON_IMG_FMT_A8R8G8B8 = 1, + ADDON_IMG_FMT_A8 = 2, + ADDON_IMG_FMT_RGBA8 = 3, + ADDON_IMG_FMT_RGB8 = 4 + } ADDON_IMG_FMT; + + typedef KODI_ADDON_IMAGEDECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)( + KODI_ADDON_IMAGEDECODER_HDL hdl, const uint8_t* buffer, size_t buf_size, unsigned int* width, unsigned int* height); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, + unsigned int width, + unsigned int height, + unsigned int pitch, + enum ADDON_IMG_FMT format); + + typedef struct KODI_ADDON_IMAGEDECODER_FUNC + { + PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1 create; + PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1 destroy; + PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1 load_image_from_memory; + PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1 decode; + } KODI_ADDON_IMAGEDECODER_FUNC; + + ATTR_DLL_EXPORT char* kodi_addon_imagedecoder_mimetype(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_IMAGEDECODER_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h index 1b3a7355642f9..e746653cf5568 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h @@ -6,6 +6,8 @@ * See LICENSES/README.md for more information. */ +/*---AUTO_GEN_PARSE---*/ + #ifndef C_API_ADDONINSTANCE_INPUTSTREAM_H #define C_API_ADDONINSTANCE_INPUTSTREAM_H @@ -32,6 +34,8 @@ extern "C" { #endif /* __cplusplus */ + typedef void* KODI_ADDON_INPUTSTREAM_HDL; + //============================================================================== /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamCapabilities /// @brief **Capability types of inputstream addon.**\n @@ -597,104 +601,139 @@ extern "C" double ptsEnd; }; - /*! - * @brief "C" ABI Structures to transfer the methods from this to Kodi - */ - - // this are properties given to the addon on create - // at this time we have no parameters for the addon - typedef struct AddonProps_InputStream /* internal */ + typedef KODI_OWN_HDL (*PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM)(KODI_OWN_HDL handle, + int streamId, + struct INPUTSTREAM_INFO* stream); + + typedef KODI_ADDON_INPUTSTREAM_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DESTROY_V1)(KODI_ADDON_INPUTSTREAM_HDL hdl); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_OPEN_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_PROPERTY* props); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CLOSE_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl, struct INPUTSTREAM_CAPABILITIES* capabilities); + + // IDemux + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_IDS* ids); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + struct INPUTSTREAM_INFO* info, + KODI_OWN_HDL* demuxStream, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + bool enable); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef struct DEMUX_PACKET*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + double time, + bool backwards, + double* startpts); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int speed); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int width, int height); + + // IDisplayTime + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + // ITime + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_TIMES* times); + + // IPosTime + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_POS_TIME_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, int ms); + + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + uint8_t* buffer, + unsigned int bufferSize); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int64_t position, + int whence); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl); + + // IChapter + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1)( + const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); + + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1)(const KODI_ADDON_INPUTSTREAM_HDL hdl); + + typedef struct KODI_ADDON_INPUTSTREAM_FUNC { - int dummy; - } AddonProps_InputStream; + PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1 create; + PFN_KODI_ADDON_INPUTSTREAM_DESTROY_V1 destroy; - typedef struct AddonToKodiFuncTable_InputStream /* internal */ - { - KODI_HANDLE kodiInstance; - struct DEMUX_PACKET* (*allocate_demux_packet)(void* kodiInstance, int data_size); - struct DEMUX_PACKET* (*allocate_encrypted_demux_packet)(void* kodiInstance, - unsigned int data_size, - unsigned int encrypted_subsample_count); - void (*free_demux_packet)(void* kodiInstance, struct DEMUX_PACKET* packet); - } AddonToKodiFuncTable_InputStream; - - struct AddonInstance_InputStream; - typedef struct KodiToAddonFuncTable_InputStream /* internal */ - { - KODI_HANDLE addonInstance; - - bool(__cdecl* open)(const struct AddonInstance_InputStream* instance, - struct INPUTSTREAM_PROPERTY* props); - void(__cdecl* close)(const struct AddonInstance_InputStream* instance); - const char*(__cdecl* get_path_list)(const struct AddonInstance_InputStream* instance); - void(__cdecl* get_capabilities)(const struct AddonInstance_InputStream* instance, - struct INPUTSTREAM_CAPABILITIES* capabilities); + PFN_KODI_ADDON_INPUTSTREAM_OPEN_V1 open; + PFN_KODI_ADDON_INPUTSTREAM_CLOSE_V1 close; + PFN_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1 get_path_list; + PFN_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1 get_capabilities; // IDemux - bool(__cdecl* get_stream_ids)(const struct AddonInstance_InputStream* instance, - struct INPUTSTREAM_IDS* ids); - bool(__cdecl* get_stream)(const struct AddonInstance_InputStream* instance, - int streamid, - struct INPUTSTREAM_INFO* info, - KODI_HANDLE* demuxStream, - KODI_HANDLE (*transfer_stream)(KODI_HANDLE handle, - int streamId, - struct INPUTSTREAM_INFO* stream)); - void(__cdecl* enable_stream)(const struct AddonInstance_InputStream* instance, - int streamid, - bool enable); - bool(__cdecl* open_stream)(const struct AddonInstance_InputStream* instance, int streamid); - void(__cdecl* demux_reset)(const struct AddonInstance_InputStream* instance); - void(__cdecl* demux_abort)(const struct AddonInstance_InputStream* instance); - void(__cdecl* demux_flush)(const struct AddonInstance_InputStream* instance); - struct DEMUX_PACKET*(__cdecl* demux_read)(const struct AddonInstance_InputStream* instance); - bool(__cdecl* demux_seek_time)(const struct AddonInstance_InputStream* instance, - double time, - bool backwards, - double* startpts); - void(__cdecl* demux_set_speed)(const struct AddonInstance_InputStream* instance, int speed); - void(__cdecl* set_video_resolution)(const struct AddonInstance_InputStream* instance, - int width, - int height); + PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1 get_stream_ids; + PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1 get_stream; + PFN_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1 enable_stream; + PFN_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1 open_stream; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1 demux_reset; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1 demux_abort; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1 demux_flush; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1 demux_read; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1 demux_seek_time; + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1 demux_set_speed; + PFN_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1 set_video_resolution; // IDisplayTime - int(__cdecl* get_total_time)(const struct AddonInstance_InputStream* instance); - int(__cdecl* get_time)(const struct AddonInstance_InputStream* instance); + PFN_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1 get_total_time; + PFN_KODI_ADDON_INPUTSTREAM_GET_TIME_V1 get_time; // ITime - bool(__cdecl* get_times)(const struct AddonInstance_InputStream* instance, - struct INPUTSTREAM_TIMES* times); + PFN_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1 get_times; // IPosTime - bool(__cdecl* pos_time)(const struct AddonInstance_InputStream* instance, int ms); - - int(__cdecl* read_stream)(const struct AddonInstance_InputStream* instance, - uint8_t* buffer, - unsigned int bufferSize); - int64_t(__cdecl* seek_stream)(const struct AddonInstance_InputStream* instance, - int64_t position, - int whence); - int64_t(__cdecl* position_stream)(const struct AddonInstance_InputStream* instance); - int64_t(__cdecl* length_stream)(const struct AddonInstance_InputStream* instance); - bool(__cdecl* is_real_time_stream)(const struct AddonInstance_InputStream* instance); + PFN_KODI_ADDON_INPUTSTREAM_POS_TIME_V1 pos_time; + PFN_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1 read_stream; + PFN_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1 seek_stream; + PFN_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1 position_stream; + PFN_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1 length_stream; + PFN_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1 is_real_time_stream; // IChapter - int(__cdecl* get_chapter)(const struct AddonInstance_InputStream* instance); - int(__cdecl* get_chapter_count)(const struct AddonInstance_InputStream* instance); - const char*(__cdecl* get_chapter_name)(const struct AddonInstance_InputStream* instance, - int ch); - int64_t(__cdecl* get_chapter_pos)(const struct AddonInstance_InputStream* instance, int ch); - bool(__cdecl* seek_chapter)(const struct AddonInstance_InputStream* instance, int ch); - - int(__cdecl* block_size_stream)(const struct AddonInstance_InputStream* instance); - } KodiToAddonFuncTable_InputStream; - - typedef struct AddonInstance_InputStream /* internal */ - { - struct AddonProps_InputStream* props; - struct AddonToKodiFuncTable_InputStream* toKodi; - struct KodiToAddonFuncTable_InputStream* toAddon; - } AddonInstance_InputStream; + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1 get_chapter; + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1 get_chapter_count; + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1 get_chapter_name; + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1 get_chapter_pos; + PFN_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1 seek_chapter; + PFN_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1 block_size_stream; + } KODI_ADDON_INPUTSTREAM_FUNC; + + ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_demux_packet( + KODI_OWN_HDL hdl, int data_size) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet( + KODI_OWN_HDL hdl, unsigned int data_size, unsigned int encrypted_subsample_count) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_inputstream_free_demux_packet(KODI_OWN_HDL hdl, + struct DEMUX_PACKET* packet) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt index 9a22c442306b8..c7d945160e9b5 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt @@ -1,9 +1,14 @@ -set(HEADERS demux_packet.h - stream_codec.h - stream_constants.h - stream_crypto.h - timing_constants.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_addon-instance_inputstream) +set(HEADERS + demux_packet.h + stream_codec.h + stream_constants.h + stream_crypto.h + timing_constants.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_addon-instance_inputstream) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h index df168bc024e8b..adc7ce5651345 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h @@ -1,16 +1,20 @@ /* - * Copyright (C) 2014-2018 Team Kodi + * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ +/*---AUTO_GEN_PARSE---*/ + #ifndef C_API_ADDONINSTANCE_PERIPHERAL_H #define C_API_ADDONINSTANCE_PERIPHERAL_H #include "../addon_base.h" +#include + /* indicates a joystick has no preference for port number */ #define NO_PORT_REQUESTED (-1) @@ -22,222 +26,89 @@ extern "C" { #endif /* __cplusplus */ - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_General_PERIPHERAL_ERROR enum PERIPHERAL_ERROR - /// @ingroup cpp_kodi_addon_peripheral_Defs_General - /// @brief **Peripheral add-on error codes**\n - /// Used as return values on most peripheral related functions. - /// - /// In this way, a peripheral instance signals errors in its processing and, - /// under certain conditions, allows Kodi to make corrections. - /// - ///@{ + typedef void* KODI_ADDON_PERIPHERAL_HDL; + typedef enum PERIPHERAL_ERROR { - /// @brief __0__ : No error occurred PERIPHERAL_NO_ERROR = 0, - - /// @brief __-1__ : An unknown error occurred PERIPHERAL_ERROR_UNKNOWN = -1, - - /// @brief __-2__ : The command failed PERIPHERAL_ERROR_FAILED = -2, - - /// @brief __-3__ : The parameters of the method are invalid for this operation PERIPHERAL_ERROR_INVALID_PARAMETERS = -3, - - /// @brief __-4__ : The method that the frontend called is not implemented PERIPHERAL_ERROR_NOT_IMPLEMENTED = -4, - - /// @brief __-5__ : No peripherals are connected PERIPHERAL_ERROR_NOT_CONNECTED = -5, - - /// @brief __-6__ : Peripherals are connected, but command was interrupted PERIPHERAL_ERROR_CONNECTION_FAILED = -6, } PERIPHERAL_ERROR; - ///@} - //---------------------------------------------------------------------------- - - // @name Peripheral types - //{ - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_PERIPHERAL_TYPE enum PERIPHERAL_TYPE - /// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral - /// @brief **Peripheral types**\n - /// Types used to identify wanted peripheral. - ///@{ + typedef enum PERIPHERAL_TYPE { - /// @brief Type declared as unknown. PERIPHERAL_TYPE_UNKNOWN, - - /// @brief Type declared as joystick. PERIPHERAL_TYPE_JOYSTICK, - - /// @brief Type declared as keyboard. PERIPHERAL_TYPE_KEYBOARD, } PERIPHERAL_TYPE; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Information shared between peripherals - */ - typedef struct PERIPHERAL_INFO + struct PERIPHERAL_INFO { - PERIPHERAL_TYPE type; /*!< type of peripheral */ + enum PERIPHERAL_TYPE type; /*!< type of peripheral */ char* name; /*!< name of peripheral */ uint16_t vendor_id; /*!< vendor ID of peripheral, 0x0000 if unknown */ uint16_t product_id; /*!< product ID of peripheral, 0x0000 if unknown */ unsigned int index; /*!< the order in which the add-on identified this peripheral */ - } ATTRIBUTE_PACKED PERIPHERAL_INFO; + }; - /*! - * @brief Peripheral add-on capabilities. - */ - typedef struct PERIPHERAL_CAPABILITIES + struct PERIPHERAL_CAPABILITIES { bool provides_joysticks; /*!< true if the add-on provides joysticks */ bool provides_joystick_rumble; bool provides_joystick_power_off; bool provides_buttonmaps; /*!< true if the add-on provides button maps */ - } ATTRIBUTE_PACKED PERIPHERAL_CAPABILITIES; - - //} - - // @name Event types - //{ + }; - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Event_PERIPHERAL_EVENT_TYPE enum PERIPHERAL_EVENT_TYPE - /// @ingroup cpp_kodi_addon_peripheral_Defs_Event - /// @brief **Event types**\n - /// Types of events that can be sent and received. - ///@{ typedef enum PERIPHERAL_EVENT_TYPE { - /// @brief unknown event PERIPHERAL_EVENT_TYPE_NONE, - - /// @brief state changed for joystick driver button PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON, - - /// @brief state changed for joystick driver hat PERIPHERAL_EVENT_TYPE_DRIVER_HAT, - - /// @brief state changed for joystick driver axis PERIPHERAL_EVENT_TYPE_DRIVER_AXIS, - - /// @brief set the state for joystick rumble motor PERIPHERAL_EVENT_TYPE_SET_MOTOR, } PERIPHERAL_EVENT_TYPE; - ///@} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Event_JOYSTICK_STATE_BUTTON enum JOYSTICK_STATE_BUTTON - /// @ingroup cpp_kodi_addon_peripheral_Defs_Event - /// @brief **State button**\n - /// States a button can have - ///@{ + typedef enum JOYSTICK_STATE_BUTTON { - /// @brief button is released JOYSTICK_STATE_BUTTON_UNPRESSED = 0x0, - - /// @brief button is pressed JOYSTICK_STATE_BUTTON_PRESSED = 0x1, } JOYSTICK_STATE_BUTTON; - ///@} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Event_JOYSTICK_STATE_HAT enum JOYSTICK_STATE_HAT - /// @ingroup cpp_kodi_addon_peripheral_Defs_Event - /// @brief **State hat**\n - /// States a D-pad (also called a hat) can have - ///@{ + typedef enum JOYSTICK_STATE_HAT { - /// @brief no directions are pressed JOYSTICK_STATE_HAT_UNPRESSED = 0x0, - - /// @brief only left is pressed JOYSTICK_STATE_HAT_LEFT = 0x1, - - /// @brief only right is pressed JOYSTICK_STATE_HAT_RIGHT = 0x2, - - /// @brief only up is pressed JOYSTICK_STATE_HAT_UP = 0x4, - - /// @brief only down is pressed JOYSTICK_STATE_HAT_DOWN = 0x8, - - /// @brief left and up is pressed JOYSTICK_STATE_HAT_LEFT_UP = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_UP, - - /// @brief left and down is pressed JOYSTICK_STATE_HAT_LEFT_DOWN = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_DOWN, - - /// @brief right and up is pressed JOYSTICK_STATE_HAT_RIGHT_UP = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_UP, - - /// @brief right and down is pressed JOYSTICK_STATE_HAT_RIGHT_DOWN = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_DOWN, } JOYSTICK_STATE_HAT; - ///@} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_peripheral_Defs_Event - /// @brief Axis value in the closed interval [-1.0, 1.0] - /// - /// The axis state uses the XInput coordinate system: - /// - Negative values signify down or to the left - /// - Positive values signify up or to the right - /// - typedef float JOYSTICK_STATE_AXIS; - //---------------------------------------------------------------------------- - //============================================================================ - /// @ingroup cpp_kodi_addon_peripheral_Defs_Event - /// @brief Motor value in the closed interval [0.0, 1.0] + typedef float JOYSTICK_STATE_AXIS; typedef float JOYSTICK_STATE_MOTOR; - //---------------------------------------------------------------------------- - /*! - * @brief Event information - */ - typedef struct PERIPHERAL_EVENT + struct PERIPHERAL_EVENT { - /*! @brief Index of the peripheral handling/receiving the event */ unsigned int peripheral_index; - - /*! @brief Type of the event used to determine which enum field to access below */ - PERIPHERAL_EVENT_TYPE type; - - /*! @brief The index of the event source */ + enum PERIPHERAL_EVENT_TYPE type; unsigned int driver_index; - JOYSTICK_STATE_BUTTON driver_button_state; - JOYSTICK_STATE_HAT driver_hat_state; + enum JOYSTICK_STATE_BUTTON driver_button_state; + enum JOYSTICK_STATE_HAT driver_hat_state; JOYSTICK_STATE_AXIS driver_axis_state; JOYSTICK_STATE_MOTOR motor_state; - } ATTRIBUTE_PACKED PERIPHERAL_EVENT; - - //} - - // @name Joystick types - //{ + }; - /*! - * @brief Info specific to joystick peripherals - */ - typedef struct JOYSTICK_INFO + struct JOYSTICK_INFO { - PERIPHERAL_INFO peripheral; /*!< @brief peripheral info for this joystick */ + struct PERIPHERAL_INFO peripheral; /*!< @brief peripheral info for this joystick */ char* provider; /*!< @brief name of the driver or interface providing the joystick */ int requested_port; /*!< @brief requested port number (such as for 360 controllers), or NO_PORT_REQUESTED */ unsigned int button_count; /*!< @brief number of buttons reported by the driver */ @@ -245,229 +116,101 @@ extern "C" unsigned int axis_count; /*!< @brief number of axes reported by the driver */ unsigned int motor_count; /*!< @brief number of motors reported by the driver */ bool supports_poweroff; /*!< @brief whether the joystick supports being powered off */ - } ATTRIBUTE_PACKED JOYSTICK_INFO; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_PRIMITIVE_TYPE enum JOYSTICK_DRIVER_PRIMITIVE_TYPE - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Driver primitive type**\n - /// Driver input primitives - /// - /// Mapping lower-level driver values to higher-level controller features is - /// non-injective; two triggers can share a single axis. - /// - /// To handle this, driver values are subdivided into "primitives" that map - /// injectively to higher-level features. - /// - ///@{ + }; + typedef enum JOYSTICK_DRIVER_PRIMITIVE_TYPE { - /// @brief Driver input primitive type unknown JOYSTICK_DRIVER_PRIMITIVE_TYPE_UNKNOWN, - - /// @brief Driver input primitive type button JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON, - - /// @brief Driver input primitive type hat direction JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION, - - /// @brief Driver input primitive type semiaxis JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS, - - /// @brief Driver input primitive type motor JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR, - - /// @brief Driver input primitive type key JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY, - - /// @brief Driver input primitive type mouse button JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON, - - /// @brief Driver input primitive type relative pointer direction JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION, } JOYSTICK_DRIVER_PRIMITIVE_TYPE; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Button primitive - */ - typedef struct JOYSTICK_DRIVER_BUTTON + struct JOYSTICK_DRIVER_BUTTON { int index; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_BUTTON; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_HAT_DIRECTION enum JOYSTICK_DRIVER_HAT_DIRECTION - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Driver direction**\n - /// Hat direction. - ///@{ + }; + typedef enum JOYSTICK_DRIVER_HAT_DIRECTION { - /// @brief Driver hat unknown JOYSTICK_DRIVER_HAT_UNKNOWN, - - /// @brief Driver hat left JOYSTICK_DRIVER_HAT_LEFT, - - /// @brief Driver hat right JOYSTICK_DRIVER_HAT_RIGHT, - - /// @brief Driver hat up JOYSTICK_DRIVER_HAT_UP, - - /// @brief Driver hat down JOYSTICK_DRIVER_HAT_DOWN, } JOYSTICK_DRIVER_HAT_DIRECTION; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Hat direction primitive - */ - typedef struct JOYSTICK_DRIVER_HAT + struct JOYSTICK_DRIVER_HAT { int index; - JOYSTICK_DRIVER_HAT_DIRECTION direction; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_HAT; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_SEMIAXIS_DIRECTION enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Driver direction**\n - /// Semiaxis direction. - ///@{ + enum JOYSTICK_DRIVER_HAT_DIRECTION direction; + }; + typedef enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION { - /// @brief negative half of the axis JOYSTICK_DRIVER_SEMIAXIS_NEGATIVE = -1, - - /// @brief unknown direction JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN = 0, - - /// @brief positive half of the axis JOYSTICK_DRIVER_SEMIAXIS_POSITIVE = 1, } JOYSTICK_DRIVER_SEMIAXIS_DIRECTION; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Semiaxis primitive - */ - typedef struct JOYSTICK_DRIVER_SEMIAXIS + struct JOYSTICK_DRIVER_SEMIAXIS { int index; int center; - JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction; + enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction; unsigned int range; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_SEMIAXIS; + }; - /*! - * @brief Motor primitive - */ - typedef struct JOYSTICK_DRIVER_MOTOR + struct JOYSTICK_DRIVER_MOTOR { int index; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOTOR; + }; - /*! - * @brief Keyboard key primitive - */ - typedef struct JOYSTICK_DRIVER_KEY + struct JOYSTICK_DRIVER_KEY { char keycode[16]; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_KEY; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_MOUSE_INDEX enum JOYSTICK_DRIVER_MOUSE_INDEX - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Buttons**\n - /// Mouse buttons. - ///@{ + }; + typedef enum JOYSTICK_DRIVER_MOUSE_INDEX { - /// @brief Mouse index unknown JOYSTICK_DRIVER_MOUSE_INDEX_UNKNOWN, - - /// @brief Mouse index left JOYSTICK_DRIVER_MOUSE_INDEX_LEFT, - - /// @brief Mouse index right JOYSTICK_DRIVER_MOUSE_INDEX_RIGHT, - - /// @brief Mouse index middle JOYSTICK_DRIVER_MOUSE_INDEX_MIDDLE, - - /// @brief Mouse index button 4 JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON4, - - /// @brief Mouse index button 5 JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON5, - - /// @brief Mouse index wheel up JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_UP, - - /// @brief Mouse index wheel down JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_DOWN, - - /// @brief Mouse index horizontal wheel left JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_LEFT, - - /// @brief Mouse index horizontal wheel right JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_RIGHT, } JOYSTICK_DRIVER_MOUSE_INDEX; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Mouse button primitive - */ - typedef struct JOYSTICK_DRIVER_MOUSE_BUTTON + struct JOYSTICK_DRIVER_MOUSE_BUTTON { - JOYSTICK_DRIVER_MOUSE_INDEX button; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOUSE_BUTTON; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_RELPOINTER_DIRECTION enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Pointer direction**\n - /// Relative pointer direction - ///@{ + enum JOYSTICK_DRIVER_MOUSE_INDEX button; + }; + typedef enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION { - /// @brief Relative pointer direction unknown JOYSTICK_DRIVER_RELPOINTER_UNKNOWN, - - /// @brief Relative pointer direction left JOYSTICK_DRIVER_RELPOINTER_LEFT, - - /// @brief Relative pointer direction right JOYSTICK_DRIVER_RELPOINTER_RIGHT, - - /// @brief Relative pointer direction up JOYSTICK_DRIVER_RELPOINTER_UP, - - /// @brief Relative pointer direction down JOYSTICK_DRIVER_RELPOINTER_DOWN, } JOYSTICK_DRIVER_RELPOINTER_DIRECTION; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Relative pointer direction primitive - */ - typedef struct JOYSTICK_DRIVER_RELPOINTER + struct JOYSTICK_DRIVER_RELPOINTER { - JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_RELPOINTER; + enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction; + }; - /*! - * @brief Driver primitive struct - */ - typedef struct JOYSTICK_DRIVER_PRIMITIVE + struct JOYSTICK_DRIVER_PRIMITIVE { - JOYSTICK_DRIVER_PRIMITIVE_TYPE type; + enum JOYSTICK_DRIVER_PRIMITIVE_TYPE type; union { struct JOYSTICK_DRIVER_BUTTON button; @@ -478,227 +221,166 @@ extern "C" struct JOYSTICK_DRIVER_MOUSE_BUTTON mouse; struct JOYSTICK_DRIVER_RELPOINTER relpointer; }; - } ATTRIBUTE_PACKED JOYSTICK_DRIVER_PRIMITIVE; - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_FEATURE_TYPE enum JOYSTICK_FEATURE_TYPE - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Feature type**\n - /// Controller feature. - /// - /// Controller features are an abstraction over driver values. Each feature - /// maps to one or more driver primitives. - /// - ///@{ + }; + typedef enum JOYSTICK_FEATURE_TYPE { - /// @brief Unknown type JOYSTICK_FEATURE_TYPE_UNKNOWN, - - /// @brief Type scalar JOYSTICK_FEATURE_TYPE_SCALAR, - - /// @brief Type analog stick JOYSTICK_FEATURE_TYPE_ANALOG_STICK, - - /// @brief Type accelerometer JOYSTICK_FEATURE_TYPE_ACCELEROMETER, - - /// @brief Type motor JOYSTICK_FEATURE_TYPE_MOTOR, - - /// @brief Type relative pointer JOYSTICK_FEATURE_TYPE_RELPOINTER, - - /// @brief Type absolut pointer JOYSTICK_FEATURE_TYPE_ABSPOINTER, - - /// @brief Type wheel JOYSTICK_FEATURE_TYPE_WHEEL, - - /// @brief Type throttle JOYSTICK_FEATURE_TYPE_THROTTLE, - - /// @brief Type key JOYSTICK_FEATURE_TYPE_KEY, } JOYSTICK_FEATURE_TYPE; - ///@} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_FEATURE_PRIMITIVE enum JOYSTICK_FEATURE_PRIMITIVE - /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick - /// @brief **Feature primitives**\n - /// Indices used to access a feature's driver primitives. - /// - ///@{ + typedef enum JOYSTICK_FEATURE_PRIMITIVE { - /// @brief Scalar feature (a button, hat direction or semiaxis) JOYSTICK_SCALAR_PRIMITIVE = 0, - /// @brief Analog stick up JOYSTICK_ANALOG_STICK_UP = 0, - /// @brief Analog stick down JOYSTICK_ANALOG_STICK_DOWN = 1, - /// @brief Analog stick right JOYSTICK_ANALOG_STICK_RIGHT = 2, - /// @brief Analog stick left JOYSTICK_ANALOG_STICK_LEFT = 3, - /// @brief Accelerometer X JOYSTICK_ACCELEROMETER_POSITIVE_X = 0, - /// @brief Accelerometer Y JOYSTICK_ACCELEROMETER_POSITIVE_Y = 1, - /// @brief Accelerometer Z JOYSTICK_ACCELEROMETER_POSITIVE_Z = 2, - /// @brief Motor JOYSTICK_MOTOR_PRIMITIVE = 0, - /// @brief Wheel left JOYSTICK_WHEEL_LEFT = 0, - /// @brief Wheel right JOYSTICK_WHEEL_RIGHT = 1, - /// @brief Throttle up JOYSTICK_THROTTLE_UP = 0, - /// @brief Throttle down JOYSTICK_THROTTLE_DOWN = 1, - /// @brief Key JOYSTICK_KEY_PRIMITIVE = 0, - /// @brief Mouse button JOYSTICK_MOUSE_BUTTON = 0, - /// @brief Relative pointer direction up JOYSTICK_RELPOINTER_UP = 0, - /// @brief Relative pointer direction down JOYSTICK_RELPOINTER_DOWN = 1, - /// @brief Relative pointer direction right JOYSTICK_RELPOINTER_RIGHT = 2, - /// @brief Relative pointer direction left JOYSTICK_RELPOINTER_LEFT = 3, - /// @brief Maximum number of primitives JOYSTICK_PRIMITIVE_MAX = 4, } JOYSTICK_FEATURE_PRIMITIVE; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Mapping between higher-level controller feature and its driver primitives - */ - typedef struct JOYSTICK_FEATURE + struct JOYSTICK_FEATURE { char* name; - JOYSTICK_FEATURE_TYPE type; + enum JOYSTICK_FEATURE_TYPE type; struct JOYSTICK_DRIVER_PRIMITIVE primitives[JOYSTICK_PRIMITIVE_MAX]; - } ATTRIBUTE_PACKED JOYSTICK_FEATURE; - //} - - typedef struct AddonProps_Peripheral - { - const char* user_path; /*!< @brief path to the user profile */ - const char* addon_path; /*!< @brief path to this add-on */ - } ATTRIBUTE_PACKED AddonProps_Peripheral; - - struct AddonInstance_Peripheral; - - typedef struct AddonToKodiFuncTable_Peripheral - { - KODI_HANDLE kodiInstance; - void (*trigger_scan)(void* kodiInstance); - void (*refresh_button_maps)(void* kodiInstance, - const char* device_name, - const char* controller_id); - unsigned int (*feature_count)(void* kodiInstance, - const char* controller_id, - JOYSTICK_FEATURE_TYPE type); - JOYSTICK_FEATURE_TYPE(*feature_type) - (void* kodiInstance, const char* controller_id, const char* feature_name); - } AddonToKodiFuncTable_Peripheral; - - //! @todo Mouse, light gun, multitouch - - typedef struct KodiToAddonFuncTable_Peripheral - { - KODI_HANDLE addonInstance; - - void(__cdecl* get_capabilities)(const struct AddonInstance_Peripheral* addonInstance, - struct PERIPHERAL_CAPABILITIES* capabilities); - PERIPHERAL_ERROR(__cdecl* perform_device_scan) - (const struct AddonInstance_Peripheral* addonInstance, - unsigned int* peripheral_count, - struct PERIPHERAL_INFO** scan_results); - void(__cdecl* free_scan_results)(const struct AddonInstance_Peripheral* addonInstance, - unsigned int peripheral_count, - struct PERIPHERAL_INFO* scan_results); - PERIPHERAL_ERROR(__cdecl* get_events) - (const struct AddonInstance_Peripheral* addonInstance, - unsigned int* event_count, - struct PERIPHERAL_EVENT** events); - void(__cdecl* free_events)(const struct AddonInstance_Peripheral* addonInstance, - unsigned int event_count, - struct PERIPHERAL_EVENT* events); - bool(__cdecl* send_event)(const struct AddonInstance_Peripheral* addonInstance, - const struct PERIPHERAL_EVENT* event); - - /// @name Joystick operations - ///{ - PERIPHERAL_ERROR(__cdecl* get_joystick_info) - (const struct AddonInstance_Peripheral* addonInstance, - unsigned int index, - struct JOYSTICK_INFO* info); - void(__cdecl* free_joystick_info)(const struct AddonInstance_Peripheral* addonInstance, - struct JOYSTICK_INFO* info); - PERIPHERAL_ERROR(__cdecl* get_features) - (const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick, - const char* controller_id, - unsigned int* feature_count, - struct JOYSTICK_FEATURE** features); - void(__cdecl* free_features)(const struct AddonInstance_Peripheral* addonInstance, - unsigned int feature_count, - struct JOYSTICK_FEATURE* features); - PERIPHERAL_ERROR(__cdecl* map_features) - (const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick, - const char* controller_id, - unsigned int feature_count, - const struct JOYSTICK_FEATURE* features); - PERIPHERAL_ERROR(__cdecl* get_ignored_primitives) - (const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick, - unsigned int* feature_count, - struct JOYSTICK_DRIVER_PRIMITIVE** primitives); - void(__cdecl* free_primitives)(const struct AddonInstance_Peripheral* addonInstance, - unsigned int, - struct JOYSTICK_DRIVER_PRIMITIVE* primitives); - PERIPHERAL_ERROR(__cdecl* set_ignored_primitives) - (const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick, - unsigned int primitive_count, - const struct JOYSTICK_DRIVER_PRIMITIVE* primitives); - void(__cdecl* save_button_map)(const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick); - void(__cdecl* revert_button_map)(const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick); - void(__cdecl* reset_button_map)(const struct AddonInstance_Peripheral* addonInstance, - const struct JOYSTICK_INFO* joystick, - const char* controller_id); - void(__cdecl* power_off_joystick)(const struct AddonInstance_Peripheral* addonInstance, - unsigned int index); - ///} - } KodiToAddonFuncTable_Peripheral; - - typedef struct AddonInstance_Peripheral + }; + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // General interface functions + typedef KODI_ADDON_PERIPHERAL_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_CREATE_V1)( + KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_DESTROY_V1)(KODI_ADDON_PERIPHERAL_HDL hdl); + + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_CAPABILITIES* capabilities); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO** scan_results, size_t* peripheral_count); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_INFO* scan_results, size_t peripheral_count); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, struct PERIPHERAL_EVENT** events, size_t* event_count); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT* events, + size_t event_count); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + const struct PERIPHERAL_EVENT* event); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Joystick operations + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index, struct JOYSTICK_INFO* info); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_INFO* info); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + struct JOYSTICK_FEATURE** features, + size_t* feature_count); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_FEATURE* features, + size_t feature_count); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + const struct JOYSTICK_FEATURE* features, + size_t feature_count); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + struct JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); + typedef enum PERIPHERAL_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1)( + KODI_ADDON_PERIPHERAL_HDL hdl, const struct JOYSTICK_INFO* joystick, const char* controller_id); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1)(KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index); + + typedef struct KODI_ADDON_PERIPHERAL_FUNC { - struct AddonProps_Peripheral* props; - struct AddonToKodiFuncTable_Peripheral* toKodi; - struct KodiToAddonFuncTable_Peripheral* toAddon; - } AddonInstance_Peripheral; + PFN_KODI_ADDON_PERIPHERAL_CREATE_V1 create; + PFN_KODI_ADDON_PERIPHERAL_DESTROY_V1 destroy; + + PFN_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1 get_capabilities; + PFN_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1 perform_device_scan; + PFN_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1 free_scan_results; + PFN_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1 get_events; + PFN_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1 free_events; + PFN_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1 send_event; + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Joystick operations + PFN_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1 get_joystick_info; + PFN_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1 free_joystick_info; + PFN_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1 get_features; + PFN_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1 free_features; + PFN_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1 map_features; + PFN_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1 get_ignored_primitives; + PFN_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1 free_primitives; + PFN_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1 set_ignored_primitives; + PFN_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1 save_button_map; + PFN_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1 revert_button_map; + PFN_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1 reset_button_map; + PFN_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1 power_off_joystick; + } KODI_ADDON_PERIPHERAL_FUNC; + + ATTR_DLL_EXPORT void kodi_addon_peripheral_trigger_scan(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_peripheral_refresh_button_maps(KODI_OWN_HDL hdl, + const char* device_name, + const char* controller_id) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_addon_peripheral_feature_count(KODI_OWN_HDL hdl, + const char* controller_id, + enum JOYSTICK_FEATURE_TYPE type) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT enum JOYSTICK_FEATURE_TYPE kodi_addon_peripheral_feature_type( + KODI_OWN_HDL hdl, const char* controller_id, const char* feature_name) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h index 48eb9922cf7c6..97c48e218b767 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h @@ -9,7 +9,7 @@ #ifndef C_API_ADDONINSTANCE_PVR_H #define C_API_ADDONINSTANCE_PVR_H -#include "../../AddonBase.h" +#include "../addon_base.h" #include "pvr/pvr_channel_groups.h" #include "pvr/pvr_channels.h" #include "pvr/pvr_defines.h" @@ -22,319 +22,324 @@ #include "pvr/pvr_stream.h" #include "pvr/pvr_timers.h" -//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -// "C" main interface function tables between Kodi and addon -// -// Values related to all parts and not used direct on addon, are to define here. -// #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - /*! - * @internal - * @brief PVR "C" basis API interface - * - * This field contains things that are exchanged between Kodi and Addon - * and is the basis of the PVR-side "C" API. - * - * @warning Care should be taken when making changes in this fields!\n - * Changes can destroy API in addons that have already been created. If a - * necessary change or new feature is added, the version of the PVR - * at @ref ADDON_INSTANCE_VERSION_PVR_MIN must be increased too.\n - * \n - * Conditional changes can be made in some places, without min PVR version - * increase. The add-on should then use CreateInstanceEx and add partial tests - * for this in the C++ header. - * - * Have by add of new parts a look about **Doxygen** `\\ingroup`, so that - * added parts included in documentation. - * - * If you add addon side related documentation, where his dev need know, - * use `///`. For parts only for Kodi make it like here. - * - * @endinternal - */ - - struct AddonInstance_PVR; - - /*! - * @brief Structure to define typical standard values - */ - typedef struct AddonProperties_PVR - { - const char* strUserPath; - const char* strClientPath; - int iEpgMaxFutureDays; - int iEpgMaxPastDays; - } AddonProperties_PVR; - - /*! - * @brief Structure to transfer the methods from Kodi to addon - */ - typedef struct AddonToKodiFuncTable_PVR - { - // Pointer inside Kodi where used from him to find his class - KODI_HANDLE kodiInstance; - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // General callback functions - void (*AddMenuHook)(void* kodiInstance, const struct PVR_MENUHOOK* hook); - void (*RecordingNotification)(void* kodiInstance, - const char* name, - const char* fileName, - bool on); - void (*ConnectionStateChange)(void* kodiInstance, - const char* strConnectionString, - enum PVR_CONNECTION_STATE newState, - const char* strMessage); - void (*EpgEventStateChange)(void* kodiInstance, - struct EPG_TAG* tag, - enum EPG_EVENT_STATE newState); + typedef void* KODI_ADDON_PVR_HDL; + typedef void* KODI_ADDON_PVR_TRANSFER_HDL; + + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1)( + KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1)( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1)( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1)( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1)( + KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1)( + KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Channel interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1)( + KODI_ADDON_PVR_HDL hdl, int* amount); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_V1)( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1)( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1)( + KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_SIGNAL_STATUS* signal_status); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1)( + KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_DESCRAMBLE_INFO* descramble_info); //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Transfer functions where give data back to Kodi, e.g. GetChannels calls TransferChannelEntry - void (*TransferChannelEntry)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_CHANNEL* chan); - void (*TransferProviderEntry)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_PROVIDER* chanProvider); - void (*TransferChannelGroup)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_CHANNEL_GROUP* group); - void (*TransferChannelGroupMember)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_CHANNEL_GROUP_MEMBER* member); - void (*TransferEpgEntry)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct EPG_TAG* epgentry); - void (*TransferRecordingEntry)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_RECORDING* recording); - void (*TransferTimerEntry)(void* kodiInstance, - const ADDON_HANDLE handle, - const struct PVR_TIMER* timer); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Kodi inform interface functions - void (*TriggerChannelUpdate)(void* kodiInstance); - void (*TriggerProvidersUpdate)(void* kodiInstance); - void (*TriggerChannelGroupsUpdate)(void* kodiInstance); - void (*TriggerEpgUpdate)(void* kodiInstance, unsigned int iChannelUid); - void (*TriggerRecordingUpdate)(void* kodiInstance); - void (*TriggerTimerUpdate)(void* kodiInstance); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Stream demux interface functions - void (*FreeDemuxPacket)(void* kodiInstance, struct DEMUX_PACKET* pPacket); - struct DEMUX_PACKET* (*AllocateDemuxPacket)(void* kodiInstance, int iDataSize); - struct PVR_CODEC (*GetCodecByName)(const void* kodiInstance, const char* strCodecName); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // New functions becomes added below and can be on another API change (where - // breaks min API version) moved up. - } AddonToKodiFuncTable_PVR; + // Provider interface functions - /*! - * @brief Structure to transfer the methods from addon to Kodi - */ - typedef struct KodiToAddonFuncTable_PVR + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1)( + KODI_ADDON_PVR_HDL hdl, int* amount); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1)( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Channel group interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1)( + KODI_ADDON_PVR_HDL hdl, int* amount); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1)( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1)( + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Channel edit interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1)( + KODI_ADDON_PVR_HDL hdl); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_CHANNEL* channel); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // EPG interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1)( + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + int channel_uid, + time_t start, + time_t end); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1)( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_recordable); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1)( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_playable); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1)( + KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_EDL_ENTRY edl[], size_t* size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1)( + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1)( + KODI_ADDON_PVR_HDL hdl, int past_days); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1)( + KODI_ADDON_PVR_HDL hdl, int future_days); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct EPG_TAG* tag); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Recording interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1)( + KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1)( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool deleted); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1)( + KODI_ADDON_PVR_HDL hdl); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int count); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int last_played_position); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int* last_played_position); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1)( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_EDL_ENTRY edl[], + size_t* size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int64_t* size); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1)( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1)( + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_RECORDING* recording); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Timer interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1)( + KODI_ADDON_PVR_HDL hdl, struct PVR_TIMER_TYPE types[], size_t* types_count); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1)( + KODI_ADDON_PVR_HDL hdl, int* amount); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_V1)( + KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ADD_TIMER_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_TIMER_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer, bool force_delete); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1)( + KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_TIMER* timer); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Powersaving interface functions + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1)( + KODI_ADDON_PVR_HDL hdl); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1)( + KODI_ADDON_PVR_HDL hdl); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1)( + KODI_ADDON_PVR_HDL hdl); + typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1)( + KODI_ADDON_PVR_HDL hdl); + + typedef struct KODI_ADDON_PVR_FUNC { - // Pointer inside addon where used on them to find his instance class (currently unused!) - KODI_HANDLE addonInstance; - //--==----==----==----==----==----==----==----==----==----==----==----==----== // General interface functions - enum PVR_ERROR(__cdecl* GetCapabilities)(const struct AddonInstance_PVR*, - struct PVR_ADDON_CAPABILITIES*); - enum PVR_ERROR(__cdecl* GetBackendName)(const struct AddonInstance_PVR*, char*, int); - enum PVR_ERROR(__cdecl* GetBackendVersion)(const struct AddonInstance_PVR*, char*, int); - enum PVR_ERROR(__cdecl* GetBackendHostname)(const struct AddonInstance_PVR*, char*, int); - enum PVR_ERROR(__cdecl* GetConnectionString)(const struct AddonInstance_PVR*, char*, int); - enum PVR_ERROR(__cdecl* GetDriveSpace)(const struct AddonInstance_PVR*, uint64_t*, uint64_t*); - enum PVR_ERROR(__cdecl* CallSettingsMenuHook)(const struct AddonInstance_PVR*, - const struct PVR_MENUHOOK*); + PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1 get_capabilities; + PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1 get_backend_name; + PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1 get_backend_version; + PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1 get_backend_hostname; + PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1 get_connection_string; + PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1 get_drive_space; + PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1 call_settings_menu_hook; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Channel interface functions - - enum PVR_ERROR(__cdecl* GetChannelsAmount)(const struct AddonInstance_PVR*, int*); - enum PVR_ERROR(__cdecl* GetChannels)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool); - enum PVR_ERROR(__cdecl* GetChannelStreamProperties)(const struct AddonInstance_PVR*, - const struct PVR_CHANNEL*, - struct PVR_NAMED_VALUE*, - unsigned int*); - enum PVR_ERROR(__cdecl* GetSignalStatus)(const struct AddonInstance_PVR*, - int, - struct PVR_SIGNAL_STATUS*); - enum PVR_ERROR(__cdecl* GetDescrambleInfo)(const struct AddonInstance_PVR*, - int, - struct PVR_DESCRAMBLE_INFO*); + PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1 get_channels_amount; + PFN_KODI_ADDON_PVR_GET_CHANNELS_V1 get_channels; + PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1 get_channel_stream_properties; + PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1 get_signal_status; + PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1 get_descramble_info; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Provider interface functions - enum PVR_ERROR(__cdecl* GetProvidersAmount)(const struct AddonInstance_PVR*, int*); - enum PVR_ERROR(__cdecl* GetProviders)(const struct AddonInstance_PVR*, ADDON_HANDLE); + PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1 get_providers_amount; + PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1 get_providers; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Channel group interface functions - enum PVR_ERROR(__cdecl* GetChannelGroupsAmount)(const struct AddonInstance_PVR*, int*); - enum PVR_ERROR(__cdecl* GetChannelGroups)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool); - enum PVR_ERROR(__cdecl* GetChannelGroupMembers)(const struct AddonInstance_PVR*, - ADDON_HANDLE, - const struct PVR_CHANNEL_GROUP*); + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1 get_channel_groups_amount; + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1 get_channel_groups; + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1 get_channel_group_members; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Channel edit interface functions - enum PVR_ERROR(__cdecl* DeleteChannel)(const struct AddonInstance_PVR*, - const struct PVR_CHANNEL*); - enum PVR_ERROR(__cdecl* RenameChannel)(const struct AddonInstance_PVR*, - const struct PVR_CHANNEL*); - enum PVR_ERROR(__cdecl* OpenDialogChannelSettings)(const struct AddonInstance_PVR*, - const struct PVR_CHANNEL*); - enum PVR_ERROR(__cdecl* OpenDialogChannelAdd)(const struct AddonInstance_PVR*, - const struct PVR_CHANNEL*); - enum PVR_ERROR(__cdecl* OpenDialogChannelScan)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* CallChannelMenuHook)(const struct AddonInstance_PVR*, - const PVR_MENUHOOK*, - const PVR_CHANNEL*); + PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1 delete_channel; + PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1 rename_channel; + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1 open_dialog_channel_settings; + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1 open_dialog_channel_add; + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1 open_dialog_channel_scan; + PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1 call_channel_menu_hook; //--==----==----==----==----==----==----==----==----==----==----==----==----== // EPG interface functions - enum PVR_ERROR(__cdecl* GetEPGForChannel)( - const struct AddonInstance_PVR*, ADDON_HANDLE, int, time_t, time_t); - enum PVR_ERROR(__cdecl* IsEPGTagRecordable)(const struct AddonInstance_PVR*, - const struct EPG_TAG*, - bool*); - enum PVR_ERROR(__cdecl* IsEPGTagPlayable)(const struct AddonInstance_PVR*, - const struct EPG_TAG*, - bool*); - enum PVR_ERROR(__cdecl* GetEPGTagEdl)(const struct AddonInstance_PVR*, - const struct EPG_TAG*, - struct PVR_EDL_ENTRY[], - int*); - enum PVR_ERROR(__cdecl* GetEPGTagStreamProperties)(const struct AddonInstance_PVR*, - const struct EPG_TAG*, - struct PVR_NAMED_VALUE*, - unsigned int*); - enum PVR_ERROR(__cdecl* SetEPGMaxPastDays)(const struct AddonInstance_PVR*, int); - enum PVR_ERROR(__cdecl* SetEPGMaxFutureDays)(const struct AddonInstance_PVR*, int); - enum PVR_ERROR(__cdecl* CallEPGMenuHook)(const struct AddonInstance_PVR*, - const struct PVR_MENUHOOK*, - const struct EPG_TAG*); + PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1 get_epg_for_channel; + PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1 is_epg_tag_recordable; + PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1 is_epg_tag_playable; + PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1 get_epg_tag_edl; + PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1 get_epg_tag_stream_properties; + PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1 set_epg_max_past_days; + PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1 set_epg_max_future_days; + PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1 call_epg_menu_hook; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Recording interface functions - enum PVR_ERROR(__cdecl* GetRecordingsAmount)(const struct AddonInstance_PVR*, bool, int*); - enum PVR_ERROR(__cdecl* GetRecordings)(const struct AddonInstance_PVR*, ADDON_HANDLE, bool); - enum PVR_ERROR(__cdecl* DeleteRecording)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*); - enum PVR_ERROR(__cdecl* UndeleteRecording)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*); - enum PVR_ERROR(__cdecl* DeleteAllRecordingsFromTrash)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* RenameRecording)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*); - enum PVR_ERROR(__cdecl* SetRecordingLifetime)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*); - enum PVR_ERROR(__cdecl* SetRecordingPlayCount)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*, - int); - enum PVR_ERROR(__cdecl* SetRecordingLastPlayedPosition)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*, - int); - enum PVR_ERROR(__cdecl* GetRecordingLastPlayedPosition)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*, - int*); - enum PVR_ERROR(__cdecl* GetRecordingEdl)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*, - struct PVR_EDL_ENTRY[], - int*); - enum PVR_ERROR(__cdecl* GetRecordingSize)(const struct AddonInstance_PVR*, - const PVR_RECORDING*, - int64_t*); - enum PVR_ERROR(__cdecl* GetRecordingStreamProperties)(const struct AddonInstance_PVR*, - const struct PVR_RECORDING*, - struct PVR_NAMED_VALUE*, - unsigned int*); - enum PVR_ERROR(__cdecl* CallRecordingMenuHook)(const struct AddonInstance_PVR*, - const struct PVR_MENUHOOK*, - const struct PVR_RECORDING*); + PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1 get_recordings_amount; + PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1 get_recordings; + PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1 delete_recording; + PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1 undelete_recording; + PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1 delete_all_recordings_from_trash; + PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1 rename_recording; + PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1 set_recording_lifetime; + PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1 set_recording_play_count; + PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1 set_recording_last_played_position; + PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1 get_recording_last_played_position; + PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1 get_recording_edl; + PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1 get_recording_size; + PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1 get_recording_stream_properties; + PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1 call_recording_menu_hook; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Timer interface functions - enum PVR_ERROR(__cdecl* GetTimerTypes)(const struct AddonInstance_PVR*, - struct PVR_TIMER_TYPE[], - int*); - enum PVR_ERROR(__cdecl* GetTimersAmount)(const struct AddonInstance_PVR*, int*); - enum PVR_ERROR(__cdecl* GetTimers)(const struct AddonInstance_PVR*, ADDON_HANDLE); - enum PVR_ERROR(__cdecl* AddTimer)(const struct AddonInstance_PVR*, const struct PVR_TIMER*); - enum PVR_ERROR(__cdecl* DeleteTimer)(const struct AddonInstance_PVR*, - const struct PVR_TIMER*, - bool); - enum PVR_ERROR(__cdecl* UpdateTimer)(const struct AddonInstance_PVR*, const struct PVR_TIMER*); - enum PVR_ERROR(__cdecl* CallTimerMenuHook)(const struct AddonInstance_PVR*, - const struct PVR_MENUHOOK*, - const struct PVR_TIMER*); + PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1 get_timer_types; + PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1 get_timers_amount; + PFN_KODI_ADDON_PVR_GET_TIMERS_V1 get_timers; + PFN_KODI_ADDON_PVR_ADD_TIMER_V1 add_timer; + PFN_KODI_ADDON_PVR_DELETE_TIMER_V1 delete_timer; + PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1 update_timer; + PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1 call_timer_menu_hook; //--==----==----==----==----==----==----==----==----==----==----==----==----== // Powersaving interface functions - enum PVR_ERROR(__cdecl* OnSystemSleep)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* OnSystemWake)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* OnPowerSavingActivated)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* OnPowerSavingDeactivated)(const struct AddonInstance_PVR*); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Live stream read interface functions - bool(__cdecl* OpenLiveStream)(const struct AddonInstance_PVR*, const struct PVR_CHANNEL*); - void(__cdecl* CloseLiveStream)(const struct AddonInstance_PVR*); - int(__cdecl* ReadLiveStream)(const struct AddonInstance_PVR*, unsigned char*, unsigned int); - int64_t(__cdecl* SeekLiveStream)(const struct AddonInstance_PVR*, int64_t, int); - int64_t(__cdecl* LengthLiveStream)(const struct AddonInstance_PVR*); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Recording stream read interface functions - bool(__cdecl* OpenRecordedStream)(const struct AddonInstance_PVR*, const struct PVR_RECORDING*); - void(__cdecl* CloseRecordedStream)(const struct AddonInstance_PVR*); - int(__cdecl* ReadRecordedStream)(const struct AddonInstance_PVR*, unsigned char*, unsigned int); - int64_t(__cdecl* SeekRecordedStream)(const struct AddonInstance_PVR*, int64_t, int); - int64_t(__cdecl* LengthRecordedStream)(const struct AddonInstance_PVR*); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Stream demux interface functions - enum PVR_ERROR(__cdecl* GetStreamProperties)(const struct AddonInstance_PVR*, - struct PVR_STREAM_PROPERTIES*); - struct DEMUX_PACKET*(__cdecl* DemuxRead)(const struct AddonInstance_PVR*); - void(__cdecl* DemuxReset)(const struct AddonInstance_PVR*); - void(__cdecl* DemuxAbort)(const struct AddonInstance_PVR*); - void(__cdecl* DemuxFlush)(const struct AddonInstance_PVR*); - void(__cdecl* SetSpeed)(const struct AddonInstance_PVR*, int); - void(__cdecl* FillBuffer)(const struct AddonInstance_PVR*, bool); - bool(__cdecl* SeekTime)(const struct AddonInstance_PVR*, double, bool, double*); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // General stream interface functions - bool(__cdecl* CanPauseStream)(const struct AddonInstance_PVR*); - void(__cdecl* PauseStream)(const struct AddonInstance_PVR*, bool); - bool(__cdecl* CanSeekStream)(const struct AddonInstance_PVR*); - bool(__cdecl* IsRealTimeStream)(const struct AddonInstance_PVR*); - enum PVR_ERROR(__cdecl* GetStreamTimes)(const struct AddonInstance_PVR*, - struct PVR_STREAM_TIMES*); - enum PVR_ERROR(__cdecl* GetStreamReadChunkSize)(const struct AddonInstance_PVR*, int*); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // New functions becomes added below and can be on another API change (where - // breaks min API version) moved up. - } KodiToAddonFuncTable_PVR; - - typedef struct AddonInstance_PVR - { - struct AddonProperties_PVR* props; - struct AddonToKodiFuncTable_PVR* toKodi; - struct KodiToAddonFuncTable_PVR* toAddon; - } AddonInstance_PVR; + PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1 on_system_sleep; + PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1 on_system_wake; + PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1 on_power_saving_activated; + PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1 on_power_saving_deactivated; + } KODI_ADDON_PVR_FUNC; + + ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_OWN_HDL hdl, + const struct PVR_MENUHOOK* hook) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_OWN_HDL hdl, + const char* name, + const char* fileName, + bool on) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_connection_state_change(KODI_OWN_HDL hdl, + const char* strConnectionString, + enum PVR_CONNECTION_STATE newState, + const char* strMessage) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_epg_event_state_change(KODI_OWN_HDL hdl, + struct EPG_TAG* tag, + enum EPG_EVENT_STATE newState) + __INTRODUCED_IN_KODI(1); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Transfer functions where give data back to Kodi, e.g. GetChannels calls TransferChannelEntry + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_entry( + KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL* chan) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_provider_entry( + KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_PROVIDER* chanProvider) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group_member( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP_MEMBER* member) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_epg_entry(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct EPG_TAG* epgentry) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_recording_entry( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_RECORDING* recording) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_timer_entry(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_TIMER* timer) + __INTRODUCED_IN_KODI(1); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Kodi inform interface functions + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_OWN_HDL hdl, unsigned int iChannelUid) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt index e29b87d66f5e0..fb0d87742b101 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr/CMakeLists.txt @@ -1,15 +1,20 @@ -set(HEADERS pvr_channel_groups.h - pvr_providers.h - pvr_channels.h - pvr_defines.h - pvr_edl.h - pvr_epg.h - pvr_general.h - pvr_menu_hook.h - pvr_recordings.h - pvr_stream.h - pvr_timers.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_addon-instance_pvr) +set(HEADERS + pvr_channel_groups.h + pvr_providers.h + pvr_channels.h + pvr_defines.h + pvr_edl.h + pvr_epg.h + pvr_general.h + pvr_menu_hook.h + pvr_recordings.h + pvr_stream.h + pvr_timers.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_addon-instance_pvr) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h index 90f971afdf803..6c32debad62a0 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/screensaver.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2020 Team Kodi + * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -16,60 +16,37 @@ extern "C" { #endif /* __cplusplus */ - struct AddonInstance_Screensaver; + typedef void* KODI_ADDON_SCREENSAVER_HDL; - /*! - * @brief Screensaver properties - * - * Not to be used outside this header. - */ - typedef struct AddonProps_Screensaver + struct SCREENSAVER_PROPS { - ADDON_HARDWARE_CONTEXT device; + ADDON_HARDWARE_CONTEXT2 device; int x; int y; int width; int height; float pixelRatio; - const char* name; - const char* presets; - const char* profile; - } AddonProps_Screensaver; - - /*! - * @brief Screensaver callbacks - * - * Not to be used outside this header. - */ - typedef struct AddonToKodiFuncTable_Screensaver - { - KODI_HANDLE kodiInstance; - } AddonToKodiFuncTable_Screensaver; - - /*! - * @brief Screensaver function hooks - * - * Not to be used outside this header. - */ - typedef struct KodiToAddonFuncTable_Screensaver - { - KODI_HANDLE addonInstance; - bool(__cdecl* Start)(struct AddonInstance_Screensaver* instance); - void(__cdecl* Stop)(struct AddonInstance_Screensaver* instance); - void(__cdecl* Render)(struct AddonInstance_Screensaver* instance); - } KodiToAddonFuncTable_Screensaver; - - /*! - * @brief Screensaver instance - * - * Not to be used outside this header. - */ - typedef struct AddonInstance_Screensaver + char* name; + char* presets; + char* profile; + }; + + typedef KODI_ADDON_SCREENSAVER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + + typedef struct KODI_ADDON_SCREENSAVER_FUNC { - struct AddonProps_Screensaver* props; - struct AddonToKodiFuncTable_Screensaver* toKodi; - struct KodiToAddonFuncTable_Screensaver* toAddon; - } AddonInstance_Screensaver; + PFN_KODI_ADDON_SCREENSAVER_CREATE_V1 create; + PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1 destroy; + PFN_KODI_ADDON_SCREENSAVER_START_V1 start; + PFN_KODI_ADDON_SCREENSAVER_STOP_V1 stop; + PFN_KODI_ADDON_SCREENSAVER_RENDER_V1 render; + } KODI_ADDON_SCREENSAVER_FUNC; + + ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties(KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h index 7021c0f75c8b8..5d96b82f49574 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/vfs.h @@ -1,5 +1,6 @@ /* - * Copyright (C) 2005-2020 Team Kodi + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. @@ -11,14 +12,16 @@ #include "../addon_base.h" #include "../filesystem.h" -#define VFS_FILE_HANDLE void* - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - struct VFSURL + typedef void* KODI_ADDON_VFS_HDL; + typedef void* KODI_VFS_FILE_HDL; + typedef void* KODI_CTX_CB_HDL; + + struct VFS_URL { const char* url; const char* domain; @@ -33,112 +36,122 @@ extern "C" const char* protocol; }; - typedef struct VFSGetDirectoryCallbacks /* internal */ - { - bool(__cdecl* get_keyboard_input)(KODI_HANDLE ctx, - const char* heading, - char** input, - bool hidden_input); - void(__cdecl* set_error_dialog)(KODI_HANDLE ctx, - const char* heading, - const char* line1, - const char* line2, - const char* line3); - void(__cdecl* require_authentication)(KODI_HANDLE ctx, const char* url); - KODI_HANDLE ctx; - } VFSGetDirectoryCallbacks; - - typedef struct AddonProps_VFSEntry /* internal */ - { - int dummy; - } AddonProps_VFSEntry; + typedef KODI_ADDON_VFS_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DESTROY_V1)(KODI_ADDON_VFS_HDL hdl); - typedef struct AddonToKodiFuncTable_VFSEntry /* internal */ - { - KODI_HANDLE kodiInstance; - } AddonToKodiFuncTable_VFSEntry; + typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); + typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( + KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, bool overwrite); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); + typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_READ_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t buf_size); + typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_WRITE_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t buf_size); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_SEEK_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1)( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1)( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, struct VFS_CACHE_STATUS* status); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)( + KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, unsigned int rate); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)(KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); - struct AddonInstance_VFSEntry; - typedef struct KodiToAddonFuncTable_VFSEntry /* internal */ - { - KODI_HANDLE addonInstance; - - VFS_FILE_HANDLE(__cdecl* open) - (const struct AddonInstance_VFSEntry* instance, const struct VFSURL* url); - VFS_FILE_HANDLE(__cdecl* open_for_write) - (const struct AddonInstance_VFSEntry* instance, const struct VFSURL* url, bool overwrite); - ssize_t(__cdecl* read)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - uint8_t* buffer, - size_t buf_size); - ssize_t(__cdecl* write)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - const uint8_t* buffer, - size_t buf_size); - int64_t(__cdecl* seek)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t position, - int whence); - int(__cdecl* truncate)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t size); - int64_t(__cdecl* get_length)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context); - int64_t(__cdecl* get_position)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context); - int(__cdecl* get_chunk_size)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context); - bool(__cdecl* io_control_get_seek_possible)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context); - bool(__cdecl* io_control_get_cache_status)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - struct VFS_CACHE_STATUS_DATA* status); - bool(__cdecl* io_control_set_cache_rate)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - unsigned int rate); - bool(__cdecl* io_control_set_retry)(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - bool retry); - int(__cdecl* stat)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url, - struct STAT_STRUCTURE* buffer); - bool(__cdecl* close)(const struct AddonInstance_VFSEntry* instance, VFS_FILE_HANDLE context); - - bool(__cdecl* exists)(const struct AddonInstance_VFSEntry* instance, const struct VFSURL* url); - void(__cdecl* clear_out_idle)(const struct AddonInstance_VFSEntry* instance); - void(__cdecl* disconnect_all)(const struct AddonInstance_VFSEntry* instance); - bool(__cdecl* delete_it)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url); - bool(__cdecl* rename)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url, - const struct VFSURL* url2); - bool(__cdecl* directory_exists)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url); - bool(__cdecl* remove_directory)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url); - bool(__cdecl* create_directory)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url); - bool(__cdecl* get_directory)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url, - struct VFSDirEntry** entries, - int* num_entries, - struct VFSGetDirectoryCallbacks* callbacks); - bool(__cdecl* contains_files)(const struct AddonInstance_VFSEntry* instance, - const struct VFSURL* url, - struct VFSDirEntry** entries, - int* num_entries, - char* rootpath); - void(__cdecl* free_directory)(const struct AddonInstance_VFSEntry* instance, - struct VFSDirEntry* entries, - int num_entries); - } KodiToAddonFuncTable_VFSEntry; - - typedef struct AddonInstance_VFSEntry /* internal */ + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(KODI_ADDON_VFS_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(KODI_ADDON_VFS_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + const struct VFS_URL* url2); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1)( + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath); + + typedef struct KODI_ADDON_VFS_FUNC { - struct AddonProps_VFSEntry* props; - struct AddonToKodiFuncTable_VFSEntry* toKodi; - struct KodiToAddonFuncTable_VFSEntry* toAddon; - } AddonInstance_VFSEntry; + PFN_KODI_ADDON_VFS_CREATE_V1 create; + PFN_KODI_ADDON_VFS_DESTROY_V1 destroy; + + PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1 clear_out_idle; + PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1 disconnect_all; + + PFN_KODI_ADDON_VFS_FILE_OPEN_V1 file_open; + PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1 file_open_for_write; + PFN_KODI_ADDON_VFS_FILE_CLOSE_V1 file_close; + PFN_KODI_ADDON_VFS_FILE_READ_V1 file_read; + PFN_KODI_ADDON_VFS_FILE_WRITE_V1 file_write; + PFN_KODI_ADDON_VFS_FILE_SEEK_V1 file_seek; + PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1 file_truncate; + PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1 file_get_length; + PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1 file_get_position; + PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1 file_get_chunk_size; + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1 file_io_control_get_seek_possible; + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1 file_io_control_get_cache_status; + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1 file_io_control_set_cache_rate; + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1 file_io_control_set_retry; + + PFN_KODI_ADDON_VFS_STAT_V1 stat; + PFN_KODI_ADDON_VFS_EXISTS_V1 exists; + PFN_KODI_ADDON_VFS_DELETE_IT_V1 delete_it; + PFN_KODI_ADDON_VFS_RENAME_V1 rename; + + PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1 directory_exists; + PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1 directory_remove; + PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1 directory_create; + PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1 directory_get; + PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1 directory_contains_files; + } KODI_ADDON_VFS_FUNC; + + ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + char** input, + bool hidden_input) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__set_error_dialog(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + const char* line1, + const char* line2, + const char* line3) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__require_authentication(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* url) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h deleted file mode 100644 index 02d8b06d5f055..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (C) 2017-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_ADDONINSTANCE_VIDEOCODEC_H -#define C_API_ADDONINSTANCE_VIDEOCODEC_H - -#include "../addon_base.h" -#include "inputstream/demux_packet.h" -#include "inputstream/stream_codec.h" -#include "inputstream/stream_crypto.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec_Defs - /// @brief Return values used by video decoder interface - enum VIDEOCODEC_RETVAL - { - /// @brief Noop - VC_NONE = 0, - - /// @brief An error occured, no other messages will be returned - VC_ERROR, - - /// @brief The decoder needs more data - VC_BUFFER, - - /// @brief The decoder got a picture - VC_PICTURE, - - /// @brief The decoder signals EOF - VC_EOF, - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata - /// @brief The video stream representations requested by Kodi - /// - enum VIDEOCODEC_FORMAT - { - /// @brief Unknown types, this is used to declare the end of a list of - /// requested types - VIDEOCODEC_FORMAT_UNKNOWN = 0, - - /// @brief YV12 4:2:0 YCrCb planar format - VIDEOCODEC_FORMAT_YV12, - - /// @brief These formats are identical to YV12 except that the U and V plane - /// order is reversed. - VIDEOCODEC_FORMAT_I420, - - /// @brief The maximum value to use in a list. - VIDEOCODEC_FORMAT_MAXFORMATS - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata - /// @brief Video codec types that can be requested from Kodi - /// - enum VIDEOCODEC_TYPE - { - /// @brief Unknown or other type requested - /// - VIDEOCODEC_UNKNOWN = 0, - - /// @brief [VP8](https://en.wikipedia.org/wiki/VP8) video coding format - /// - VIDEOCODEC_VP8, - - /// @brief [Advanced Video Coding (AVC)](https://en.wikipedia.org/wiki/Advanced_Video_Coding), - /// also referred to as H.264 or [MPEG-4](https://en.wikipedia.org/wiki/MPEG-4) - /// Part 10, Advanced Video Coding (MPEG-4 AVC). - VIDEOCODEC_H264, - - /// @brief [VP9](https://en.wikipedia.org/wiki/VP9) video coding format\n - /// \n - /// VP9 is the successor to VP8 and competes mainly with MPEG's - /// [High Efficiency Video Coding](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding) - /// (HEVC/H.265). - VIDEOCODEC_VP9 - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE - /// @brief YUV Plane identification pointers - /// - /// YUV is a color encoding system typically used as part of a color image pipeline. - /// - /// These are used to access stored data in @ref VIDEOCODEC_PICTURE::planeOffsets - /// and @ref VIDEOCODEC_PICTURE::stride. - /// - enum VIDEOCODEC_PLANE - { - /// @brief "luminance" component Y (equivalent to grey scale) - VIDEOCODEC_PICTURE_Y_PLANE = 0, - - /// @brief "chrominance" component U (blue projection) - VIDEOCODEC_PICTURE_U_PLANE, - - /// @brief "chrominance" component V (red projection) - VIDEOCODEC_PICTURE_V_PLANE, - - /// @brief The maximum value to use in a list. - VIDEOCODEC_PICTURE_MAXPLANES = 3, - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE - /// @brief Video coded process flags, used to perform special operations in - /// stream calls. - /// - /// These are used to access stored data in @ref VIDEOCODEC_PICTURE::flags. - /// - /// @note These variables are bit flags which are created using "|" can be used together. - /// - enum VIDEOCODEC_PICTURE_FLAG - { - /// @brief Empty and nothing defined - VIDEOCODEC_PICTURE_FLAG_NONE = 0, - - /// @brief Drop in decoder - VIDEOCODEC_PICTURE_FLAG_DROP = (1 << 0), - - /// @brief Squeeze out pictured without feeding new packets - VIDEOCODEC_PICTURE_FLAG_DRAIN = (1 << 1), - }; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE struct VIDEOCODEC_PICTURE - /// @ingroup cpp_kodi_addon_videocodec_Defs - /// @brief Data structure which is given to the addon when a decoding call is made. - /// - ///@{ - struct VIDEOCODEC_PICTURE - { - /// @brief The video format declared with @ref VIDEOCODEC_FORMAT and to be - /// used on the addon. - enum VIDEOCODEC_FORMAT videoFormat; - - /// @brief Video coded process flags, used to perform special operations in - /// stream calls. - /// - /// Possible flags are declared here @ref VIDEOCODEC_PICTURE_FLAGS. - uint32_t flags; - - /// @brief Picture width. - uint32_t width; - - /// @brief Picture height. - uint32_t height; - - /// @brief Data to be decoded in the addon. - uint8_t* decodedData; - - /// @brief Size of the data given with @ref decodedData - size_t decodedDataSize; - - /// @brief YUV color plane calculation array. - /// - /// This includes the three values of the YUV and can be identified using - /// @ref VIDEOCODEC_PLANE. - uint32_t planeOffsets[VIDEOCODEC_PICTURE_MAXPLANES]; - - /// @brief YUV color stride calculation array - /// - /// This includes the three values of the YUV and can be identified using - /// @ref VIDEOCODEC_PLANE. - uint32_t stride[VIDEOCODEC_PICTURE_MAXPLANES]; - - /// @brief Picture presentation time stamp (PTS). - int64_t pts; - - /// @brief This is used to save the related handle from Kodi. - /// - /// To handle the input stream buffer, this is given by Kodi using - /// @ref kodi::addon::CInstanceVideoCodec::GetFrameBuffer and must be - /// released again using @ref kodi::addon::CInstanceVideoCodec::ReleaseFrameBuffer. - KODI_HANDLE videoBufferHandle; - }; - ///@} - //---------------------------------------------------------------------------- - - struct VIDEOCODEC_INITDATA - { - enum VIDEOCODEC_TYPE codec; - enum STREAMCODEC_PROFILE codecProfile; - enum VIDEOCODEC_FORMAT* videoFormats; - uint32_t width; - uint32_t height; - const uint8_t* extraData; - unsigned int extraDataSize; - struct STREAM_CRYPTO_SESSION cryptoSession; - }; - - // this are properties given to the addon on create - // at this time we have no parameters for the addon - typedef struct AddonProps_VideoCodec - { - int dummy; - } AddonProps_VideoCodec; - - struct AddonInstance_VideoCodec; - typedef struct KodiToAddonFuncTable_VideoCodec - { - KODI_HANDLE addonInstance; - - //! @brief Opens a codec - bool(__cdecl* open)(const struct AddonInstance_VideoCodec* instance, - struct VIDEOCODEC_INITDATA* initData); - - //! @brief Reconfigures a codec - bool(__cdecl* reconfigure)(const struct AddonInstance_VideoCodec* instance, - struct VIDEOCODEC_INITDATA* initData); - - //! @brief Feed codec if requested from GetPicture() (return VC_BUFFER) - bool(__cdecl* add_data)(const struct AddonInstance_VideoCodec* instance, - const struct DEMUX_PACKET* packet); - - //! @brief Get a decoded picture / request new data - enum VIDEOCODEC_RETVAL(__cdecl* get_picture)(const struct AddonInstance_VideoCodec* instance, - struct VIDEOCODEC_PICTURE* picture); - - //! @brief Get the name of this video decoder - const char*(__cdecl* get_name)(const struct AddonInstance_VideoCodec* instance); - - //! @brief Reset the codec - void(__cdecl* reset)(const struct AddonInstance_VideoCodec* instance); - } KodiToAddonFuncTable_VideoCodec; - - typedef struct AddonToKodiFuncTable_VideoCodec - { - KODI_HANDLE kodiInstance; - bool (*get_frame_buffer)(void* kodiInstance, struct VIDEOCODEC_PICTURE* picture); - void (*release_frame_buffer)(void* kodiInstance, void* buffer); - } AddonToKodiFuncTable_VideoCodec; - - typedef struct AddonInstance_VideoCodec - { - struct AddonProps_VideoCodec* props; - struct AddonToKodiFuncTable_VideoCodec* toKodi; - struct KodiToAddonFuncTable_VideoCodec* toAddon; - } AddonInstance_VideoCodec; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !C_API_ADDONINSTANCE_VIDEOCODEC_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h new file mode 100644 index 0000000000000..66c65a49c18da --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE---*/ + +#ifndef C_API_ADDONINSTANCE_VIDEOCODEC_H +#define C_API_ADDONINSTANCE_VIDEOCODEC_H + +#include "../addon_base.h" +#include "inputstream/demux_packet.h" +#include "inputstream/stream_codec.h" +#include "inputstream/stream_crypto.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + typedef void* KODI_ADDON_VIDEOCODEC_HDL; + + enum VIDEOCODEC_RETVAL + { + VC_NONE = 0, + VC_ERROR, + VC_BUFFER, + VC_PICTURE, + VC_EOF, + }; + + enum VIDEOCODEC_FORMAT + { + VIDEOCODEC_FORMAT_UNKNOWN = 0, + VIDEOCODEC_FORMAT_YV12, + VIDEOCODEC_FORMAT_I420, + VIDEOCODEC_FORMAT_MAXFORMATS + }; + + enum VIDEOCODEC_TYPE + { + VIDEOCODEC_UNKNOWN = 0, + VIDEOCODEC_VP8, + VIDEOCODEC_H264, + VIDEOCODEC_VP9 + }; + + enum VIDEOCODEC_PLANE + { + VIDEOCODEC_PICTURE_Y_PLANE = 0, + VIDEOCODEC_PICTURE_U_PLANE, + VIDEOCODEC_PICTURE_V_PLANE, + VIDEOCODEC_PICTURE_MAXPLANES = 3, + }; + + enum VIDEOCODEC_PICTURE_FLAG + { + VIDEOCODEC_PICTURE_FLAG_NONE = 0, + VIDEOCODEC_PICTURE_FLAG_DROP = (1 << 0), + VIDEOCODEC_PICTURE_FLAG_DRAIN = (1 << 1), + }; + + struct VIDEOCODEC_PICTURE + { + enum VIDEOCODEC_FORMAT video_format; + uint32_t flags; + uint32_t width; + uint32_t height; + uint8_t* decoded_data; + size_t decoded_data_size; + uint32_t plane_offsets[VIDEOCODEC_PICTURE_MAXPLANES]; + uint32_t stride[VIDEOCODEC_PICTURE_MAXPLANES]; + int64_t pts; + KODI_OWN_HDL video_buffer_handle; + }; + + struct VIDEOCODEC_INITDATA + { + enum VIDEOCODEC_TYPE codec; + enum STREAMCODEC_PROFILE codec_profile; + enum VIDEOCODEC_FORMAT* video_formats; + uint32_t width; + uint32_t height; + const uint8_t* extra_data; + unsigned int extra_data_size; + struct STREAM_CRYPTO_SESSION crypto_session; + }; + + typedef KODI_ADDON_VIDEOCODEC_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_DESTROY_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_OPEN_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1)( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl, + const struct DEMUX_PACKET* packet); + + typedef enum VIDEOCODEC_RETVAL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1)( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_PICTURE* picture); + typedef const char*(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_GET_NAME_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RESET_V1)(KODI_ADDON_VIDEOCODEC_HDL hdl); + + typedef struct KODI_ADDON_VIDEOCODEC_FUNC + { + PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1 create; + PFN_KODI_ADDON_VIDEOCODEC_DESTROY_V1 destroy; + PFN_KODI_ADDON_VIDEOCODEC_OPEN_V1 open; + PFN_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1 reconfigure; + PFN_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1 add_data; + PFN_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1 get_picture; + PFN_KODI_ADDON_VIDEOCODEC_GET_NAME_V1 get_name; + PFN_KODI_ADDON_VIDEOCODEC_RESET_V1 reset; + } KODI_ADDON_VIDEOCODEC_FUNC; + + ATTR_DLL_EXPORT bool kodi_addon_videocodec_get_frame_buffer( + KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_videocodec_release_frame_buffer( + KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) __INTRODUCED_IN_KODI(1); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_VIDEOCODEC_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h index 616e0a8666432..27a37e5bed853 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/visualization.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2020 Team Kodi + * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -11,31 +11,31 @@ #include "../addon_base.h" -#define VIZ_LYRICS_SIZE 32768 - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ + typedef void* KODI_ADDON_VISUALIZATION_HDL; + struct VIS_INFO { - bool bWantsFreq; - int iSyncDelay; + bool wants_freq; + int sync_delay; }; struct VIS_TRACK { - const char *title; - const char *artist; - const char *album; - const char *albumArtist; - const char *genre; - const char *comment; - const char *lyrics; + const char* title; + const char* artist; + const char* album; + const char* albumArtist; + const char* genre; + const char* comment; + const char* lyrics; - const char *reserved1; - const char *reserved2; + const char* reserved1; + const char* reserved2; int trackNumber; int discNumber; @@ -47,71 +47,87 @@ extern "C" int reserved4; }; - typedef struct AddonProps_Visualization + struct VIS_PROPS { - ADDON_HARDWARE_CONTEXT device; + ADDON_HARDWARE_CONTEXT2 device; int x; int y; int width; int height; float pixelRatio; - const char* name; - const char* presets; - const char* profile; - } AddonProps_Visualization; - - typedef struct AddonToKodiFuncTable_Visualization - { - KODI_HANDLE kodiInstance; - void(__cdecl* transfer_preset)(KODI_HANDLE kodiInstance, const char* preset); - void(__cdecl* clear_presets)(KODI_HANDLE kodiInstance); - } AddonToKodiFuncTable_Visualization; - - struct AddonInstance_Visualization; + char* name; + char* presets; + char* profile; + }; - typedef struct KodiToAddonFuncTable_Visualization - { - KODI_HANDLE addonInstance; - bool(__cdecl* start)(const struct AddonInstance_Visualization* instance, - int channels, - int samples_per_sec, - int bits_per_sample, - const char* song_name); - void(__cdecl* stop)(const struct AddonInstance_Visualization* instance); - - void(__cdecl* get_info)(const struct AddonInstance_Visualization* instance, - struct VIS_INFO* info); - - void(__cdecl* audio_data)(const struct AddonInstance_Visualization* instance, - const float* audio_data, - int audio_data_length, - float* freq_data, - int freq_data_length); - bool(__cdecl* is_dirty)(const struct AddonInstance_Visualization* instance); - void(__cdecl* render)(const struct AddonInstance_Visualization* instance); - - unsigned int(__cdecl* get_presets)(const struct AddonInstance_Visualization* instance); - int(__cdecl* get_active_preset)(const struct AddonInstance_Visualization* instance); - bool(__cdecl* prev_preset)(const struct AddonInstance_Visualization* instance); - bool(__cdecl* next_preset)(const struct AddonInstance_Visualization* instance); - bool(__cdecl* load_preset)(const struct AddonInstance_Visualization* instance, int select); - bool(__cdecl* random_preset)(const struct AddonInstance_Visualization* instance); - bool(__cdecl* lock_preset)(const struct AddonInstance_Visualization* instance); - bool(__cdecl* rate_preset)(const struct AddonInstance_Visualization* instance, bool plus_minus); - bool(__cdecl* is_locked)(const struct AddonInstance_Visualization* instance); - - bool(__cdecl* update_albumart)(const struct AddonInstance_Visualization* instance, - const char* albumart); - bool(__cdecl* update_track)(const struct AddonInstance_Visualization* instance, - const struct VIS_TRACK* track); - } KodiToAddonFuncTable_Visualization; - - typedef struct AddonInstance_Visualization + typedef KODI_ADDON_VISUALIZATION_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, + int channels, + int samples_per_sec, + int bits_per_sample, + const char* song_name); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info); + + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length, + const float* freq_data, + size_t freq_data_length); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int select); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, + const char* albumart); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, + const struct VIS_TRACK* track); + + typedef struct KODI_ADDON_VISUALIZATION_FUNC { - struct AddonProps_Visualization* props; - struct AddonToKodiFuncTable_Visualization* toKodi; - struct KodiToAddonFuncTable_Visualization* toAddon; - } AddonInstance_Visualization; + PFN_KODI_ADDON_VISUALIZATION_CREATE_V1 create; + PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1 destroy; + PFN_KODI_ADDON_VISUALIZATION_START_V1 start; + PFN_KODI_ADDON_VISUALIZATION_STOP_V1 stop; + + PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1 get_info; + + PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1 audio_data; + PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1 is_dirty; + PFN_KODI_ADDON_VISUALIZATION_RENDER_V1 render; + + PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1 get_presets; + PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1 get_active_preset; + PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1 prev_preset; + PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1 next_preset; + PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1 load_preset; + PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1 random_preset; + PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1 lock_preset; + PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1 rate_preset; + PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1 is_locked; + + PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1 update_albumart; + PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1 update_track; + } KODI_ADDON_VISUALIZATION_FUNC; + + ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(KODI_OWN_HDL hdl, struct VIS_PROPS* props) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(KODI_OWN_HDL hdl, + const char* preset) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(KODI_OWN_HDL hdl) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon_base.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon_base.h index cbe34c09f70db..4db28ec785997 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon_base.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon_base.h @@ -1,20 +1,23 @@ /* - * Copyright (C) 2005-2019 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ -#ifndef C_API_ADDON_BASE_H -#define C_API_ADDON_BASE_H +#ifndef C_API_ADDON_H +#define C_API_ADDON_H #if !defined(NOMINMAX) #define NOMINMAX #endif -#include "stdbool.h" -#include "stdint.h" +#include "version.h" + +#include +#include +#include #ifndef TARGET_WINDOWS #ifndef __cdecl @@ -102,207 +105,153 @@ typedef intptr_t ssize_t; #include #endif // TARGET_POSIX -// Hardware specific device context interface -#define ADDON_HARDWARE_CONTEXT void* - -/* - * To have a on add-on and kodi itself handled string always on known size! - */ -#define ADDON_STANDARD_STRING_LENGTH 1024 -#define ADDON_STANDARD_STRING_LENGTH_SMALL 256 - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - //============================================================================ - /// @ingroup cpp_kodi_addon_addonbase_Defs - /// @defgroup cpp_kodi_addon_addonbase_Defs_ADDON_STATUS enum ADDON_STATUS - /// @brief Return value of functions in @ref cpp_kodi_addon_addonbase "kodi::addon::CAddonBase" - /// and associated classes\n - /// With this Kodi can do any follow-up work or add-on e.g. declare it as defective. - /// - ///@{ +#if __KODI_API__ >= 1 + + typedef void* KODI_HANDLE; + typedef void* KODI_IFC_HDL; + typedef void* KODI_DLL_HDL; + typedef void* KODI_OWN_HDL; + typedef void* KODI_ADDON_HDL; +// typedef void* KODI_INSTANCE_HDL; + + typedef void* ADDON_HARDWARE_CONTEXT2; + typedef enum ADDON_STATUS { - /// @brief For everything OK and no error ADDON_STATUS_OK, - - /// @brief A needed connection was lost ADDON_STATUS_LOST_CONNECTION, - - /// @brief Addon needs a restart inside Kodi ADDON_STATUS_NEED_RESTART, - - /// @brief Necessary settings are not yet set ADDON_STATUS_NEED_SETTINGS, - - /// @brief Unknown and incomprehensible error ADDON_STATUS_UNKNOWN, - - /// @brief Permanent failure, like failing to resolve methods ADDON_STATUS_PERMANENT_FAILURE, - - /* internal used return error if function becomes not used from child on - * addon */ ADDON_STATUS_NOT_IMPLEMENTED } ADDON_STATUS; - ///@} - //---------------------------------------------------------------------------- - //============================================================================ - /// @defgroup cpp_kodi_Defs_AddonLog enum AddonLog - /// @ingroup cpp_kodi_Defs - /// @brief **Log file type definitions**\n - /// These define the types of log entries given with @ref kodi::Log() to Kodi. - /// - /// ------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// - /// kodi::Log(ADDON_LOG_ERROR, "%s: There is an error occurred!", __func__); - /// - /// ~~~~~~~~~~~~~ - /// - ///@{ - typedef enum AddonLog + typedef enum ADDON_LOG { - /// @brief **0** : To include debug information in the log file. ADDON_LOG_DEBUG = 0, - - /// @brief **1** : To include information messages in the log file. ADDON_LOG_INFO = 1, - - /// @brief **2** : To write warnings in the log file. ADDON_LOG_WARNING = 2, - - /// @brief **3** : To report error messages in the log file. ADDON_LOG_ERROR = 3, - - /// @brief **4** : To notify fatal unrecoverable errors, which can may also indicate - /// upcoming crashes. ADDON_LOG_FATAL = 4 - } AddonLog; - ///@} - //---------------------------------------------------------------------------- + } ADDON_LOG; - /*! @brief Standard undefined pointer handle */ - typedef void* KODI_HANDLE; - - /*! - * @brief Handle used to return data from the PVR add-on to CPVRClient - */ - struct ADDON_HANDLE_STRUCT + typedef enum ADDON_INSTANCE { - void* callerAddress; /*!< address of the caller */ - void* dataAddress; /*!< address to store data in */ - int dataIdentifier; /*!< parameter to pass back when calling the callback */ - }; - typedef struct ADDON_HANDLE_STRUCT* ADDON_HANDLE; - - /*! - * @brief Callback function tables from addon to Kodi - * Set complete from Kodi! - */ - struct AddonToKodiFuncTable_kodi; - struct AddonToKodiFuncTable_kodi_audioengine; - struct AddonToKodiFuncTable_kodi_filesystem; - struct AddonToKodiFuncTable_kodi_network; - struct AddonToKodiFuncTable_kodi_gui; - typedef struct AddonToKodiFuncTable_Addon + ADDON_INSTANCE_UNKNOWN = 0, + ADDON_INSTANCE_AUDIODECODER, + ADDON_INSTANCE_AUDIOENCODER, + ADDON_INSTANCE_GAME, + ADDON_INSTANCE_INPUTSTREAM, + ADDON_INSTANCE_PERIPHERAL, + ADDON_INSTANCE_PVR, + ADDON_INSTANCE_SCREENSAVER, + ADDON_INSTANCE_VISUALIZATION, + ADDON_INSTANCE_VFS, + ADDON_INSTANCE_IMAGEDECODER, + ADDON_INSTANCE_VIDEOCODEC, + ADDON_INSTANCE_WEB, + } ADDON_INSTANCE; + + typedef struct KODI_INSTANCE_HDL { - // Pointer inside Kodi, used on callback functions to give related handle - // class, for this ADDON::CAddonDll inside Kodi. - KODI_HANDLE kodiBase; - - // Function addresses used for callbacks from addon to Kodi - char* (*get_type_version)(void* kodiBase, int type); - - void (*free_string)(void* kodiBase, char* str); - void (*free_string_array)(void* kodiBase, char** arr, int numElements); - char* (*get_addon_path)(void* kodiBase); - char* (*get_base_user_path)(void* kodiBase); - void (*addon_log_msg)(void* kodiBase, const int loglevel, const char* msg); - - bool (*get_setting_bool)(void* kodiBase, const char* id, bool* value); - bool (*get_setting_int)(void* kodiBase, const char* id, int* value); - bool (*get_setting_float)(void* kodiBase, const char* id, float* value); - bool (*get_setting_string)(void* kodiBase, const char* id, char** value); - - bool (*set_setting_bool)(void* kodiBase, const char* id, bool value); - bool (*set_setting_int)(void* kodiBase, const char* id, int value); - bool (*set_setting_float)(void* kodiBase, const char* id, float value); - bool (*set_setting_string)(void* kodiBase, const char* id, const char* value); - - void* (*get_interface)(void* kodiBase, const char* name, const char* version); - - struct AddonToKodiFuncTable_kodi* kodi; - struct AddonToKodiFuncTable_kodi_audioengine* kodi_audioengine; - struct AddonToKodiFuncTable_kodi_filesystem* kodi_filesystem; - struct AddonToKodiFuncTable_kodi_gui* kodi_gui; - struct AddonToKodiFuncTable_kodi_network* kodi_network; - - // Move up by min version change about - bool (*is_setting_using_default)(void* kodiBase, const char* id); - } AddonToKodiFuncTable_Addon; - - /*! - * @brief Function tables from Kodi to addon - */ - typedef struct KodiToAddonFuncTable_Addon - { - void (*destroy)(); - ADDON_STATUS (*get_status)(); // TODO unused remove by next min version increase - ADDON_STATUS(*create_instance) - (int instanceType, - const char* instanceID, - KODI_HANDLE instance, - const char* version, - KODI_HANDLE* addonInstance, - KODI_HANDLE parent); - void (*destroy_instance)(int instanceType, KODI_HANDLE instance); - ADDON_STATUS (*set_setting)(const char* settingName, const void* settingValue); - } KodiToAddonFuncTable_Addon; - - /*! - * @brief Main structure passed from kodi to addon with basic information needed to - * create add-on. - */ - typedef struct AddonGlobalInterface + ADDON_INSTANCE type; + KODI_OWN_HDL kodi; + KODI_IFC_HDL instance; + bool kodi_first_instance; + union + { + KODI_HANDLE dummy; + struct KODI_ADDON_AUDIODECODER_FUNC* audiodecoder; + struct KODI_ADDON_AUDIOENCODER_FUNC* audioencoder; + struct KODI_ADDON_IMAGEDECODER_FUNC* imagedecoder; + struct KODI_ADDON_GAME_FUNC* game; + struct KODI_ADDON_INPUTSTREAM_FUNC* inputstream; + struct KODI_ADDON_PERIPHERAL_FUNC* peripheral; + struct KODI_ADDON_SCREENSAVER_FUNC* screensaver; + struct KODI_ADDON_VFS_FUNC* vfs; + struct KODI_ADDON_VIDEOCODEC_FUNC* videocodec; + struct KODI_ADDON_VISUALIZATION_FUNC* visualization; + }; + } KODI_INSTANCE_HDL; + + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(KODI_HANDLE first_instance, KODI_ADDON_HDL* hdl); + /*---AUTO_GEN_PARSE---*/ + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)(const KODI_ADDON_HDL hdl, + enum ADDON_INSTANCE instanceType, + const char* instanceID, + struct KODI_INSTANCE_HDL* addonInstance, + KODI_IFC_HDL parent); + /*---AUTO_GEN_PARSE---*/ + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)(const KODI_ADDON_HDL hdl, + enum ADDON_INSTANCE instanceType, + struct KODI_INSTANCE_HDL* instance); + /*---AUTO_GEN_PARSE---*/ + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, + const char* name, + const char* value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, + const char* name, + bool value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, + const char* name, + int value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, + const char* name, + float value); + + typedef struct KODI_ADDON_FUNC { - // String with full path where add-on is installed (without his name on end) - // Set from Kodi! - const char* libBasePath; - - // Master API version of Kodi itself (ADDON_GLOBAL_VERSION_MAIN) - const char* kodi_base_api_version; - - // Pointer of first created instance, used in case this add-on goes with single way - // Set from Kodi! - KODI_HANDLE firstKodiInstance; - - // Pointer to master base class inside add-on - // Set from addon header (kodi::addon::CAddonBase)! - KODI_HANDLE addonBase; - - // Pointer to a instance used on single way (together with this class) - // Set from addon header (kodi::addon::IAddonInstance)! - KODI_HANDLE globalSingleInstance; - - // Callback function tables from addon to Kodi - // Set from Kodi! - AddonToKodiFuncTable_Addon* toKodi; - - // Function tables from Kodi to addon - // Set from addon header! - KodiToAddonFuncTable_Addon* toAddon; - } AddonGlobalInterface; + PFN_KODI_ADDON_CREATE_V1 create; + PFN_KODI_ADDON_DESTROY_V1 destroy; + PFN_KODI_ADDON_CREATE_INSTANCE_V1 create_instance; + PFN_KODI_ADDON_DESTROY_INSTANCE_V1 destroy_instance; + PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1 setting_change_string; + PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1 setting_change_boolean; + PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1 setting_change_integer; + PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1 setting_change_float; + } KODI_ADDON_FUNC; + + ATTR_DLL_EXPORT const char* kodi_check_main_shared(int argc, char* argv[]) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT KODI_IFC_HDL kodi_init(unsigned int api, + int argc, char* argv[], struct KODI_ADDON_FUNC* func, bool via_main, bool no_receive) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT void kodi_deinit(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT bool kodi_process(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + + ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_share_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_user_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) __INTRODUCED_IN_KODI(1); + +#endif /* __KODI_API__ >= 1 */ #ifdef __cplusplus } #endif /* __cplusplus */ -#endif /* !C_API_ADDON_BASE_H */ +#endif /* !C_API_ADDON_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/audio_engine.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/audio_engine.h index dcb004c209cec..a7a253780ca0f 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/audio_engine.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/audio_engine.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2019 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +9,8 @@ #ifndef C_API_AUDIO_ENGINE_H #define C_API_AUDIO_ENGINE_H -#include +#include "addon_base.h" + #include #ifdef __cplusplus @@ -17,293 +18,124 @@ extern "C" { #endif /* __cplusplus */ - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - // "C" Definitions, structures and enumerators of audio engine - //{{{ + typedef void* KODI_AE_HDL; - //============================================================================ - /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineStreamOptions enum AudioEngineStreamOptions - /// @ingroup cpp_kodi_audioengine_Defs - /// @brief **Bit options to pass to CAEStream**\n - /// A bit field of stream options. - /// - /// - /// ------------------------------------------------------------------------ - /// - /// **Usage example:** - /// ~~~~~~~~~~~~~{.cpp} - /// // Here only as minimal, "format" must be set to wanted types - /// kodi::audioengine::AudioEngineFormat format; - /// m_audioengine = new kodi::audioengine::CAEStream(format, AUDIO_STREAM_FORCE_RESAMPLE | AUDIO_STREAM_AUTOSTART); - /// ~~~~~~~~~~~~~ - /// - ///@{ typedef enum AudioEngineStreamOptions { - /// force resample even if rates match AUDIO_STREAM_FORCE_RESAMPLE = 1 << 0, - /// create the stream paused AUDIO_STREAM_PAUSED = 1 << 1, - /// autostart the stream when enough data is buffered AUDIO_STREAM_AUTOSTART = 1 << 2, } AudioEngineStreamOptions; - ///@} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineChannel enum AudioEngineChannel - /// @ingroup cpp_kodi_audioengine_Defs - /// @brief **The possible channels**\n - /// Used to set available or used channels on stream. - /// - /// - /// ------------------------------------------------------------------------ - /// - /// **Usage example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::audioengine::AudioEngineFormat format; - /// format.SetChannelLayout(std::vector(AUDIOENGINE_CH_FL, AUDIOENGINE_CH_FR)); - /// ~~~~~~~~~~~~~ - /// - ///@{ - enum AudioEngineChannel - { - /// Used inside to indicate the end of a list and not for addon use directly. - AUDIOENGINE_CH_NULL = -1, - /// RAW Audio format - AUDIOENGINE_CH_RAW, - /// Front left - AUDIOENGINE_CH_FL, - /// Front right - AUDIOENGINE_CH_FR, - /// Front center - AUDIOENGINE_CH_FC, - /// LFE / Subwoofer - AUDIOENGINE_CH_LFE, - /// Back left - AUDIOENGINE_CH_BL, - /// Back right - AUDIOENGINE_CH_BR, - /// Front left over center - AUDIOENGINE_CH_FLOC, - /// Front right over center - AUDIOENGINE_CH_FROC, - /// Back center - AUDIOENGINE_CH_BC, - /// Side left - AUDIOENGINE_CH_SL, - /// Side right - AUDIOENGINE_CH_SR, - /// Top front left - AUDIOENGINE_CH_TFL, - /// Top front right - AUDIOENGINE_CH_TFR, - /// Top front center - AUDIOENGINE_CH_TFC, - /// Top center - AUDIOENGINE_CH_TC, - /// Top back left - AUDIOENGINE_CH_TBL, - /// Top back right - AUDIOENGINE_CH_TBR, - /// Top back center - AUDIOENGINE_CH_TBC, - /// Back left over center - AUDIOENGINE_CH_BLOC, - /// Back right over center - AUDIOENGINE_CH_BROC, - /// Maximum possible value, to use e.g. as size inside list - AUDIOENGINE_CH_MAX - }; - ///@} - //---------------------------------------------------------------------------- - //============================================================================ - /// @defgroup cpp_kodi_audioengine_Defs_AudioEngineDataFormat enum AudioEngineDataFormat - /// @ingroup cpp_kodi_audioengine_Defs - /// @brief **Audio sample formats**\n - /// The bit layout of the audio data. - /// - /// LE = Little Endian, BE = Big Endian, NE = Native Endian - /// - /// For planar sample formats, each audio channel is in a separate data plane, - /// and linesize is the buffer size, in bytes, for a single plane. All data - /// planes must be the same size. For packed sample formats, only the first - /// data plane is used, and samples for each channel are interleaved. In this - /// case, linesize is the buffer size, in bytes, for the 1 plane. - /// - /// @note This is ordered from the worst to best preferred formats - /// - /// - /// ------------------------------------------------------------------------ - /// - /// **Usage example:** - /// ~~~~~~~~~~~~~{.cpp} - /// kodi::audioengine::AudioEngineFormat format; - /// format.SetDataFormat(AUDIOENGINE_FMT_FLOATP); - /// ~~~~~~~~~~~~~ - /// - ///@{ enum AudioEngineDataFormat { - /// To define format as invalid AUDIOENGINE_FMT_INVALID = -1, - - /// Unsigned integer 8 bit AUDIOENGINE_FMT_U8, - - /// Big Endian signed integer 16 bit AUDIOENGINE_FMT_S16BE, - /// Little Endian signed integer 16 bit AUDIOENGINE_FMT_S16LE, - /// Native Endian signed integer 16 bit AUDIOENGINE_FMT_S16NE, - - /// Big Endian signed integer 32 bit AUDIOENGINE_FMT_S32BE, - /// Little Endian signed integer 32 bit AUDIOENGINE_FMT_S32LE, - /// Native Endian signed integer 32 bit AUDIOENGINE_FMT_S32NE, - - /// Big Endian signed integer 24 bit (in 4 bytes) AUDIOENGINE_FMT_S24BE4, - /// Little Endian signed integer 24 bit (in 4 bytes) AUDIOENGINE_FMT_S24LE4, - /// Native Endian signed integer 24 bit (in 4 bytes) AUDIOENGINE_FMT_S24NE4, - /// S32 with bits_per_sample < 32 AUDIOENGINE_FMT_S24NE4MSB, - - /// Big Endian signed integer 24 bit (3 bytes) AUDIOENGINE_FMT_S24BE3, - /// Little Endian signed integer 24 bit (3 bytes) AUDIOENGINE_FMT_S24LE3, - /// Native Endian signed integer 24 bit (3 bytes) AUDIOENGINE_FMT_S24NE3, - - /// Double floating point AUDIOENGINE_FMT_DOUBLE, - /// Floating point AUDIOENGINE_FMT_FLOAT, - - /// **Bitstream**\n - /// RAW Audio format AUDIOENGINE_FMT_RAW, - - /// **Planar format**\n - /// Unsigned byte AUDIOENGINE_FMT_U8P, - /// **Planar format**\n - /// Native Endian signed 16 bit AUDIOENGINE_FMT_S16NEP, - /// **Planar format**\n - /// Native Endian signed 32 bit AUDIOENGINE_FMT_S32NEP, - /// **Planar format**\n - /// Native Endian signed integer 24 bit (in 4 bytes) AUDIOENGINE_FMT_S24NE4P, - /// **Planar format**\n - /// S32 with bits_per_sample < 32 AUDIOENGINE_FMT_S24NE4MSBP, - /// **Planar format**\n - /// Native Endian signed integer 24 bit (in 3 bytes) AUDIOENGINE_FMT_S24NE3P, - /// **Planar format**\n - /// Double floating point AUDIOENGINE_FMT_DOUBLEP, - /// **Planar format**\n - /// Floating point AUDIOENGINE_FMT_FLOATP, - - /// Amount of sample formats. AUDIOENGINE_FMT_MAX }; - ///@} - //---------------------------------------------------------------------------- - /*! - * @brief Internal API structure which are used for data exchange between - * Kodi and addon. - */ - struct AUDIO_ENGINE_FORMAT + enum AudioEngineChannel { - /*! The stream's data format (eg, AUDIOENGINE_FMT_S16LE) */ - enum AudioEngineDataFormat m_dataFormat; - - /*! The stream's sample rate (eg, 48000) */ - unsigned int m_sampleRate; - - /*! The encoded streams sample rate if a bitstream, otherwise undefined */ - unsigned int m_encodedRate; - - /*! The amount of used speaker channels */ - unsigned int m_channelCount; - - /*! The stream's channel layout */ - enum AudioEngineChannel m_channels[AUDIOENGINE_CH_MAX]; - - /*! The number of frames per period */ - unsigned int m_frames; - - /*! The size of one frame in bytes */ - unsigned int m_frameSize; + AUDIOENGINE_CH_NULL = -1, + AUDIOENGINE_CH_RAW, + AUDIOENGINE_CH_FL, + AUDIOENGINE_CH_FR, + AUDIOENGINE_CH_FC, + AUDIOENGINE_CH_LFE, + AUDIOENGINE_CH_BL, + AUDIOENGINE_CH_BR, + AUDIOENGINE_CH_FLOC, + AUDIOENGINE_CH_FROC, + AUDIOENGINE_CH_BC, + AUDIOENGINE_CH_SL, + AUDIOENGINE_CH_SR, + AUDIOENGINE_CH_TFL, + AUDIOENGINE_CH_TFR, + AUDIOENGINE_CH_TFC, + AUDIOENGINE_CH_TC, + AUDIOENGINE_CH_TBL, + AUDIOENGINE_CH_TBR, + AUDIOENGINE_CH_TBC, + AUDIOENGINE_CH_BLOC, + AUDIOENGINE_CH_BROC, + AUDIOENGINE_CH_MAX }; - /* A stream handle pointer, which is only used internally by the addon stream handle */ - typedef void AEStreamHandle; - - //}}} - - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - // "C" Internal interface tables for intercommunications between addon and kodi - //{{{ - - /* - * Function address structure, not need to visible on dev kit doxygen - * documentation - */ - typedef struct AddonToKodiFuncTable_kodi_audioengine + struct AUDIO_ENGINE_FMT { - AEStreamHandle* (*make_stream)(void* kodiBase, - struct AUDIO_ENGINE_FORMAT* format, - unsigned int options); - void (*free_stream)(void* kodiBase, AEStreamHandle* stream); - bool (*get_current_sink_format)(void* kodiBase, struct AUDIO_ENGINE_FORMAT* sink_format); - - // Audio Engine Stream definitions - unsigned int (*aestream_get_space)(void* kodiBase, AEStreamHandle* handle); - unsigned int (*aestream_add_data)(void* kodiBase, - AEStreamHandle* handle, - uint8_t* const* data, - unsigned int offset, - unsigned int frames, - double pts, - bool hasDownmix, - double centerMixLevel); - double (*aestream_get_delay)(void* kodiBase, AEStreamHandle* handle); - bool (*aestream_is_buffering)(void* kodiBase, AEStreamHandle* handle); - double (*aestream_get_cache_time)(void* kodiBase, AEStreamHandle* handle); - double (*aestream_get_cache_total)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_pause)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_resume)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_drain)(void* kodiBase, AEStreamHandle* handle, bool wait); - bool (*aestream_is_draining)(void* kodiBase, AEStreamHandle* handle); - bool (*aestream_is_drained)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_flush)(void* kodiBase, AEStreamHandle* handle); - float (*aestream_get_volume)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_set_volume)(void* kodiBase, AEStreamHandle* handle, float volume); - float (*aestream_get_amplification)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_set_amplification)(void* kodiBase, AEStreamHandle* handle, float amplify); - unsigned int (*aestream_get_frame_size)(void* kodiBase, AEStreamHandle* handle); - unsigned int (*aestream_get_channel_count)(void* kodiBase, AEStreamHandle* handle); - unsigned int (*aestream_get_sample_rate)(void* kodiBase, AEStreamHandle* handle); - enum AudioEngineDataFormat (*aestream_get_data_format)(void* kodiBase, AEStreamHandle* handle); - double (*aestream_get_resample_ratio)(void* kodiBase, AEStreamHandle* handle); - void (*aestream_set_resample_ratio)(void* kodiBase, AEStreamHandle* handle, double ratio); - } AddonToKodiFuncTable_kodi_audioengine; + enum AudioEngineDataFormat data_format; + unsigned int sample_rate; + unsigned int channel_count; + enum AudioEngineChannel channels[AUDIOENGINE_CH_MAX]; + unsigned int frames; + unsigned int frame_size; + }; - //}}} + ATTR_DLL_EXPORT bool kodi_audioengine_get_current_sink_format(struct AUDIO_ENGINE_FMT* fmt) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_audioengine_is_planar_format(enum AudioEngineDataFormat format) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT KODI_AE_HDL kodi_audioengine_stream_make(const struct AUDIO_ENGINE_FMT* fmt, + unsigned int options) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_free(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_space(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_add_data(KODI_AE_HDL hdl, + uint8_t* const* data, + size_t planes, + size_t data_size, + unsigned int offset, + unsigned int frames, + unsigned int frame_size, + double pts, + bool hasDownmix, + double centerMixLevel) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_audioengine_stream_get_delay(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_buffering(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_time(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_total(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_pause(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_resume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_drain(KODI_AE_HDL hdl, bool wait) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_draining(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_drained(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_flush(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_audioengine_stream_get_volume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_set_volume(KODI_AE_HDL hdl, float volume) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_audioengine_stream_get_amplification(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_set_amplification(KODI_AE_HDL hdl, + float amplify) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_frame_size(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_channel_count(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_sample_rate(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format( + KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_audioengine_stream_get_resample_ratio(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_audioengine_stream_set_resample_ratio(KODI_AE_HDL hdl, + double ratio) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/CMakeLists.txt new file mode 100644 index 0000000000000..f98c0fa2e5281 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/CMakeLists.txt @@ -0,0 +1,10 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(HEADERS + kodi_api_1.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_dl) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_1.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_1.h new file mode 100644 index 0000000000000..7265e1f7492ee --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_1.h @@ -0,0 +1,1379 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +/* API_HASH */ + +#ifndef C_API_DL_API_1_H +#define C_API_DL_API_1_H + +#include "../addon-instance/audioencoder.h" +#include "../addon-instance/game.h" +#include "../addon-instance/imagedecoder.h" +#include "../addon-instance/inputstream.h" +#include "../addon-instance/peripheral.h" +#include "../addon-instance/pvr.h" +#include "../addon-instance/screensaver.h" +#include "../addon-instance/vfs.h" +#include "../addon-instance/videocodec.h" +#include "../addon-instance/visualization.h" +#include "../addon_base.h" +#include "../audio_engine.h" +#include "../filesystem.h" +#include "../general.h" +#include "../gui/controls/button.h" +#include "../gui/controls/edit.h" +#include "../gui/controls/fade_label.h" +#include "../gui/controls/image.h" +#include "../gui/controls/label.h" +#include "../gui/controls/progress.h" +#include "../gui/controls/radio_button.h" +#include "../gui/controls/rendering.h" +#include "../gui/controls/settings_slider.h" +#include "../gui/controls/slider.h" +#include "../gui/controls/spin.h" +#include "../gui/controls/text_box.h" +#include "../gui/dialogs/extended_progress.h" +#include "../gui/dialogs/progress.h" +#include "../gui/general.h" +#include "../gui/list_item.h" +#include "../gui/window.h" + +#ifndef ATTR_DL_APIENTRYP +#define ATTR_DL_APIENTRYP ATTR_APIENTRYP +#endif + +#ifndef ATTR_DL_DLL_EXPORT +#define ATTR_DL_DLL_EXPORT ATTR_DLL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + struct kodi_api_1; + + ATTR_DL_DLL_EXPORT bool load_kodi_api_1(struct kodi_api_1* api); + + struct KODI_ADDON_FUNC; + struct AUDIO_ENGINE_FMT; + struct VFS_DIR_ENTRY; + struct VFS_STAT_STRUCTURE; + struct VFS_CACHE_STATUS; + struct AddonKeyboardKeyTable; + struct game_stream_properties; + struct game_stream_buffer; + struct game_stream_packet; + struct game_input_event; + struct DEMUX_PACKET; + struct PVR_MENUHOOK; + struct EPG_TAG; + struct PVR_CHANNEL; + struct PVR_PROVIDER; + struct PVR_CHANNEL_GROUP; + struct PVR_CHANNEL_GROUP_MEMBER; + struct PVR_RECORDING; + struct PVR_TIMER; + struct SCREENSAVER_PROPS; + struct VIDEOCODEC_PICTURE; + struct VIS_PROPS; + struct tm; + + // addon_base.h + typedef KODI_IFC_HDL(ATTR_DL_APIENTRYP PFN_KODI_INIT_V1)( + unsigned int, int, char*[], struct KODI_ADDON_FUNC*, bool, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_SETTING_BOOL_V1)(const char*, bool*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_SETTING_FLOAT_V1)(const char*, float*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_SETTING_INT_V1)(const char*, int*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_SETTING_STRING_V1)(const char*, char**); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_OPEN_SETTINGS_DIALOG_V1)(); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SET_SETTING_BOOL_V1)(const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SET_SETTING_FLOAT_V1)(const char*, float); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SET_SETTING_INT_V1)(const char*, int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SET_SETTING_STRING_V1)(const char*, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_PROCESS_V1)(KODI_IFC_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_INFO_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_LIB_PATH_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_SHARE_PATH_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_TEMP_PATH_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_USER_PATH_V1)(); + typedef const char*(ATTR_DL_APIENTRYP PFN_KODI_CHECK_MAIN_SHARED_V1)(int, char*[]); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_DEINIT_V1)(KODI_IFC_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_LOG_V1)(enum ADDON_LOG, const char*, ...); + + // audio_engine.h + typedef KODI_AE_HDL(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_MAKE_V1)( + const struct AUDIO_ENGINE_FMT*, unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_GET_CURRENT_SINK_FORMAT_V1)( + struct AUDIO_ENGINE_FMT*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_IS_PLANAR_FORMAT_V1)( + enum AudioEngineDataFormat); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_IS_BUFFERING_V1)(KODI_AE_HDL); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_IS_DRAINED_V1)(KODI_AE_HDL); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_IS_DRAINING_V1)(KODI_AE_HDL); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_CACHE_TIME_V1)(KODI_AE_HDL); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_CACHE_TOTAL_V1)(KODI_AE_HDL); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_DELAY_V1)(KODI_AE_HDL); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_RESAMPLE_RATIO_V1)(KODI_AE_HDL); + typedef enum AudioEngineDataFormat( + ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_DATA_FORMAT_V1)(KODI_AE_HDL); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_AMPLIFICATION_V1)(KODI_AE_HDL); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_VOLUME_V1)(KODI_AE_HDL); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_ADD_DATA_V1)(KODI_AE_HDL, + uint8_t* const*, + size_t, + size_t, + unsigned int, + unsigned int, + unsigned int, + double, + bool, + double); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_CHANNEL_COUNT_V1)( + KODI_AE_HDL); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_FRAME_SIZE_V1)( + KODI_AE_HDL); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_SAMPLE_RATE_V1)( + KODI_AE_HDL); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_GET_SPACE_V1)(KODI_AE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_DRAIN_V1)(KODI_AE_HDL, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_FLUSH_V1)(KODI_AE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_FREE_V1)(KODI_AE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_PAUSE_V1)(KODI_AE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_RESUME_V1)(KODI_AE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_SET_AMPLIFICATION_V1)(KODI_AE_HDL, + float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_SET_RESAMPLE_RATIO_V1)(KODI_AE_HDL, + double); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_AUDIOENGINE_STREAM_SET_VOLUME_V1)(KODI_AE_HDL, float); + + // filesystem.h + typedef KODI_FILE_HDL(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_CURL_CREATE_V1)(const char*); + typedef KODI_FILE_HDL(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_OPEN_FOR_WRITE_V1)(const char*, bool); + typedef KODI_FILE_HDL(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_OPEN_V1)(const char*, unsigned int); + typedef KODI_HTTP_HEADER_HDL(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_OPEN_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_CAN_OPEN_DIRECTORY_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_COPY_FILE_V1)(const char*, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_CREATE_DIRECTORY_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_DELETE_FILE_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_DIRECTORY_EXISTS_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_AT_END_V1)(KODI_FILE_HDL); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_CURL_ADD_OPTION_V1)(KODI_FILE_HDL, + enum CURLOptiontype, + const char*, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_CURL_OPEN_V1)(KODI_FILE_HDL, unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_EXISTS_V1)(const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_IO_CTL_GET_CACHE_STATUS_V1)( + KODI_FILE_HDL, struct VFS_CACHE_STATUS*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_IO_CTL_GET_SEEK_POSSIBLE_V1)(KODI_FILE_HDL); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_IO_CTL_SET_CACHE_RATE_V1)(KODI_FILE_HDL, + unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_IO_CTL_SET_RETRY_V1)(KODI_FILE_HDL, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_READ_LINE_V1)(KODI_FILE_HDL, char*, size_t); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_CONTENT_TYPE_V1)(const char*, + char**, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_COOKIES_V1)(const char*, char**); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_DIRECTORY_V1)(const char*, + const char*, + struct VFS_DIR_ENTRY**, + size_t*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_DISK_SPACE_V1)(const char*, + uint64_t*, + uint64_t*, + uint64_t*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_MIME_TYPE_V1)(const char*, char**, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_IS_INTERNET_STREAM_V1)(const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_IS_LOCAL_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_IS_ON_LAN_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_IS_REMOTE_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_IS_URL_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_REMOVE_DIRECTORY_RECURSIVE_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_REMOVE_DIRECTORY_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_RENAME_FILE_V1)(const char*, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_VFS_STAT_FILE_V1)(const char*, + struct VFS_STAT_STRUCTURE*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_PROPERTY_VALUE_V1)(KODI_FILE_HDL, + enum FilePropertyTypes, + const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_CACHE_THUMB_NAME_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_GET_FILE_MD5_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_CHARSET_V1)(KODI_HTTP_HEADER_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_HEADER_V1)(KODI_HTTP_HEADER_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_MIME_TYPE_V1)(KODI_HTTP_HEADER_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_PROTO_LINE_V1)(KODI_HTTP_HEADER_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_VALUE_V1)(KODI_HTTP_HEADER_HDL, + const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_MAKE_LEGAL_FILENAME_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_MAKE_LEGAL_PATH_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_VFS_TRANSLATE_SPECIAL_PROTOCOL_V1)(const char*); + typedef char**(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_PROPERTY_VALUES_V1)(KODI_FILE_HDL, + enum FilePropertyTypes, + const char*, + size_t*); + typedef char**(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_GET_VALUES_V1)(KODI_HTTP_HEADER_HDL, + const char*, + size_t*); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_DOWNLOAD_SPEED_V1)(KODI_FILE_HDL); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_CHUNK_SIZE_V1)(KODI_FILE_HDL); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_TRUNCATE_V1)(KODI_FILE_HDL, int64_t); + typedef int64_t(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_LENGTH_V1)(KODI_FILE_HDL); + typedef int64_t(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_GET_POSITION_V1)(KODI_FILE_HDL); + typedef int64_t(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_SEEK_V1)(KODI_FILE_HDL, int64_t, int); + typedef ssize_t(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_READ_V1)(KODI_FILE_HDL, uint8_t*, size_t); + typedef ssize_t(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_WRITE_V1)(KODI_FILE_HDL, + const uint8_t*, + size_t); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_CLOSE_V1)(KODI_FILE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_VFS_FILE_FLUSH_V1)(KODI_FILE_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_VFS_FREE_DIRECTORY_V1)(struct VFS_DIR_ENTRY*, size_t); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_VFS_HTTP_HEADER_CLOSE_V1)(KODI_HTTP_HEADER_HDL); + + // general.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_CHANGE_KEYBOARD_LAYOUT_V1)(char**); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GET_KEYBOARD_LAYOUT_V1)(int, + char**, + struct AddonKeyboardKeyTable*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_IS_ADDON_AVILABLE_V1)(const char*, char**, bool*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GET_CURRENT_SKIN_ID_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GET_DIGEST_V1)(enum DigestType, const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GET_LANGUAGE_V1)(enum LangFormats, bool); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GET_LOCALIZED_STRING_V1)(long); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GET_REGION_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_UNKNOWN_TO_UTF8_V1)(const char*, bool*, bool); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GET_GLOBAL_IDLE_TIME_V1)(); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GET_FREE_MEM_V1)(long*, long*, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_PLAY_SFX_V1)(const char*, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_QUEUE_NOTIFICATION_V1)( + enum QueueMsg, const char*, const char*, const char*, unsigned int, bool, unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_STOP_SFX_V1)(); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_VERSION_V1)(char**, int*, int*, char**, char**, char**); + + // monitor.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_MONITOR_ABORT_REQUESTED_V1)(); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_MONITOR_WAIT_FOR_ABORT_V1)(double); + + // network.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_IS_HOST_ON_LAN_V1)(const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_IS_LOCAL_HOST_V1)(const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_WAKE_ON_LAN_V1)(const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_DNS_LOOKUP_V1)(const char*, bool*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_GET_HOSTNAME_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_GET_IP_ADDRESS_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_GET_USER_AGENT_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_NETWORK_URL_ENCODE_V1)(const char*); + + // addon-instance/audioencoder.h + typedef ssize_t(ATTR_DL_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_SEEK_V1)(KODI_OWN_HDL, size_t, int); + typedef ssize_t(ATTR_DL_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_WRITE_V1)(KODI_OWN_HDL, + const uint8_t*, + size_t); + + // addon-instance/game.h + typedef KODI_GAME_STREAM_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_OPEN_STREAM_V1)( + KODI_OWN_HDL, const struct game_stream_properties*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1)( + KODI_OWN_HDL, + KODI_GAME_STREAM_HANDLE, + unsigned int, + unsigned int, + struct game_stream_buffer*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_INPUT_EVENT_V1)( + KODI_OWN_HDL, const struct game_input_event*); + typedef game_proc_address_t(ATTR_DL_APIENTRYP PFN_KODI_ADDON_HW_GET_PROC_ADDRESS_V1)(KODI_OWN_HDL, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_ADD_STREAM_DATA_V1)( + KODI_OWN_HDL, KODI_GAME_STREAM_HANDLE, const struct game_stream_packet*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_CLOSE_STREAM_V1)(KODI_OWN_HDL, + KODI_GAME_STREAM_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_CLOSE_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1)( + KODI_OWN_HDL, KODI_GAME_STREAM_HANDLE, struct game_stream_buffer*); + + // addon-instance/imagedecoder.h + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_MIMETYPE_V1)(KODI_OWN_HDL); + + // addon-instance/inputstream.h + typedef struct DEMUX_PACKET*( + ATTR_DL_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_DEMUX_PACKET_V1)(KODI_OWN_HDL, int); + typedef struct DEMUX_PACKET*( + ATTR_DL_APIENTRYP + PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1)(KODI_OWN_HDL, + unsigned int, + unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1)( + KODI_OWN_HDL, struct DEMUX_PACKET*); + + // addon-instance/peripheral.h + typedef enum JOYSTICK_FEATURE_TYPE(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FEATURE_TYPE_V1)( + KODI_OWN_HDL, const char*, const char*); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1)( + KODI_OWN_HDL, const char*, enum JOYSTICK_FEATURE_TYPE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1)(KODI_OWN_HDL, + const char*, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1)(KODI_OWN_HDL); + + // addon-instance/pvr.h + typedef int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_MAX_FUTURE_DAYS_V1)(KODI_OWN_HDL); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_ADD_MENU_HOOK_V1)(KODI_OWN_HDL, + const struct PVR_MENUHOOK*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1)( + KODI_OWN_HDL, const char*, enum PVR_CONNECTION_STATE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_EPG_EVENT_STATE_CHANGE_V1)( + KODI_OWN_HDL, struct EPG_TAG*, enum EPG_EVENT_STATE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1)(KODI_OWN_HDL, + const char*, + const char*, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_MEMBER_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL_GROUP_MEMBER*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL_GROUP*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_EPG_ENTRY_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct EPG_TAG*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_PROVIDER_ENTRY_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_PROVIDER*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_RECORDING_ENTRY_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_RECORDING*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_TIMER_ENTRY_V1)( + KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_TIMER*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_CHANNEL_GROUPS_UPDATE_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1)(KODI_OWN_HDL, + unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1)(KODI_OWN_HDL); + + // addon-instance/screensaver.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_GET_PROPERTIES_V1)( + KODI_OWN_HDL, struct SCREENSAVER_PROPS*); + + // addon-instance/vfs.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VFS_GET_DIR_CB__GET_KEYBOARD_INPUT_V1)( + KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*, char**, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VFS_GET_DIR_CB__REQUIRE_AUTHENTICATION_V1)( + KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VFS_GET_DIR_CB__SET_ERROR_DIALOG_V1)( + KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*, const char*, const char*, const char*); + + // addon-instance/videocodec.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_GET_FRAME_BUFFER_V1)( + KODI_OWN_HDL, struct VIDEOCODEC_PICTURE*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1)( + KODI_OWN_HDL, struct VIDEOCODEC_PICTURE*); + + // addon-instance/visualization.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CLEAR_PRESETS_V1)(KODI_OWN_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1)(KODI_OWN_HDL, + struct VIS_PROPS*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1)(KODI_OWN_HDL, + const char*); + + // gui/general.h + typedef ADDON_HARDWARE_CONTEXT2(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_HW_CONTEXT_V1)(); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_VIDEO_RESOLUTION_V1)(); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_CURRENT_WINDOW_DIALOG_ID_V1)(); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_CURRENT_WINDOW_ID_V1)(); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_SCREEN_HEIGHT_V1)(); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_GET_SCREEN_WIDTH_V1)(); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LOCK_V1)(); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_UNLOCK_V1)(); + + // gui/list_item.h + typedef KODI_GUI_LISTITEM_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_CREATE_V1)(const char*, + const char*, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_IS_SELECTED_V1)(KODI_GUI_LISTITEM_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_GET_ART_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_GET_LABEL2_V1)(KODI_GUI_LISTITEM_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_GET_LABEL_V1)(KODI_GUI_LISTITEM_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_GET_PATH_V1)(KODI_GUI_LISTITEM_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_GET_PROPERTY_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_DESTROY_V1)(KODI_GUI_LISTITEM_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SELECT_V1)(KODI_GUI_LISTITEM_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SET_ART_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SET_LABEL2_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SET_LABEL_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SET_PATH_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_LISTITEM_SET_PROPERTY_V1)(KODI_GUI_LISTITEM_HANDLE, + const char*, + const char*); + + // gui/window.h + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_BUTTON_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_EDIT_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_FADE_LABEL_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_IMAGE_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_LABEL_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_PROGRESS_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE( + ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_RADIO_BUTTON_V1)(KODI_GUI_WINDOW_HANDLE, + int); + typedef KODI_GUI_CONTROL_HANDLE( + ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_RENDER_ADDON_V1)(KODI_GUI_WINDOW_HANDLE, + int); + typedef KODI_GUI_CONTROL_HANDLE( + ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_SETTINGS_SLIDER_V1)(KODI_GUI_WINDOW_HANDLE, + int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_SLIDER_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_SPIN_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_CONTROL_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTROL_TEXT_BOX_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_LISTITEM_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_LIST_ITEM_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef KODI_GUI_WINDOW_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_CREATE_V1)( + KODI_HANDLE, const char*, const char*, bool, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_CLOSE_V1)(KODI_GUI_WINDOW_HANDLE); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_DO_MODAL_V1)(KODI_GUI_WINDOW_HANDLE); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_PROPERTY_BOOL_V1)(KODI_GUI_WINDOW_HANDLE, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_FOCUS_ID_V1)(KODI_GUI_WINDOW_HANDLE, int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SHOW_V1)(KODI_GUI_WINDOW_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_PROPERTY_V1)(KODI_GUI_WINDOW_HANDLE, + const char*); + typedef double(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_PROPERTY_DOUBLE_V1)( + KODI_GUI_WINDOW_HANDLE, const char*); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CURRENT_CONTAINER_ID_V1)( + KODI_GUI_WINDOW_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CURRENT_LIST_POSITION_V1)( + KODI_GUI_WINDOW_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_FOCUS_ID_V1)(KODI_GUI_WINDOW_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_LIST_SIZE_V1)(KODI_GUI_WINDOW_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_GET_PROPERTY_INT_V1)(KODI_GUI_WINDOW_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_ADD_LIST_ITEM_V1)(KODI_GUI_WINDOW_HANDLE, + KODI_GUI_LISTITEM_HANDLE, + int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_CLEAR_ITEM_LIST_V1)(KODI_GUI_WINDOW_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_CLEAR_PROPERTIES_V1)(KODI_GUI_WINDOW_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_CLEAR_PROPERTY_V1)(KODI_GUI_WINDOW_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_DESTROY_V1)(KODI_GUI_WINDOW_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_MARK_DIRTY_REGION_V1)(KODI_GUI_WINDOW_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_FROM_POSITION_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_V1)(KODI_GUI_WINDOW_HANDLE, + KODI_GUI_LISTITEM_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CONTAINER_CONTENT_V1)( + KODI_GUI_WINDOW_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CONTAINER_PROPERTY_V1)( + KODI_GUI_WINDOW_HANDLE, const char*, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CONTROL_LABEL_V1)(KODI_GUI_WINDOW_HANDLE, + int, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CONTROL_SELECTED_V1)( + KODI_GUI_WINDOW_HANDLE, int, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CONTROL_VISIBLE_V1)(KODI_GUI_WINDOW_HANDLE, + int, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_CURRENT_LIST_POSITION_V1)( + KODI_GUI_WINDOW_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_PROPERTY_BOOL_V1)(KODI_GUI_WINDOW_HANDLE, + const char*, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_PROPERTY_DOUBLE_V1)(KODI_GUI_WINDOW_HANDLE, + const char*, + double); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_PROPERTY_INT_V1)(KODI_GUI_WINDOW_HANDLE, + const char*, + int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_WINDOW_SET_PROPERTY_V1)(KODI_GUI_WINDOW_HANDLE, + const char*, + const char*); + + // gui/controls/button.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_GET_LABEL2_V1)(KODI_GUI_CONTROL_HANDLE); + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_GET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_SET_ENABLED_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_SET_LABEL2_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_SET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_BUTTON_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/edit.h + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_GET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_GET_TEXT_V1)(KODI_GUI_CONTROL_HANDLE); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_GET_CURSOR_POSITION_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_CURSOR_POSITION_V1)( + KODI_GUI_CONTROL_HANDLE, unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_ENABLED_V1)(KODI_GUI_CONTROL_HANDLE, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_INPUT_TYPE_V1)( + KODI_GUI_CONTROL_HANDLE, int, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_TEXT_V1)(KODI_GUI_CONTROL_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_EDIT_SET_VISIBLE_V1)(KODI_GUI_CONTROL_HANDLE, + bool); + + // gui/controls/fade_label.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_FADE_LABEL_GET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_FADE_LABEL_ADD_LABEL_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_FADE_LABEL_RESET_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_FADE_LABEL_SET_SCROLLING_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_FADE_LABEL_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/image.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_IMAGE_SET_COLOR_DIFFUSE_V1)( + KODI_GUI_CONTROL_HANDLE, uint32_t); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_IMAGE_SET_FILENAME_V1)( + KODI_GUI_CONTROL_HANDLE, const char*, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_IMAGE_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/label.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_LABEL_GET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_LABEL_SET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_LABEL_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/progress.h + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_PROGRESS_GET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_PROGRESS_SET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_PROGRESS_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/radio_button.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_IS_SELECTED_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_GET_LABEL_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_ENABLED_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_LABEL_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_SELECTED_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/rendering.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_RADIO_RENDERING_DESTROY_V1)( + KODI_GUI_CONTROL_HANDLE); + + // gui/controls/settings_slider.h + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_RESET_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_ENABLED_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_INTERVAL_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, float, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_INTERVAL_V1)( + KODI_GUI_CONTROL_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, int, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_TEXT_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/slider.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_GET_DESCRIPTION_V1)(KODI_GUI_CONTROL_HANDLE); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_GET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_GET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_GET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_RESET_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_ENABLED_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_INTERVAL_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, float, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_INTERVAL_V1)( + KODI_GUI_CONTROL_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, int, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_PERCENTAGE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SLIDER_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/controls/spin.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_GET_STRING_VALUE_V1)(KODI_GUI_CONTROL_HANDLE); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_GET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_GET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_ADD_INT_LABEL_V1)( + KODI_GUI_CONTROL_HANDLE, const char*, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_ADD_STRING_LABEL_V1)( + KODI_GUI_CONTROL_HANDLE, const char*, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_RESET_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_ENABLED_V1)(KODI_GUI_CONTROL_HANDLE, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_INTERVAL_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, float, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_INT_RANGE_V1)( + KODI_GUI_CONTROL_HANDLE, int, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_INT_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_STRING_VALUE_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_TEXT_V1)(KODI_GUI_CONTROL_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_TYPE_V1)(KODI_GUI_CONTROL_HANDLE, + int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_SPIN_SET_VISIBLE_V1)(KODI_GUI_CONTROL_HANDLE, + bool); + + // gui/controls/text_box.h + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_GET_TEXT_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_RESET_V1)(KODI_GUI_CONTROL_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_SCROLL_V1)(KODI_GUI_CONTROL_HANDLE, + unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_AUTO_SCROLLING_V1)( + KODI_GUI_CONTROL_HANDLE, int, int, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_TEXT_V1)( + KODI_GUI_CONTROL_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_VISIBLE_V1)( + KODI_GUI_CONTROL_HANDLE, bool); + + // gui/dialogs/context_menu.h + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_CONTEXT_MENU_OPEN_V1)(const char*, + const char*[], + size_t); + + // gui/dialogs/extended_progress.h + typedef KODI_GUI_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_NEW_DIALOG_V1)( + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_IS_FINISHED_V1)( + KODI_GUI_HANDLE); + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TEXT_V1)(KODI_GUI_HANDLE); + typedef char*( + ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TITLE_V1)(KODI_GUI_HANDLE); + typedef float(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_PERCENTAGE_V1)( + KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_DELETE_DIALOG_V1)( + KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_MARK_FINISHED_V1)( + KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PERCENTAGE_V1)( + KODI_GUI_HANDLE, float); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PROGRESS_V1)( + KODI_GUI_HANDLE, int, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TEXT_V1)( + KODI_GUI_HANDLE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TITLE_V1)( + KODI_GUI_HANDLE, const char*); + + // gui/dialogs/filebrowser.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_DIRECTORY_V1)( + const char*, const char*, const char*, char**, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_FROM_DIR_V1)( + const char*, const char*, const char*, const char*, char**, bool, bool, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_LIST_V1)( + const char*, const char*, const char*, char***, size_t*, bool, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_V1)( + const char*, const char*, const char*, const char*, char**, bool, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_LIST_V1)( + const char*, const char*, char***, size_t*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_V1)( + const char*, const char*, const char*, char**); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_SOURCE_V1)( + const char*, char**, bool, const char*, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_FILE_BROWSER_CLEAR_FILE_LIST_V1)(char***, + size_t); + + // gui/dialogs/keyboard.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_IS_KEYBOARD_ACTIVATED_V1)(); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SEND_TEXT_TO_ACTIVE_KEYBOARD_V1)( + const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_FILTER_V1)( + const char*, char**, bool, unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_V1)(const char*, + char**, + bool, + unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_WITH_HEAD_V1)( + const char*, char**, const char*, bool, bool, unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_V1)( + const char*, char**, unsigned int); + typedef bool( + ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_WITH_HEAD_V1)( + const char*, char**, const char*, bool, unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_V1)( + char**, unsigned int); + typedef bool( + ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_WITH_HEAD_V1)( + char**, const char*, bool, unsigned int); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_PASSWORD_V1)( + const char*, char**, const char*, int, unsigned int); + + // gui/dialogs/numeric.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_DATE_V1)(struct tm*, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_IP_ADDRESS_V1)( + const char*, char**, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_NUMBER_V1)(const char*, + char**, + const char*, + unsigned int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_SECONDS_V1)(const char*, + char**, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_TIME_V1)(struct tm*, + const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_INPUT_V1)(const char*, + char**, + const char*, + bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_NEW_PASSWORD_V1)( + char**); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_PASSWORD_V1)( + const char*, const char*, int); + + // gui/dialogs/ok.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_LINE_TEXT_V1)( + const char*, const char*, const char*, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1)( + const char*, const char*); + + // gui/dialogs/progress.h + typedef KODI_GUI_HANDLE(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_NEW_DIALOG_V1)(); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_ABORT_V1)(KODI_GUI_HANDLE); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_IS_CANCELED_V1)(KODI_GUI_HANDLE); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_GET_PERCENTAGE_V1)(KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_DELETE_DIALOG_V1)(KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_OPEN_V1)(KODI_GUI_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_CAN_CANCEL_V1)(KODI_GUI_HANDLE, + bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_HEADING_V1)(KODI_GUI_HANDLE, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_LINE_V1)(KODI_GUI_HANDLE, + unsigned int, + const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PERCENTAGE_V1)(KODI_GUI_HANDLE, + int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_ADVANCE_V1)( + KODI_GUI_HANDLE, int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_MAX_V1)(KODI_GUI_HANDLE, + int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_PROGRESS_SHOW_PROGRESS_BAR_V1)( + KODI_GUI_HANDLE, bool); + + // gui/dialogs/select.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_SELECT_OPEN_MULTI_SELECT_V1)( + const char*, const char*[], const char*[], uint8_t[], size_t, unsigned int); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_SELECT_OPEN_V1)( + const char*, const char*[], size_t, int, unsigned int); + + // gui/dialogs/text_viewer.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_TEXT_VIEWER_SHOW_V1)(const char*, + const char*); + + // gui/dialogs/yes_no.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_BUTTON_TEXT_V1)( + const char*, const char*, const char*, const char*, bool*, const char*, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_TEXT_V1)( + const char*, const char*, const char*, const char*, const char*, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1)( + const char*, const char*, bool*, const char*, const char*); + + struct kodi_api_1 + { + // addon_base.h + PFN_KODI_ADDON_GET_INFO_V1 kodi_addon_get_info; + PFN_KODI_ADDON_GET_LIB_PATH_V1 kodi_addon_get_lib_path; + PFN_KODI_ADDON_GET_SETTING_BOOL_V1 kodi_addon_get_setting_bool; + PFN_KODI_ADDON_GET_SETTING_FLOAT_V1 kodi_addon_get_setting_float; + PFN_KODI_ADDON_GET_SETTING_INT_V1 kodi_addon_get_setting_int; + PFN_KODI_ADDON_GET_SETTING_STRING_V1 kodi_addon_get_setting_string; + PFN_KODI_ADDON_GET_SHARE_PATH_V1 kodi_addon_get_share_path; + PFN_KODI_ADDON_GET_TEMP_PATH_V1 kodi_addon_get_temp_path; + PFN_KODI_ADDON_GET_USER_PATH_V1 kodi_addon_get_user_path; + PFN_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1 kodi_addon_is_setting_using_default; + PFN_KODI_ADDON_OPEN_SETTINGS_DIALOG_V1 kodi_addon_open_settings_dialog; + PFN_KODI_ADDON_SET_SETTING_BOOL_V1 kodi_addon_set_setting_bool; + PFN_KODI_ADDON_SET_SETTING_FLOAT_V1 kodi_addon_set_setting_float; + PFN_KODI_ADDON_SET_SETTING_INT_V1 kodi_addon_set_setting_int; + PFN_KODI_ADDON_SET_SETTING_STRING_V1 kodi_addon_set_setting_string; + PFN_KODI_CHECK_MAIN_SHARED_V1 kodi_check_main_shared; + PFN_KODI_DEINIT_V1 kodi_deinit; + PFN_KODI_INIT_V1 kodi_init; + PFN_KODI_LOG_V1 kodi_log; + PFN_KODI_PROCESS_V1 kodi_process; + + // audio_engine.h + PFN_KODI_AUDIOENGINE_GET_CURRENT_SINK_FORMAT_V1 kodi_audioengine_get_current_sink_format; + PFN_KODI_AUDIOENGINE_IS_PLANAR_FORMAT_V1 kodi_audioengine_is_planar_format; + PFN_KODI_AUDIOENGINE_STREAM_ADD_DATA_V1 kodi_audioengine_stream_add_data; + PFN_KODI_AUDIOENGINE_STREAM_DRAIN_V1 kodi_audioengine_stream_drain; + PFN_KODI_AUDIOENGINE_STREAM_FLUSH_V1 kodi_audioengine_stream_flush; + PFN_KODI_AUDIOENGINE_STREAM_FREE_V1 kodi_audioengine_stream_free; + PFN_KODI_AUDIOENGINE_STREAM_GET_AMPLIFICATION_V1 kodi_audioengine_stream_get_amplification; + PFN_KODI_AUDIOENGINE_STREAM_GET_CACHE_TIME_V1 kodi_audioengine_stream_get_cache_time; + PFN_KODI_AUDIOENGINE_STREAM_GET_CACHE_TOTAL_V1 kodi_audioengine_stream_get_cache_total; + PFN_KODI_AUDIOENGINE_STREAM_GET_CHANNEL_COUNT_V1 kodi_audioengine_stream_get_channel_count; + PFN_KODI_AUDIOENGINE_STREAM_GET_DATA_FORMAT_V1 kodi_audioengine_stream_get_data_format; + PFN_KODI_AUDIOENGINE_STREAM_GET_DELAY_V1 kodi_audioengine_stream_get_delay; + PFN_KODI_AUDIOENGINE_STREAM_GET_FRAME_SIZE_V1 kodi_audioengine_stream_get_frame_size; + PFN_KODI_AUDIOENGINE_STREAM_GET_RESAMPLE_RATIO_V1 kodi_audioengine_stream_get_resample_ratio; + PFN_KODI_AUDIOENGINE_STREAM_GET_SAMPLE_RATE_V1 kodi_audioengine_stream_get_sample_rate; + PFN_KODI_AUDIOENGINE_STREAM_GET_SPACE_V1 kodi_audioengine_stream_get_space; + PFN_KODI_AUDIOENGINE_STREAM_GET_VOLUME_V1 kodi_audioengine_stream_get_volume; + PFN_KODI_AUDIOENGINE_STREAM_IS_BUFFERING_V1 kodi_audioengine_stream_is_buffering; + PFN_KODI_AUDIOENGINE_STREAM_IS_DRAINED_V1 kodi_audioengine_stream_is_drained; + PFN_KODI_AUDIOENGINE_STREAM_IS_DRAINING_V1 kodi_audioengine_stream_is_draining; + PFN_KODI_AUDIOENGINE_STREAM_MAKE_V1 kodi_audioengine_stream_make; + PFN_KODI_AUDIOENGINE_STREAM_PAUSE_V1 kodi_audioengine_stream_pause; + PFN_KODI_AUDIOENGINE_STREAM_RESUME_V1 kodi_audioengine_stream_resume; + PFN_KODI_AUDIOENGINE_STREAM_SET_AMPLIFICATION_V1 kodi_audioengine_stream_set_amplification; + PFN_KODI_AUDIOENGINE_STREAM_SET_RESAMPLE_RATIO_V1 kodi_audioengine_stream_set_resample_ratio; + PFN_KODI_AUDIOENGINE_STREAM_SET_VOLUME_V1 kodi_audioengine_stream_set_volume; + + // filesystem.h + PFN_KODI_VFS_CAN_OPEN_DIRECTORY_V1 kodi_vfs_can_open_directory; + PFN_KODI_VFS_COPY_FILE_V1 kodi_vfs_copy_file; + PFN_KODI_VFS_CREATE_DIRECTORY_V1 kodi_vfs_create_directory; + PFN_KODI_VFS_DELETE_FILE_V1 kodi_vfs_delete_file; + PFN_KODI_VFS_DIRECTORY_EXISTS_V1 kodi_vfs_directory_exists; + PFN_KODI_VFS_FILE_AT_END_V1 kodi_vfs_file_at_end; + PFN_KODI_VFS_FILE_CLOSE_V1 kodi_vfs_file_close; + PFN_KODI_VFS_FILE_CURL_ADD_OPTION_V1 kodi_vfs_file_curl_add_option; + PFN_KODI_VFS_FILE_CURL_CREATE_V1 kodi_vfs_file_curl_create; + PFN_KODI_VFS_FILE_CURL_OPEN_V1 kodi_vfs_file_curl_open; + PFN_KODI_VFS_FILE_EXISTS_V1 kodi_vfs_file_exists; + PFN_KODI_VFS_FILE_FLUSH_V1 kodi_vfs_file_flush; + PFN_KODI_VFS_FILE_GET_CHUNK_SIZE_V1 kodi_vfs_file_get_chunk_size; + PFN_KODI_VFS_FILE_GET_DOWNLOAD_SPEED_V1 kodi_vfs_file_get_download_speed; + PFN_KODI_VFS_FILE_GET_LENGTH_V1 kodi_vfs_file_get_length; + PFN_KODI_VFS_FILE_GET_POSITION_V1 kodi_vfs_file_get_position; + PFN_KODI_VFS_FILE_GET_PROPERTY_VALUES_V1 kodi_vfs_file_get_property_values; + PFN_KODI_VFS_FILE_GET_PROPERTY_VALUE_V1 kodi_vfs_file_get_property_value; + PFN_KODI_VFS_FILE_IO_CTL_GET_CACHE_STATUS_V1 kodi_vfs_file_io_ctl_get_cache_status; + PFN_KODI_VFS_FILE_IO_CTL_GET_SEEK_POSSIBLE_V1 kodi_vfs_file_io_ctl_get_seek_possible; + PFN_KODI_VFS_FILE_IO_CTL_SET_CACHE_RATE_V1 kodi_vfs_file_io_ctl_set_cache_rate; + PFN_KODI_VFS_FILE_IO_CTL_SET_RETRY_V1 kodi_vfs_file_io_ctl_set_retry; + PFN_KODI_VFS_FILE_OPEN_FOR_WRITE_V1 kodi_vfs_file_open_for_write; + PFN_KODI_VFS_FILE_OPEN_V1 kodi_vfs_file_open; + PFN_KODI_VFS_FILE_READ_LINE_V1 kodi_vfs_file_read_line; + PFN_KODI_VFS_FILE_READ_V1 kodi_vfs_file_read; + PFN_KODI_VFS_FILE_SEEK_V1 kodi_vfs_file_seek; + PFN_KODI_VFS_FILE_TRUNCATE_V1 kodi_vfs_file_truncate; + PFN_KODI_VFS_FILE_WRITE_V1 kodi_vfs_file_write; + PFN_KODI_VFS_FREE_DIRECTORY_V1 kodi_vfs_free_directory; + PFN_KODI_VFS_GET_CACHE_THUMB_NAME_V1 kodi_vfs_get_cache_thumb_name; + PFN_KODI_VFS_GET_CONTENT_TYPE_V1 kodi_vfs_get_content_type; + PFN_KODI_VFS_GET_COOKIES_V1 kodi_vfs_get_cookies; + PFN_KODI_VFS_GET_DIRECTORY_V1 kodi_vfs_get_directory; + PFN_KODI_VFS_GET_DISK_SPACE_V1 kodi_vfs_get_disk_space; + PFN_KODI_VFS_GET_FILE_MD5_V1 kodi_vfs_get_file_md5; + PFN_KODI_VFS_GET_MIME_TYPE_V1 kodi_vfs_get_mime_type; + PFN_KODI_VFS_HTTP_HEADER_CLOSE_V1 kodi_vfs_http_header_close; + PFN_KODI_VFS_HTTP_HEADER_GET_CHARSET_V1 kodi_vfs_http_header_get_charset; + PFN_KODI_VFS_HTTP_HEADER_GET_HEADER_V1 kodi_vfs_http_header_get_header; + PFN_KODI_VFS_HTTP_HEADER_GET_MIME_TYPE_V1 kodi_vfs_http_header_get_mime_type; + PFN_KODI_VFS_HTTP_HEADER_GET_PROTO_LINE_V1 kodi_vfs_http_header_get_proto_line; + PFN_KODI_VFS_HTTP_HEADER_GET_VALUES_V1 kodi_vfs_http_header_get_values; + PFN_KODI_VFS_HTTP_HEADER_GET_VALUE_V1 kodi_vfs_http_header_get_value; + PFN_KODI_VFS_HTTP_HEADER_OPEN_V1 kodi_vfs_http_header_open; + PFN_KODI_VFS_IS_INTERNET_STREAM_V1 kodi_vfs_is_internet_stream; + PFN_KODI_VFS_IS_LOCAL_V1 kodi_vfs_is_local; + PFN_KODI_VFS_IS_ON_LAN_V1 kodi_vfs_is_on_lan; + PFN_KODI_VFS_IS_REMOTE_V1 kodi_vfs_is_remote; + PFN_KODI_VFS_IS_URL_V1 kodi_vfs_is_url; + PFN_KODI_VFS_MAKE_LEGAL_FILENAME_V1 kodi_vfs_make_legal_filename; + PFN_KODI_VFS_MAKE_LEGAL_PATH_V1 kodi_vfs_make_legal_path; + PFN_KODI_VFS_REMOVE_DIRECTORY_RECURSIVE_V1 kodi_vfs_remove_directory_recursive; + PFN_KODI_VFS_REMOVE_DIRECTORY_V1 kodi_vfs_remove_directory; + PFN_KODI_VFS_RENAME_FILE_V1 kodi_vfs_rename_file; + PFN_KODI_VFS_STAT_FILE_V1 kodi_vfs_stat_file; + PFN_KODI_VFS_TRANSLATE_SPECIAL_PROTOCOL_V1 kodi_vfs_translate_special_protocol; + + // general.h + PFN_KODI_CHANGE_KEYBOARD_LAYOUT_V1 kodi_change_keyboard_layout; + PFN_KODI_GET_CURRENT_SKIN_ID_V1 kodi_get_current_skin_id; + PFN_KODI_GET_DIGEST_V1 kodi_get_digest; + PFN_KODI_GET_FREE_MEM_V1 kodi_get_free_mem; + PFN_KODI_GET_GLOBAL_IDLE_TIME_V1 kodi_get_global_idle_time; + PFN_KODI_GET_KEYBOARD_LAYOUT_V1 kodi_get_keyboard_layout; + PFN_KODI_GET_LANGUAGE_V1 kodi_get_language; + PFN_KODI_GET_LOCALIZED_STRING_V1 kodi_get_localized_string; + PFN_KODI_GET_REGION_V1 kodi_get_region; + PFN_KODI_IS_ADDON_AVILABLE_V1 kodi_is_addon_avilable; + PFN_KODI_PLAY_SFX_V1 kodi_play_sfx; + PFN_KODI_QUEUE_NOTIFICATION_V1 kodi_queue_notification; + PFN_KODI_STOP_SFX_V1 kodi_stop_sfx; + PFN_KODI_UNKNOWN_TO_UTF8_V1 kodi_unknown_to_utf8; + PFN_KODI_VERSION_V1 kodi_version; + + // monitor.h + PFN_KODI_MONITOR_ABORT_REQUESTED_V1 kodi_monitor_abort_requested; + PFN_KODI_MONITOR_WAIT_FOR_ABORT_V1 kodi_monitor_wait_for_abort; + + // network.h + PFN_KODI_NETWORK_DNS_LOOKUP_V1 kodi_network_dns_lookup; + PFN_KODI_NETWORK_GET_HOSTNAME_V1 kodi_network_get_hostname; + PFN_KODI_NETWORK_GET_IP_ADDRESS_V1 kodi_network_get_ip_address; + PFN_KODI_NETWORK_GET_USER_AGENT_V1 kodi_network_get_user_agent; + PFN_KODI_NETWORK_IS_HOST_ON_LAN_V1 kodi_network_is_host_on_lan; + PFN_KODI_NETWORK_IS_LOCAL_HOST_V1 kodi_network_is_local_host; + PFN_KODI_NETWORK_URL_ENCODE_V1 kodi_network_url_encode; + PFN_KODI_NETWORK_WAKE_ON_LAN_V1 kodi_network_wake_on_lan; + + // addon-instance/audioencoder.h + PFN_KODI_ADDON_AUDIOENCODER_SEEK_V1 kodi_addon_audioencoder_seek; + PFN_KODI_ADDON_AUDIOENCODER_WRITE_V1 kodi_addon_audioencoder_write; + + // addon-instance/game.h + PFN_KODI_ADDON_GAME_ADD_STREAM_DATA_V1 kodi_addon_game_add_stream_data; + PFN_KODI_ADDON_GAME_CLOSE_STREAM_V1 kodi_addon_game_close_stream; + PFN_KODI_ADDON_GAME_CLOSE_V1 kodi_addon_game_close; + PFN_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1 kodi_addon_game_get_stream_buffer; + PFN_KODI_ADDON_GAME_INPUT_EVENT_V1 kodi_addon_game_input_event; + PFN_KODI_ADDON_GAME_OPEN_STREAM_V1 kodi_addon_game_open_stream; + PFN_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1 kodi_addon_game_release_stream_buffer; + PFN_KODI_ADDON_HW_GET_PROC_ADDRESS_V1 kodi_addon_hw_get_proc_address; + + // addon-instance/imagedecoder.h + PFN_KODI_ADDON_IMAGEDECODER_MIMETYPE_V1 kodi_addon_imagedecoder_mimetype; + + // addon-instance/inputstream.h + PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_DEMUX_PACKET_V1 + kodi_addon_inputstream_allocate_demux_packet; + PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1 + kodi_addon_inputstream_allocate_encrypted_demux_packet; + PFN_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1 kodi_addon_inputstream_free_demux_packet; + + // addon-instance/peripheral.h + PFN_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1 kodi_addon_peripheral_feature_count; + PFN_KODI_ADDON_PERIPHERAL_FEATURE_TYPE_V1 kodi_addon_peripheral_feature_type; + PFN_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1 kodi_addon_peripheral_refresh_button_maps; + PFN_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1 kodi_addon_peripheral_trigger_scan; + + // addon-instance/pvr.h + PFN_KODI_ADDON_PVR_ADD_MENU_HOOK_V1 kodi_addon_pvr_add_menu_hook; + PFN_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1 kodi_addon_pvr_connection_state_change; + PFN_KODI_ADDON_PVR_EPG_EVENT_STATE_CHANGE_V1 kodi_addon_pvr_epg_event_state_change; + PFN_KODI_ADDON_PVR_GET_EPG_MAX_FUTURE_DAYS_V1 kodi_addon_pvr_get_epg_max_future_days; + PFN_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1 kodi_addon_pvr_get_epg_max_past_days; + PFN_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1 kodi_addon_pvr_recording_notification; + PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1 kodi_addon_pvr_transfer_channel_entry; + PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_MEMBER_V1 + kodi_addon_pvr_transfer_channel_group_member; + PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_V1 kodi_addon_pvr_transfer_channel_group; + PFN_KODI_ADDON_PVR_TRANSFER_EPG_ENTRY_V1 kodi_addon_pvr_transfer_epg_entry; + PFN_KODI_ADDON_PVR_TRANSFER_PROVIDER_ENTRY_V1 kodi_addon_pvr_transfer_provider_entry; + PFN_KODI_ADDON_PVR_TRANSFER_RECORDING_ENTRY_V1 kodi_addon_pvr_transfer_recording_entry; + PFN_KODI_ADDON_PVR_TRANSFER_TIMER_ENTRY_V1 kodi_addon_pvr_transfer_timer_entry; + PFN_KODI_ADDON_PVR_TRIGGER_CHANNEL_GROUPS_UPDATE_V1 + kodi_addon_pvr_trigger_channel_groups_update; + PFN_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1 kodi_addon_pvr_trigger_channel_update; + PFN_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1 kodi_addon_pvr_trigger_epg_update; + PFN_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1 kodi_addon_pvr_trigger_providers_update; + PFN_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1 kodi_addon_pvr_trigger_recording_update; + PFN_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1 kodi_addon_pvr_trigger_timer_update; + + // addon-instance/screensaver.h + PFN_KODI_ADDON_SCREENSAVER_GET_PROPERTIES_V1 kodi_addon_screensaver_get_properties; + + // addon-instance/vfs.h + PFN_KODI_ADDON_VFS_GET_DIR_CB__GET_KEYBOARD_INPUT_V1 + kodi_addon_vfs_get_dir_cb__get_keyboard_input; + PFN_KODI_ADDON_VFS_GET_DIR_CB__REQUIRE_AUTHENTICATION_V1 + kodi_addon_vfs_get_dir_cb__require_authentication; + PFN_KODI_ADDON_VFS_GET_DIR_CB__SET_ERROR_DIALOG_V1 kodi_addon_vfs_get_dir_cb__set_error_dialog; + + // addon-instance/videocodec.h + PFN_KODI_ADDON_VIDEOCODEC_GET_FRAME_BUFFER_V1 kodi_addon_videocodec_get_frame_buffer; + PFN_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1 kodi_addon_videocodec_release_frame_buffer; + + // addon-instance/visualization.h + PFN_KODI_ADDON_VISUALIZATION_CLEAR_PRESETS_V1 kodi_addon_visualization_clear_presets; + PFN_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1 kodi_addon_visualization_get_properties; + PFN_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1 kodi_addon_visualization_transfer_preset; + + // gui/general.h + PFN_KODI_GUI_GET_CURRENT_WINDOW_DIALOG_ID_V1 kodi_gui_get_current_window_dialog_id; + PFN_KODI_GUI_GET_CURRENT_WINDOW_ID_V1 kodi_gui_get_current_window_id; + PFN_KODI_GUI_GET_HW_CONTEXT_V1 kodi_gui_get_hw_context; + PFN_KODI_GUI_GET_SCREEN_HEIGHT_V1 kodi_gui_get_screen_height; + PFN_KODI_GUI_GET_SCREEN_WIDTH_V1 kodi_gui_get_screen_width; + PFN_KODI_GUI_GET_VIDEO_RESOLUTION_V1 kodi_gui_get_video_resolution; + PFN_KODI_GUI_LOCK_V1 kodi_gui_lock; + PFN_KODI_GUI_UNLOCK_V1 kodi_gui_unlock; + + // gui/list_item.h + PFN_KODI_GUI_LISTITEM_CREATE_V1 kodi_gui_listitem_create; + PFN_KODI_GUI_LISTITEM_DESTROY_V1 kodi_gui_listitem_destroy; + PFN_KODI_GUI_LISTITEM_GET_ART_V1 kodi_gui_listitem_get_art; + PFN_KODI_GUI_LISTITEM_GET_LABEL2_V1 kodi_gui_listitem_get_label2; + PFN_KODI_GUI_LISTITEM_GET_LABEL_V1 kodi_gui_listitem_get_label; + PFN_KODI_GUI_LISTITEM_GET_PATH_V1 kodi_gui_listitem_get_path; + PFN_KODI_GUI_LISTITEM_GET_PROPERTY_V1 kodi_gui_listitem_get_property; + PFN_KODI_GUI_LISTITEM_IS_SELECTED_V1 kodi_gui_listitem_is_selected; + PFN_KODI_GUI_LISTITEM_SELECT_V1 kodi_gui_listitem_select; + PFN_KODI_GUI_LISTITEM_SET_ART_V1 kodi_gui_listitem_set_art; + PFN_KODI_GUI_LISTITEM_SET_LABEL2_V1 kodi_gui_listitem_set_label2; + PFN_KODI_GUI_LISTITEM_SET_LABEL_V1 kodi_gui_listitem_set_label; + PFN_KODI_GUI_LISTITEM_SET_PATH_V1 kodi_gui_listitem_set_path; + PFN_KODI_GUI_LISTITEM_SET_PROPERTY_V1 kodi_gui_listitem_set_property; + + // gui/window.h + PFN_KODI_GUI_WINDOW_ADD_LIST_ITEM_V1 kodi_gui_window_add_list_item; + PFN_KODI_GUI_WINDOW_CLEAR_ITEM_LIST_V1 kodi_gui_window_clear_item_list; + PFN_KODI_GUI_WINDOW_CLEAR_PROPERTIES_V1 kodi_gui_window_clear_properties; + PFN_KODI_GUI_WINDOW_CLEAR_PROPERTY_V1 kodi_gui_window_clear_property; + PFN_KODI_GUI_WINDOW_CLOSE_V1 kodi_gui_window_close; + PFN_KODI_GUI_WINDOW_CREATE_V1 kodi_gui_window_create; + PFN_KODI_GUI_WINDOW_DESTROY_V1 kodi_gui_window_destroy; + PFN_KODI_GUI_WINDOW_DO_MODAL_V1 kodi_gui_window_do_modal; + PFN_KODI_GUI_WINDOW_GET_CONTROL_BUTTON_V1 kodi_gui_window_get_control_button; + PFN_KODI_GUI_WINDOW_GET_CONTROL_EDIT_V1 kodi_gui_window_get_control_edit; + PFN_KODI_GUI_WINDOW_GET_CONTROL_FADE_LABEL_V1 kodi_gui_window_get_control_fade_label; + PFN_KODI_GUI_WINDOW_GET_CONTROL_IMAGE_V1 kodi_gui_window_get_control_image; + PFN_KODI_GUI_WINDOW_GET_CONTROL_LABEL_V1 kodi_gui_window_get_control_label; + PFN_KODI_GUI_WINDOW_GET_CONTROL_PROGRESS_V1 kodi_gui_window_get_control_progress; + PFN_KODI_GUI_WINDOW_GET_CONTROL_RADIO_BUTTON_V1 kodi_gui_window_get_control_radio_button; + PFN_KODI_GUI_WINDOW_GET_CONTROL_RENDER_ADDON_V1 kodi_gui_window_get_control_render_addon; + PFN_KODI_GUI_WINDOW_GET_CONTROL_SETTINGS_SLIDER_V1 kodi_gui_window_get_control_settings_slider; + PFN_KODI_GUI_WINDOW_GET_CONTROL_SLIDER_V1 kodi_gui_window_get_control_slider; + PFN_KODI_GUI_WINDOW_GET_CONTROL_SPIN_V1 kodi_gui_window_get_control_spin; + PFN_KODI_GUI_WINDOW_GET_CONTROL_TEXT_BOX_V1 kodi_gui_window_get_control_text_box; + PFN_KODI_GUI_WINDOW_GET_CURRENT_CONTAINER_ID_V1 kodi_gui_window_get_current_container_id; + PFN_KODI_GUI_WINDOW_GET_CURRENT_LIST_POSITION_V1 kodi_gui_window_get_current_list_position; + PFN_KODI_GUI_WINDOW_GET_FOCUS_ID_V1 kodi_gui_window_get_focus_id; + PFN_KODI_GUI_WINDOW_GET_LIST_ITEM_V1 kodi_gui_window_get_list_item; + PFN_KODI_GUI_WINDOW_GET_LIST_SIZE_V1 kodi_gui_window_get_list_size; + PFN_KODI_GUI_WINDOW_GET_PROPERTY_BOOL_V1 kodi_gui_window_get_property_bool; + PFN_KODI_GUI_WINDOW_GET_PROPERTY_DOUBLE_V1 kodi_gui_window_get_property_double; + PFN_KODI_GUI_WINDOW_GET_PROPERTY_INT_V1 kodi_gui_window_get_property_int; + PFN_KODI_GUI_WINDOW_GET_PROPERTY_V1 kodi_gui_window_get_property; + PFN_KODI_GUI_WINDOW_MARK_DIRTY_REGION_V1 kodi_gui_window_mark_dirty_region; + PFN_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_FROM_POSITION_V1 + kodi_gui_window_remove_list_item_from_position; + PFN_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_V1 kodi_gui_window_remove_list_item; + PFN_KODI_GUI_WINDOW_SET_CONTAINER_CONTENT_V1 kodi_gui_window_set_container_content; + PFN_KODI_GUI_WINDOW_SET_CONTAINER_PROPERTY_V1 kodi_gui_window_set_container_property; + PFN_KODI_GUI_WINDOW_SET_CONTROL_LABEL_V1 kodi_gui_window_set_control_label; + PFN_KODI_GUI_WINDOW_SET_CONTROL_SELECTED_V1 kodi_gui_window_set_control_selected; + PFN_KODI_GUI_WINDOW_SET_CONTROL_VISIBLE_V1 kodi_gui_window_set_control_visible; + PFN_KODI_GUI_WINDOW_SET_CURRENT_LIST_POSITION_V1 kodi_gui_window_set_current_list_position; + PFN_KODI_GUI_WINDOW_SET_FOCUS_ID_V1 kodi_gui_window_set_focus_id; + PFN_KODI_GUI_WINDOW_SET_PROPERTY_BOOL_V1 kodi_gui_window_set_property_bool; + PFN_KODI_GUI_WINDOW_SET_PROPERTY_DOUBLE_V1 kodi_gui_window_set_property_double; + PFN_KODI_GUI_WINDOW_SET_PROPERTY_INT_V1 kodi_gui_window_set_property_int; + PFN_KODI_GUI_WINDOW_SET_PROPERTY_V1 kodi_gui_window_set_property; + PFN_KODI_GUI_WINDOW_SHOW_V1 kodi_gui_window_show; + + // gui/controls/button.h + PFN_KODI_GUI_CONTROLS_BUTTON_GET_LABEL2_V1 kodi_gui_controls_button_get_label2; + PFN_KODI_GUI_CONTROLS_BUTTON_GET_LABEL_V1 kodi_gui_controls_button_get_label; + PFN_KODI_GUI_CONTROLS_BUTTON_SET_ENABLED_V1 kodi_gui_controls_button_set_enabled; + PFN_KODI_GUI_CONTROLS_BUTTON_SET_LABEL2_V1 kodi_gui_controls_button_set_label2; + PFN_KODI_GUI_CONTROLS_BUTTON_SET_LABEL_V1 kodi_gui_controls_button_set_label; + PFN_KODI_GUI_CONTROLS_BUTTON_SET_VISIBLE_V1 kodi_gui_controls_button_set_visible; + + // gui/controls/edit.h + PFN_KODI_GUI_CONTROLS_EDIT_GET_CURSOR_POSITION_V1 kodi_gui_controls_edit_get_cursor_position; + PFN_KODI_GUI_CONTROLS_EDIT_GET_LABEL_V1 kodi_gui_controls_edit_get_label; + PFN_KODI_GUI_CONTROLS_EDIT_GET_TEXT_V1 kodi_gui_controls_edit_get_text; + PFN_KODI_GUI_CONTROLS_EDIT_SET_CURSOR_POSITION_V1 kodi_gui_controls_edit_set_cursor_position; + PFN_KODI_GUI_CONTROLS_EDIT_SET_ENABLED_V1 kodi_gui_controls_edit_set_enabled; + PFN_KODI_GUI_CONTROLS_EDIT_SET_INPUT_TYPE_V1 kodi_gui_controls_edit_set_input_type; + PFN_KODI_GUI_CONTROLS_EDIT_SET_LABEL_V1 kodi_gui_controls_edit_set_label; + PFN_KODI_GUI_CONTROLS_EDIT_SET_TEXT_V1 kodi_gui_controls_edit_set_text; + PFN_KODI_GUI_CONTROLS_EDIT_SET_VISIBLE_V1 kodi_gui_controls_edit_set_visible; + + // gui/controls/fade_label.h + PFN_KODI_GUI_CONTROLS_FADE_LABEL_ADD_LABEL_V1 kodi_gui_controls_fade_label_add_label; + PFN_KODI_GUI_CONTROLS_FADE_LABEL_GET_LABEL_V1 kodi_gui_controls_fade_label_get_label; + PFN_KODI_GUI_CONTROLS_FADE_LABEL_RESET_V1 kodi_gui_controls_fade_label_reset; + PFN_KODI_GUI_CONTROLS_FADE_LABEL_SET_SCROLLING_V1 kodi_gui_controls_fade_label_set_scrolling; + PFN_KODI_GUI_CONTROLS_FADE_LABEL_SET_VISIBLE_V1 kodi_gui_controls_fade_label_set_visible; + + // gui/controls/image.h + PFN_KODI_GUI_CONTROLS_IMAGE_SET_COLOR_DIFFUSE_V1 kodi_gui_controls_image_set_color_diffuse; + PFN_KODI_GUI_CONTROLS_IMAGE_SET_FILENAME_V1 kodi_gui_controls_image_set_filename; + PFN_KODI_GUI_CONTROLS_IMAGE_SET_VISIBLE_V1 kodi_gui_controls_image_set_visible; + + // gui/controls/label.h + PFN_KODI_GUI_CONTROLS_LABEL_GET_LABEL_V1 kodi_gui_controls_label_get_label; + PFN_KODI_GUI_CONTROLS_LABEL_SET_LABEL_V1 kodi_gui_controls_label_set_label; + PFN_KODI_GUI_CONTROLS_LABEL_SET_VISIBLE_V1 kodi_gui_controls_label_set_visible; + + // gui/controls/progress.h + PFN_KODI_GUI_CONTROLS_PROGRESS_GET_PERCENTAGE_V1 kodi_gui_controls_progress_get_percentage; + PFN_KODI_GUI_CONTROLS_PROGRESS_SET_PERCENTAGE_V1 kodi_gui_controls_progress_set_percentage; + PFN_KODI_GUI_CONTROLS_PROGRESS_SET_VISIBLE_V1 kodi_gui_controls_progress_set_visible; + + // gui/controls/radio_button.h + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_GET_LABEL_V1 kodi_gui_controls_radio_button_get_label; + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_IS_SELECTED_V1 kodi_gui_controls_radio_button_is_selected; + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_ENABLED_V1 kodi_gui_controls_radio_button_set_enabled; + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_LABEL_V1 kodi_gui_controls_radio_button_set_label; + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_SELECTED_V1 kodi_gui_controls_radio_button_set_selected; + PFN_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_VISIBLE_V1 kodi_gui_controls_radio_button_set_visible; + + // gui/controls/rendering.h + PFN_KODI_GUI_CONTROLS_RADIO_RENDERING_DESTROY_V1 kodi_gui_controls_radio_rendering_destroy; + + // gui/controls/settings_slider.h + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_FLOAT_VALUE_V1 + kodi_gui_controls_settings_slider_get_float_value; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_INT_VALUE_V1 + kodi_gui_controls_settings_slider_get_int_value; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_PERCENTAGE_V1 + kodi_gui_controls_settings_slider_get_percentage; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_RESET_V1 kodi_gui_controls_settings_slider_reset; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_ENABLED_V1 + kodi_gui_controls_settings_slider_set_enabled; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_INTERVAL_V1 + kodi_gui_controls_settings_slider_set_float_interval; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_RANGE_V1 + kodi_gui_controls_settings_slider_set_float_range; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_VALUE_V1 + kodi_gui_controls_settings_slider_set_float_value; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_INTERVAL_V1 + kodi_gui_controls_settings_slider_set_int_interval; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_RANGE_V1 + kodi_gui_controls_settings_slider_set_int_range; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_VALUE_V1 + kodi_gui_controls_settings_slider_set_int_value; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_PERCENTAGE_V1 + kodi_gui_controls_settings_slider_set_percentage; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_TEXT_V1 kodi_gui_controls_settings_slider_set_text; + PFN_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_VISIBLE_V1 + kodi_gui_controls_settings_slider_set_visible; + + // gui/controls/slider.h + PFN_KODI_GUI_CONTROLS_SLIDER_GET_DESCRIPTION_V1 kodi_gui_controls_slider_get_description; + PFN_KODI_GUI_CONTROLS_SLIDER_GET_FLOAT_VALUE_V1 kodi_gui_controls_slider_get_float_value; + PFN_KODI_GUI_CONTROLS_SLIDER_GET_INT_VALUE_V1 kodi_gui_controls_slider_get_int_value; + PFN_KODI_GUI_CONTROLS_SLIDER_GET_PERCENTAGE_V1 kodi_gui_controls_slider_get_percentage; + PFN_KODI_GUI_CONTROLS_SLIDER_RESET_V1 kodi_gui_controls_slider_reset; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_ENABLED_V1 kodi_gui_controls_slider_set_enabled; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_INTERVAL_V1 kodi_gui_controls_slider_set_float_interval; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_RANGE_V1 kodi_gui_controls_slider_set_float_range; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_VALUE_V1 kodi_gui_controls_slider_set_float_value; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_INTERVAL_V1 kodi_gui_controls_slider_set_int_interval; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_RANGE_V1 kodi_gui_controls_slider_set_int_range; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_INT_VALUE_V1 kodi_gui_controls_slider_set_int_value; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_PERCENTAGE_V1 kodi_gui_controls_slider_set_percentage; + PFN_KODI_GUI_CONTROLS_SLIDER_SET_VISIBLE_V1 kodi_gui_controls_slider_set_visible; + + // gui/controls/spin.h + PFN_KODI_GUI_CONTROLS_SPIN_ADD_INT_LABEL_V1 kodi_gui_controls_spin_add_int_label; + PFN_KODI_GUI_CONTROLS_SPIN_ADD_STRING_LABEL_V1 kodi_gui_controls_spin_add_string_label; + PFN_KODI_GUI_CONTROLS_SPIN_GET_FLOAT_VALUE_V1 kodi_gui_controls_spin_get_float_value; + PFN_KODI_GUI_CONTROLS_SPIN_GET_INT_VALUE_V1 kodi_gui_controls_spin_get_int_value; + PFN_KODI_GUI_CONTROLS_SPIN_GET_STRING_VALUE_V1 kodi_gui_controls_spin_get_string_value; + PFN_KODI_GUI_CONTROLS_SPIN_RESET_V1 kodi_gui_controls_spin_reset; + PFN_KODI_GUI_CONTROLS_SPIN_SET_ENABLED_V1 kodi_gui_controls_spin_set_enabled; + PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_INTERVAL_V1 kodi_gui_controls_spin_set_float_interval; + PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_RANGE_V1 kodi_gui_controls_spin_set_float_range; + PFN_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_VALUE_V1 kodi_gui_controls_spin_set_float_value; + PFN_KODI_GUI_CONTROLS_SPIN_SET_INT_RANGE_V1 kodi_gui_controls_spin_set_int_range; + PFN_KODI_GUI_CONTROLS_SPIN_SET_INT_VALUE_V1 kodi_gui_controls_spin_set_int_value; + PFN_KODI_GUI_CONTROLS_SPIN_SET_STRING_VALUE_V1 kodi_gui_controls_spin_set_string_value; + PFN_KODI_GUI_CONTROLS_SPIN_SET_TEXT_V1 kodi_gui_controls_spin_set_text; + PFN_KODI_GUI_CONTROLS_SPIN_SET_TYPE_V1 kodi_gui_controls_spin_set_type; + PFN_KODI_GUI_CONTROLS_SPIN_SET_VISIBLE_V1 kodi_gui_controls_spin_set_visible; + + // gui/controls/text_box.h + PFN_KODI_GUI_CONTROLS_TEXT_BOX_GET_TEXT_V1 kodi_gui_controls_text_box_get_text; + PFN_KODI_GUI_CONTROLS_TEXT_BOX_RESET_V1 kodi_gui_controls_text_box_reset; + PFN_KODI_GUI_CONTROLS_TEXT_BOX_SCROLL_V1 kodi_gui_controls_text_box_scroll; + PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_AUTO_SCROLLING_V1 + kodi_gui_controls_text_box_set_auto_scrolling; + PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_TEXT_V1 kodi_gui_controls_text_box_set_text; + PFN_KODI_GUI_CONTROLS_TEXT_BOX_SET_VISIBLE_V1 kodi_gui_controls_text_box_set_visible; + + // gui/dialogs/context_menu.h + PFN_KODI_GUI_DIALOGS_CONTEXT_MENU_OPEN_V1 kodi_gui_dialogs_context_menu_open; + + // gui/dialogs/extended_progress.h + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_DELETE_DIALOG_V1 + kodi_gui_dialogs_extended_progress_delete_dialog; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_PERCENTAGE_V1 + kodi_gui_dialogs_extended_progress_get_percentage; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TEXT_V1 kodi_gui_dialogs_extended_progress_get_text; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TITLE_V1 + kodi_gui_dialogs_extended_progress_get_title; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_IS_FINISHED_V1 + kodi_gui_dialogs_extended_progress_is_finished; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_MARK_FINISHED_V1 + kodi_gui_dialogs_extended_progress_mark_finished; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_NEW_DIALOG_V1 + kodi_gui_dialogs_extended_progress_new_dialog; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PERCENTAGE_V1 + kodi_gui_dialogs_extended_progress_set_percentage; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PROGRESS_V1 + kodi_gui_dialogs_extended_progress_set_progress; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TEXT_V1 kodi_gui_dialogs_extended_progress_set_text; + PFN_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TITLE_V1 + kodi_gui_dialogs_extended_progress_set_title; + + // gui/dialogs/filebrowser.h + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_CLEAR_FILE_LIST_V1 + kodi_gui_dialogs_file_browser_clear_file_list; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_DIRECTORY_V1 + kodi_gui_dialogs_file_browser_show_and_get_directory; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_FROM_DIR_V1 + kodi_gui_dialogs_file_browser_show_and_get_file_from_dir; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_LIST_V1 + kodi_gui_dialogs_file_browser_show_and_get_file_list; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_V1 + kodi_gui_dialogs_file_browser_show_and_get_file; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_LIST_V1 + kodi_gui_dialogs_file_browser_show_and_get_image_list; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_V1 + kodi_gui_dialogs_file_browser_show_and_get_image; + PFN_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_SOURCE_V1 + kodi_gui_dialogs_file_browser_show_and_get_source; + + // gui/dialogs/keyboard.h + PFN_KODI_GUI_DIALOGS_KEYBOARD_IS_KEYBOARD_ACTIVATED_V1 + kodi_gui_dialogs_keyboard_is_keyboard_activated; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SEND_TEXT_TO_ACTIVE_KEYBOARD_V1 + kodi_gui_dialogs_keyboard_send_text_to_active_keyboard; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_FILTER_V1 + kodi_gui_dialogs_keyboard_show_and_get_filter; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_V1 + kodi_gui_dialogs_keyboard_show_and_get_input; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_get_input_with_head; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_get_new_password; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_new_password; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head; + PFN_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_password; + + // gui/dialogs/numeric.h + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_DATE_V1 kodi_gui_dialogs_numeric_show_and_get_date; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_IP_ADDRESS_V1 + kodi_gui_dialogs_numeric_show_and_get_ip_address; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_NUMBER_V1 + kodi_gui_dialogs_numeric_show_and_get_number; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_SECONDS_V1 + kodi_gui_dialogs_numeric_show_and_get_seconds; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_TIME_V1 kodi_gui_dialogs_numeric_show_and_get_time; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_INPUT_V1 + kodi_gui_dialogs_numeric_show_and_verify_input; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_NEW_PASSWORD_V1 + kodi_gui_dialogs_numeric_show_and_verify_new_password; + PFN_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_PASSWORD_V1 + kodi_gui_dialogs_numeric_show_and_verify_password; + + // gui/dialogs/ok.h + PFN_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_LINE_TEXT_V1 + kodi_gui_dialogs_ok_show_and_get_input_line_text; + PFN_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1 + kodi_gui_dialogs_ok_show_and_get_input_single_text; + + // gui/dialogs/progress.h + PFN_KODI_GUI_DIALOGS_PROGRESS_ABORT_V1 kodi_gui_dialogs_progress_abort; + PFN_KODI_GUI_DIALOGS_PROGRESS_DELETE_DIALOG_V1 kodi_gui_dialogs_progress_delete_dialog; + PFN_KODI_GUI_DIALOGS_PROGRESS_GET_PERCENTAGE_V1 kodi_gui_dialogs_progress_get_percentage; + PFN_KODI_GUI_DIALOGS_PROGRESS_IS_CANCELED_V1 kodi_gui_dialogs_progress_is_canceled; + PFN_KODI_GUI_DIALOGS_PROGRESS_NEW_DIALOG_V1 kodi_gui_dialogs_progress_new_dialog; + PFN_KODI_GUI_DIALOGS_PROGRESS_OPEN_V1 kodi_gui_dialogs_progress_open; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_CAN_CANCEL_V1 kodi_gui_dialogs_progress_set_can_cancel; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_HEADING_V1 kodi_gui_dialogs_progress_set_heading; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_LINE_V1 kodi_gui_dialogs_progress_set_line; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PERCENTAGE_V1 kodi_gui_dialogs_progress_set_percentage; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_ADVANCE_V1 + kodi_gui_dialogs_progress_set_progress_advance; + PFN_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_MAX_V1 kodi_gui_dialogs_progress_set_progress_max; + PFN_KODI_GUI_DIALOGS_PROGRESS_SHOW_PROGRESS_BAR_V1 kodi_gui_dialogs_progress_show_progress_bar; + + // gui/dialogs/select.h + PFN_KODI_GUI_DIALOGS_SELECT_OPEN_MULTI_SELECT_V1 kodi_gui_dialogs_select_open_multi_select; + PFN_KODI_GUI_DIALOGS_SELECT_OPEN_V1 kodi_gui_dialogs_select_open; + + // gui/dialogs/text_viewer.h + PFN_KODI_GUI_DIALOGS_TEXT_VIEWER_SHOW_V1 kodi_gui_dialogs_text_viewer_show; + + // gui/dialogs/yes_no.h + PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_BUTTON_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_line_button_text; + PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_line_text; + PFN_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_single_text; + }; + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* C_API_DL_API_1_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/filesystem.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/filesystem.h index 4290cb98aa201..306cf06794452 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/filesystem.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/filesystem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2018 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,8 +9,8 @@ #ifndef C_API_FILESYSTEM_H #define C_API_FILESYSTEM_H -#include -#include +#include "addon_base.h" + #include #ifdef _WIN32 // windows @@ -40,183 +40,58 @@ extern "C" { #endif /* __cplusplus */ - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - // "C" Definitions, structures and enumerators of filesystem - //{{{ + typedef void* KODI_FILE_HDL; + typedef void* KODI_HTTP_HEADER_HDL; - //============================================================================ - /// @defgroup cpp_kodi_vfs_Defs_OpenFileFlags enum OpenFileFlags - /// @ingroup cpp_kodi_vfs_Defs - /// @brief **Flags to define way how file becomes opened**\n - /// The values can be used together, e.g. `file.Open("myfile", ADDON_READ_TRUNCATED | ADDON_READ_CHUNKED);` - /// - /// Used on @ref kodi::vfs::CFile::OpenFile(). - /// - ///@{ typedef enum OpenFileFlags { - /// @brief **0000 0000 0001** :\n - /// Indicate that caller can handle truncated reads, where function - /// returns before entire buffer has been filled. ADDON_READ_TRUNCATED = 0x01, - - /// @brief **0000 0000 0010** :\n - /// Indicate that that caller support read in the minimum defined - /// chunk size, this disables internal cache then. ADDON_READ_CHUNKED = 0x02, - - /// @brief **0000 0000 0100** :\n - /// Use cache to access this file. ADDON_READ_CACHED = 0x04, - - /// @brief **0000 0000 1000** :\n - /// Open without caching. regardless to file type. ADDON_READ_NO_CACHE = 0x08, - - /// @brief **0000 0001 0000** :\n - /// Calcuate bitrate for file while reading. ADDON_READ_BITRATE = 0x10, - - /// @brief **0000 0010 0000** :\n - /// Indicate to the caller we will seek between multiple streams in - /// the file frequently. ADDON_READ_MULTI_STREAM = 0x20, - - /// @brief **0000 0100 0000** :\n - /// indicate to the caller file is audio and/or video (and e.g. may - /// grow). ADDON_READ_AUDIO_VIDEO = 0x40, - - /// @brief **0000 1000 0000** :\n - /// Indicate that caller will do write operations before reading. ADDON_READ_AFTER_WRITE = 0x80, - - /// @brief **0001 0000 0000** :\n - /// Indicate that caller want to reopen a file if its already open. ADDON_READ_REOPEN = 0x100 } OpenFileFlags; - ///@} - //---------------------------------------------------------------------------- - //============================================================================ - /// @defgroup cpp_kodi_vfs_Defs_CURLOptiontype enum CURLOptiontype - /// @ingroup cpp_kodi_vfs_Defs - /// @brief **CURL message types**\n - /// Used on kodi::vfs::CFile::CURLAddOption(). - /// - ///@{ typedef enum CURLOptiontype { - /// @brief Set a general option. ADDON_CURL_OPTION_OPTION, - - /// @brief Set a protocol option.\n - ///\n - /// The following names for *ADDON_CURL_OPTION_PROTOCOL* are possible: - /// | Option name | Description - /// |------------------------------------:|:-------------------------------- - /// | `accept-charset` | Set the "accept-charset" header - /// | `acceptencoding or encoding` | Set the "accept-encoding" header - /// | `active-remote` | Set the "active-remote" header - /// | `auth` | Set the authentication method. Possible values: any, anysafe, digest, ntlm - /// | `connection-timeout` | Set the connection timeout in seconds - /// | `cookie` | Set the "cookie" header - /// | `customrequest` | Set a custom HTTP request like DELETE - /// | `noshout` | Set to true if kodi detects a stream as shoutcast by mistake. - /// | `postdata` | Set the post body (value needs to be base64 encoded). (Implicitly sets the request to POST) - /// | `referer` | Set the "referer" header - /// | `user-agent` | Set the "user-agent" header - /// | `seekable` | Set the stream seekable. 1: enable, 0: disable - /// | `sslcipherlist` | Set list of accepted SSL ciphers. - /// ADDON_CURL_OPTION_PROTOCOL, - - /// @brief Set User and password ADDON_CURL_OPTION_CREDENTIALS, - - /// @brief Add a Header ADDON_CURL_OPTION_HEADER } CURLOptiontype; - ///@} - //---------------------------------------------------------------------------- - //============================================================================ - /// @defgroup cpp_kodi_vfs_Defs_FilePropertyTypes enum FilePropertyTypes - /// @ingroup cpp_kodi_vfs_Defs - /// @brief **File property types**\n - /// Mostly to read internet sources. - /// - /// Used on kodi::vfs::CFile::GetPropertyValue() and kodi::vfs::CFile::GetPropertyValues(). - /// - ///@{ typedef enum FilePropertyTypes { - /// @brief Get protocol response line. ADDON_FILE_PROPERTY_RESPONSE_PROTOCOL, - /// @brief Get a response header. ADDON_FILE_PROPERTY_RESPONSE_HEADER, - /// @brief Get file content type. ADDON_FILE_PROPERTY_CONTENT_TYPE, - /// @brief Get file content charset. ADDON_FILE_PROPERTY_CONTENT_CHARSET, - /// @brief Get file mime type. ADDON_FILE_PROPERTY_MIME_TYPE, - /// @brief Get file effective URL (last one if redirected). ADDON_FILE_PROPERTY_EFFECTIVE_URL } FilePropertyTypes; - ///@} - //---------------------------------------------------------------------------- - - //}}} - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - // "C" Internal interface tables for intercommunications between addon and kodi - //{{{ - - struct KODI_HTTP_HEADER + struct VFS_STAT_STRUCTURE { - void* handle; - - char* (*get_value)(void* kodiBase, void* handle, const char* param); - char** (*get_values)(void* kodiBase, void* handle, const char* param, int* length); - char* (*get_header)(void* kodiBase, void* handle); - char* (*get_mime_type)(void* kodiBase, void* handle); - char* (*get_charset)(void* kodiBase, void* handle); - char* (*get_proto_line)(void* kodiBase, void* handle); - }; - - struct STAT_STRUCTURE - { - /// ID of device containing file uint32_t deviceId; - /// Total size, in bytes uint64_t size; - /// Time of last access time_t accessTime; - /// Time of last modification time_t modificationTime; - /// Time of last status change time_t statusTime; - /// The stat url is a directory bool isDirectory; - /// The stat url is a symbolic link bool isSymLink; - /// The stat url is block special bool isBlock; - /// The stat url is character special bool isCharacter; - /// The stat url is FIFO special bool isFifo; - /// The stat url is regular bool isRegular; - /// The stat url is socket bool isSocket; - /// The file serial number, which distinguishes this file from all other files on the same - /// device. uint64_t fileSerialNumber; }; - struct VFS_CACHE_STATUS_DATA + struct VFS_CACHE_STATUS { uint64_t forward; unsigned int maxrate; @@ -224,99 +99,125 @@ extern "C" bool lowspeed; }; - struct VFSProperty + struct VFS_PROPERTY { char* name; char* val; }; - struct VFSDirEntry + struct VFS_DIR_ENTRY { - char* label; //!< item label - char* title; //!< item title - char* path; //!< item path - unsigned int num_props; //!< Number of properties attached to item - struct VFSProperty* properties; //!< Properties - time_t date_time; //!< file creation date & time - bool folder; //!< Item is a folder - uint64_t size; //!< Size of file represented by item + char* label; + char* title; + char* path; + size_t num_props; + struct VFS_PROPERTY* properties; + time_t date_time; + bool folder; + uint64_t size; }; - typedef struct AddonToKodiFuncTable_kodi_filesystem - { - bool (*can_open_directory)(void* kodiBase, const char* url); - bool (*create_directory)(void* kodiBase, const char* path); - bool (*remove_directory)(void* kodiBase, const char* path); - bool (*directory_exists)(void* kodiBase, const char* path); - bool (*get_directory)(void* kodiBase, - const char* path, - const char* mask, - struct VFSDirEntry** items, - unsigned int* num_items); - void (*free_directory)(void* kodiBase, struct VFSDirEntry* items, unsigned int num_items); - - bool (*file_exists)(void* kodiBase, const char* filename, bool useCache); - bool (*stat_file)(void* kodiBase, const char* filename, struct STAT_STRUCTURE* buffer); - bool (*delete_file)(void* kodiBase, const char* filename); - bool (*rename_file)(void* kodiBase, const char* filename, const char* newFileName); - bool (*copy_file)(void* kodiBase, const char* filename, const char* dest); - - char* (*get_file_md5)(void* kodiBase, const char* filename); - char* (*get_cache_thumb_name)(void* kodiBase, const char* filename); - char* (*make_legal_filename)(void* kodiBase, const char* filename); - char* (*make_legal_path)(void* kodiBase, const char* path); - char* (*translate_special_protocol)(void* kodiBase, const char* strSource); - bool (*is_internet_stream)(void* kodiBase, const char* path, bool strictCheck); - bool (*is_on_lan)(void* kodiBase, const char* path); - bool (*is_remote)(void* kodiBase, const char* path); - bool (*is_local)(void* kodiBase, const char* path); - bool (*is_url)(void* kodiBase, const char* path); - bool (*get_http_header)(void* kodiBase, const char* url, struct KODI_HTTP_HEADER* headers); - bool (*get_mime_type)(void* kodiBase, const char* url, char** content, const char* useragent); - bool (*get_content_type)(void* kodiBase, - const char* url, - char** content, - const char* useragent); - bool (*get_cookies)(void* kodiBase, const char* url, char** cookies); - bool (*http_header_create)(void* kodiBase, struct KODI_HTTP_HEADER* headers); - void (*http_header_free)(void* kodiBase, struct KODI_HTTP_HEADER* headers); - - void* (*open_file)(void* kodiBase, const char* filename, unsigned int flags); - void* (*open_file_for_write)(void* kodiBase, const char* filename, bool overwrite); - ssize_t (*read_file)(void* kodiBase, void* file, void* ptr, size_t size); - bool (*read_file_string)(void* kodiBase, void* file, char* szLine, int iLineLength); - ssize_t (*write_file)(void* kodiBase, void* file, const void* ptr, size_t size); - void (*flush_file)(void* kodiBase, void* file); - int64_t (*seek_file)(void* kodiBase, void* file, int64_t position, int whence); - int (*truncate_file)(void* kodiBase, void* file, int64_t size); - int64_t (*get_file_position)(void* kodiBase, void* file); - int64_t (*get_file_length)(void* kodiBase, void* file); - double (*get_file_download_speed)(void* kodiBase, void* file); - void (*close_file)(void* kodiBase, void* file); - int (*get_file_chunk_size)(void* kodiBase, void* file); - bool (*io_control_get_seek_possible)(void* kodiBase, void* file); - bool (*io_control_get_cache_status)(void* kodiBase, - void* file, - struct VFS_CACHE_STATUS_DATA* status); - bool (*io_control_set_cache_rate)(void* kodiBase, void* file, unsigned int rate); - bool (*io_control_set_retry)(void* kodiBase, void* file, bool retry); - char** (*get_property_values)( - void* kodiBase, void* file, int type, const char* name, int* numValues); - - void* (*curl_create)(void* kodiBase, const char* url); - bool (*curl_add_option)( - void* kodiBase, void* file, int type, const char* name, const char* value); - bool (*curl_open)(void* kodiBase, void* file, unsigned int flags); - - bool (*get_disk_space)( - void* kodiBase, const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available); - bool (*remove_directory_recursive)(void* kodiBase, const char* path); - } AddonToKodiFuncTable_kodi_filesystem; - - //}}} + /*!@{*/ + ATTR_DLL_EXPORT bool kodi_vfs_can_open_directory(const char* url) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_create_directory(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_remove_directory(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_remove_directory_recursive(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_directory_exists(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_get_directory(const char* path, + const char* mask, + struct VFS_DIR_ENTRY** items, + size_t* num_items) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_vfs_free_directory(struct VFS_DIR_ENTRY* items, + size_t num_items) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + /*!@}*/ + + /*!@{*/ + ATTR_DLL_EXPORT bool kodi_vfs_file_exists(const char* filename, bool useCache) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_stat_file(const char* filename, + struct VFS_STAT_STRUCTURE* buffer) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_delete_file(const char* filename) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_rename_file(const char* filename, const char* newFileName) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_copy_file(const char* filename, const char* dest) __INTRODUCED_IN_KODI(1); + /*!@}*/ + + /*!@{*/ + ATTR_DLL_EXPORT char* kodi_vfs_get_file_md5(const char* filename) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_get_cache_thumb_name(const char* filename) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_make_legal_filename(const char* filename) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_make_legal_path(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_translate_special_protocol(const char* strSource) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_is_internet_stream(const char* path, bool strictCheck) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_is_on_lan(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_is_remote(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_is_local(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_is_url(const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_get_mime_type(const char* url, + char** content, + const char* useragent) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_get_content_type(const char* url, + char** content, + const char* useragent) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_get_cookies(const char* url, char** cookies) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_get_disk_space(const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) __INTRODUCED_IN_KODI(1); + /*!@}*/ + + /*!@{*/ + ATTR_DLL_EXPORT KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open(const char* url) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_vfs_http_header_close(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_value(KODI_HTTP_HEADER_HDL hdl, + const char* param) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char** kodi_vfs_http_header_get_values(KODI_HTTP_HEADER_HDL hdl, + const char* param, + size_t* length) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_header(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_mime_type(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_charset(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_proto_line(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + /*!@}*/ + + /*!@{*/ + ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open(const char* filename, unsigned int flags) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open_for_write(const char* filename, + bool overwrite) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_curl_create(const char* url) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_curl_add_option(KODI_FILE_HDL hdl, + enum CURLOptiontype type, + const char* name, + const char* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_curl_open(KODI_FILE_HDL hdl, unsigned int flags) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_vfs_file_close(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT ssize_t kodi_vfs_file_read(KODI_FILE_HDL hdl, uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_read_line(KODI_FILE_HDL hdl, + char* szLine, + size_t lineLength) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT ssize_t kodi_vfs_file_write(KODI_FILE_HDL hdl, const uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_vfs_file_flush(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int64_t kodi_vfs_file_seek(KODI_FILE_HDL hdl, int64_t position, int whence) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_vfs_file_truncate(KODI_FILE_HDL hdl, int64_t size) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_position(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_length(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_at_end(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_vfs_file_get_download_speed(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_vfs_file_get_chunk_size(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_seek_possible(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_cache_status(KODI_FILE_HDL hdl, + struct VFS_CACHE_STATUS* status) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, + unsigned int rate) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_retry(KODI_FILE_HDL hdl, bool retry) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_vfs_file_get_property_value(KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char** kodi_vfs_file_get_property_values(KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name, + size_t* length) __INTRODUCED_IN_KODI(1); + /*!@}*/ #ifdef __cplusplus -} /* extern "C" */ +} #endif /* __cplusplus */ #endif /* !C_API_FILESYSTEM_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/general.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/general.h index 8518a96e544fa..ac9edc5b6dd69 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/general.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/general.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2018 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,120 +9,78 @@ #ifndef C_API_GENERAL_H #define C_API_GENERAL_H -#include +#include "addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - //============================================================================ - /// \ingroup cpp_kodi_Defs - /// @brief For kodi::CurrentKeyboardLayout used defines - /// typedef enum StdKbButtons { - /// The quantity of buttons per row on Kodi's standard keyboard STD_KB_BUTTONS_PER_ROW = 20, - /// The quantity of rows on Kodi's standard keyboard STD_KB_BUTTONS_MAX_ROWS = 4, - /// Keyboard layout type, this for initial standard + STD_KB_BUTTONS_MAX_CHAR = 16, STD_KB_MODIFIER_KEY_NONE = 0x00, - /// Keyboard layout type, this for shift controled layout (uppercase) STD_KB_MODIFIER_KEY_SHIFT = 0x01, - /// Keyboard layout type, this to show symbols STD_KB_MODIFIER_KEY_SYMBOL = 0x02 } StdKbButtons; - //---------------------------------------------------------------------------- - //============================================================================ - /// \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. - /// - /// Used on kodi::GetLanguage(). - /// 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; - //---------------------------------------------------------------------------- - /* - * 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 enum DigestType + { + DIGEST_MD5, + DIGEST_SHA1, + DIGEST_SHA256, + DIGEST_SHA512 + } DigestType; + typedef struct AddonKeyboardKeyTable { char* keys[STD_KB_BUTTONS_MAX_ROWS][STD_KB_BUTTONS_PER_ROW]; } AddonKeyboardKeyTable; - typedef struct AddonToKodiFuncTable_kodi - { - char* (*get_addon_info)(void* kodiBase, const char* id); - 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 label_id); - 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); - void (*get_md5)(void* kodiBase, const char* text, char* md5); - char* (*get_temp_path)(void* kodiBase); - char* (*get_region)(void* kodiBase, const char* id); - void (*get_free_mem)(void* kodiBase, long* free, long* total, bool as_bytes); - int (*get_global_idle_time)(void* kodiBase); - bool (*is_addon_avilable)(void* kodiBase, const char* id, char** version, bool* enabled); - void (*kodi_version)(void* kodiBase, - char** compile_name, - int* major, - int* minor, - char** revision, - char** tag, - char** tagversion); - char* (*get_current_skin_id)(void* kodiBase); - bool (*get_keyboard_layout)(void* kodiBase, - char** layout_name, - int modifier_key, - struct AddonKeyboardKeyTable* layout); - bool (*change_keyboard_layout)(void* kodiBase, char** layout_name); - } AddonToKodiFuncTable_kodi; + ATTR_DLL_EXPORT char* kodi_get_localized_string(long label_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_get_free_mem(long* free, long* total, bool as_bytes) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_unknown_to_utf8(const char* source, bool* ret, bool failOnBadChar) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_get_language(enum LangFormats format, bool region) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_queue_notification(enum QueueMsg type, + const char* header, + const char* message, + const char* imageFile, + unsigned int displayTime, + bool withSound, + unsigned int messageTime) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_get_digest(enum DigestType type, const char* text) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_get_region(const char* id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_get_global_idle_time() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_is_addon_avilable(const char* id, char** version, bool* enabled) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_version( + char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_get_current_skin_id() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_get_keyboard_layout(int modifier_key, + char** layout_name, + struct AddonKeyboardKeyTable* layout) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_change_keyboard_layout(char** layout_name) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_play_sfx(const char* filename, bool use_cached) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_stop_sfx() __INTRODUCED_IN_KODI(1); #ifdef __cplusplus -} /* extern "C" */ +} #endif /* __cplusplus */ #endif /* !C_API_GENERAL_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/CMakeLists.txt index 53c4e60aebf12..78cb2ff4e9841 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/CMakeLists.txt @@ -1,8 +1,12 @@ -set(HEADERS definitions.h - general.h - list_item.h - window.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_gui) +set(HEADERS + general.h + list_item.h + window.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_gui) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/CMakeLists.txt index 2e6cd53f8913a..853eb2da77960 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/CMakeLists.txt @@ -1,16 +1,21 @@ -set(HEADERS button.h - edit.h - fade_label.h - image.h - label.h - progress.h - radio_button.h - rendering.h - settings_slider.h - slider.h - spin.h - text_box.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_gui_controls) +set(HEADERS + button.h + edit.h + fade_label.h + image.h + label.h + progress.h + radio_button.h + rendering.h + settings_slider.h + slider.h + spin.h + text_box.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_gui_controls) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h index 46de2629d2ca7..a98a9bd461ae2 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/button.h @@ -9,22 +9,29 @@ #ifndef C_API_GUI_CONTROLS_BUTTON_H #define C_API_GUI_CONTROLS_BUTTON_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_button - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*set_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_label2)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - char* (*get_label2)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_button; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label2(KODI_GUI_CONTROL_HANDLE handle, + const char* label) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label2(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h index 571c7ce43cbb3..9f9e63d5dc876 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/edit.h @@ -9,13 +9,15 @@ #ifndef C_API_GUI_CONTROLS_EDIT_H #define C_API_GUI_CONTROLS_EDIT_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ + typedef void* KODI_GUI_CONTROL_HANDLE; + //============================================================================ /// @ingroup cpp_kodi_gui_windows_controls_CEdit_Defs /// @{ @@ -52,23 +54,28 @@ extern "C" /// @} //---------------------------------------------------------------------------- - typedef struct AddonToKodiFuncTable_kodi_gui_control_edit - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*set_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - char* (*get_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_cursor_position)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - unsigned int position); - unsigned int (*get_cursor_position)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_input_type)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - int type, - const char* heading); - } AddonToKodiFuncTable_kodi_gui_control_edit; + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_label(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_text(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_cursor_position(KODI_GUI_CONTROL_HANDLE handle, + unsigned int position) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT unsigned int kodi_gui_controls_edit_get_cursor_position( + KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_input_type(KODI_GUI_CONTROL_HANDLE handle, + int type, + const char* heading) + __INTRODUCED_IN_KODI(1); + #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h index dab45747121c4..282ccf87d5011 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/fade_label.h @@ -9,21 +9,28 @@ #ifndef C_API_GUI_CONTROLS_FADE_LABEL_H #define C_API_GUI_CONTROLS_FADE_LABEL_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_fade_label - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*add_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_scrolling)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool scroll); - void (*reset)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_fade_label; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_add_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_fade_label_get_label(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_scrolling(KODI_GUI_CONTROL_HANDLE handle, + bool scroll) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_reset(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h index 257dd678fd522..a6d2febe85b7c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/image.h @@ -9,24 +9,23 @@ #ifndef C_API_GUI_CONTROLS_IMAGE_H #define C_API_GUI_CONTROLS_IMAGE_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_image - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_filename)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* filename, - bool use_cache); - void (*set_color_diffuse)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - uint32_t color_diffuse); - } AddonToKodiFuncTable_kodi_gui_control_image; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_image_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_image_set_filename(KODI_GUI_CONTROL_HANDLE handle, + const char* filename, + bool use_cache) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_image_set_color_diffuse(KODI_GUI_CONTROL_HANDLE handle, + uint32_t color_diffuse) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h index 92af25ca8d4b7..5b9b87284f95b 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/label.h @@ -9,19 +9,21 @@ #ifndef C_API_GUI_CONTROLS_LABEL_H #define C_API_GUI_CONTROLS_LABEL_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_label - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_label; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_label_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_label_get_label(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h index 4f211fdf62765..4b411901d1781 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/progress.h @@ -9,19 +9,22 @@ #ifndef C_API_GUI_CONTROLS_PROGRESS_H #define C_API_GUI_CONTROLS_PROGRESS_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_progress - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - float (*get_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_progress; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_percentage(KODI_GUI_CONTROL_HANDLE handle, + float percent) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_progress_get_percentage(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h index d652e6727f4c8..da5ad3daae7b3 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/radio_button.h @@ -9,22 +9,31 @@ #ifndef C_API_GUI_CONTROLS_RADIO_BUTTON_H #define C_API_GUI_CONTROLS_RADIO_BUTTON_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_radio_button - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*set_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_selected)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool selected); - bool (*is_selected)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_radio_button; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_radio_button_get_label(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_selected(KODI_GUI_CONTROL_HANDLE handle, + bool selected) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_controls_radio_button_is_selected(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h index 792a8d6df506b..10091145f8a9f 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/rendering.h @@ -9,25 +9,25 @@ #ifndef C_API_GUI_CONTROLS_RENDERING_H #define C_API_GUI_CONTROLS_RENDERING_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_rendering - { - void (*set_callbacks)( - KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*createCB)(KODI_GUI_CLIENT_HANDLE, int, int, int, int, ADDON_HARDWARE_CONTEXT), - void (*renderCB)(KODI_GUI_CLIENT_HANDLE), - void (*stopCB)(KODI_GUI_CLIENT_HANDLE), - bool (*dirtyCB)(KODI_GUI_CLIENT_HANDLE)); - void (*destroy)(void* kodiBase, KODI_GUI_CONTROL_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_control_rendering; + typedef void* KODI_GUI_CONTROL_HANDLE; + + // // ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_set_callbacks( + // // KODI_GUI_CONTROL_HANDLE handle, + // // KODI_GUI_CLIENT_HANDLE clienthandle, + // // bool (*createCB)(KODI_GUI_CLIENT_HANDLE, int, int, int, int, ADDON_HARDWARE_CONTEXT), + // // void (*renderCB)(KODI_GUI_CLIENT_HANDLE), + // // void (*stopCB)(KODI_GUI_CLIENT_HANDLE), + // // bool (*dirtyCB)(KODI_GUI_CLIENT_HANDLE)) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_destroy(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h index 42992527cd7ef..9a13b836d397f 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/settings_slider.h @@ -9,35 +9,46 @@ #ifndef C_API_GUI_CONTROLS_SETTINGS_SLIDER_H #define C_API_GUI_CONTROLS_SETTINGS_SLIDER_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_settings_slider - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*set_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* label); - void (*reset)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_int_range)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int start, int end); - void (*set_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - int (*get_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_int_interval)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int interval); - void (*set_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - float (*get_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_range)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - void (*set_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - float (*get_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_interval)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - } AddonToKodiFuncTable_kodi_gui_control_settings_slider; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* label) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_reset(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_range( + KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_value( + KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_controls_settings_slider_get_int_value( + KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_interval( + KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_percentage( + KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_percentage( + KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_range( + KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_value( + KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_float_value( + KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_interval( + KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h index 67c6c2fc33e95..621d63f57eb94 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/slider.h @@ -9,35 +9,49 @@ #ifndef C_API_GUI_CONTROLS_SLIDER_H #define C_API_GUI_CONTROLS_SLIDER_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_slider - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*reset)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - char* (*get_description)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_int_range)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int start, int end); - void (*set_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - int (*get_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_int_interval)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int interval); - void (*set_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float percent); - float (*get_percentage)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_range)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - void (*set_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - float (*get_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_interval)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - } AddonToKodiFuncTable_kodi_gui_control_slider; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_reset(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_slider_get_description(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, + int start, + int end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, + int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_controls_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_interval(KODI_GUI_CONTROL_HANDLE handle, + int interval) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_percentage(KODI_GUI_CONTROL_HANDLE handle, + float percent) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_percentage(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_range(KODI_GUI_CONTROL_HANDLE handle, + float start, + float end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_value(KODI_GUI_CONTROL_HANDLE handle, + float value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_float_value(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, + float interval) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h index 0373636afa965..db1b1116046e3 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/spin.h @@ -9,45 +9,54 @@ #ifndef C_API_GUI_CONTROLS_SPIN_H #define C_API_GUI_CONTROLS_SPIN_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_spin - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*set_enabled)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool enabled); - void (*set_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - void (*reset)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_type)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int type); - void (*add_string_label)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - const char* value); - void (*set_string_value)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* value); - char* (*get_string_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*add_int_label)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - const char* label, - int value); - void (*set_int_range)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int start, int end); - void (*set_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int value); - int (*get_int_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_range)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float start, - float end); - void (*set_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, float value); - float (*get_float_value)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_float_interval)(KODI_HANDLE kodiBase, - KODI_GUI_CONTROL_HANDLE handle, - float interval); - } AddonToKodiFuncTable_kodi_gui_control_spin; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_reset(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_type(KODI_GUI_CONTROL_HANDLE handle, int type) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_string_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label, + const char* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_string_value(KODI_GUI_CONTROL_HANDLE handle, + const char* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_spin_get_string_value(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_int_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label, + int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_range(KODI_GUI_CONTROL_HANDLE handle, + int start, + int end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_value(KODI_GUI_CONTROL_HANDLE handle, + int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_controls_spin_get_int_value(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_range(KODI_GUI_CONTROL_HANDLE handle, + float start, + float end) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_value(KODI_GUI_CONTROL_HANDLE handle, + float value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_controls_spin_get_float_value(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, + float interval) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h index 333689e0b2547..6267e06286be7 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/controls/text_box.h @@ -9,23 +9,29 @@ #ifndef C_API_GUI_CONTROLS_TEXT_BOX_H #define C_API_GUI_CONTROLS_TEXT_BOX_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_control_text_box - { - void (*set_visible)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, bool visible); - void (*reset)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*set_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, const char* text); - char* (*get_text)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle); - void (*scroll)(KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, unsigned int scroll); - void (*set_auto_scrolling)( - KODI_HANDLE kodiBase, KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat); - } AddonToKodiFuncTable_kodi_gui_control_text_box; + typedef void* KODI_GUI_CONTROL_HANDLE; + + ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_text_box_reset(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_controls_text_box_get_text(KODI_GUI_CONTROL_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_text_box_scroll(KODI_GUI_CONTROL_HANDLE handle, + unsigned int position) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_auto_scrolling( + KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/definitions.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/definitions.h deleted file mode 100644 index f0ea9a2e70f36..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/definitions.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_GUI_DEFINITIONS_H -#define C_API_GUI_DEFINITIONS_H - -#include "../addon_base.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - typedef void* KODI_GUI_HANDLE; - typedef void* KODI_GUI_CLIENT_HANDLE; - typedef void* KODI_GUI_CONTROL_HANDLE; - typedef void* KODI_GUI_LISTITEM_HANDLE; - typedef void* KODI_GUI_WINDOW_HANDLE; - - struct AddonToKodiFuncTable_kodi_gui_general; - struct AddonToKodiFuncTable_kodi_gui_control_button; - struct AddonToKodiFuncTable_kodi_gui_control_edit; - struct AddonToKodiFuncTable_kodi_gui_control_fade_label; - struct AddonToKodiFuncTable_kodi_gui_control_label; - struct AddonToKodiFuncTable_kodi_gui_control_image; - struct AddonToKodiFuncTable_kodi_gui_control_progress; - struct AddonToKodiFuncTable_kodi_gui_control_radio_button; - struct AddonToKodiFuncTable_kodi_gui_control_rendering; - struct AddonToKodiFuncTable_kodi_gui_control_settings_slider; - struct AddonToKodiFuncTable_kodi_gui_control_slider; - struct AddonToKodiFuncTable_kodi_gui_control_spin; - struct AddonToKodiFuncTable_kodi_gui_control_text_box; - struct AddonToKodiFuncTable_kodi_gui_dialogContextMenu; - struct AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress; - struct AddonToKodiFuncTable_kodi_gui_dialogFileBrowser; - struct AddonToKodiFuncTable_kodi_gui_dialogKeyboard; - struct AddonToKodiFuncTable_kodi_gui_dialogNumeric; - struct AddonToKodiFuncTable_kodi_gui_dialogOK; - struct AddonToKodiFuncTable_kodi_gui_dialogProgress; - struct AddonToKodiFuncTable_kodi_gui_dialogSelect; - struct AddonToKodiFuncTable_kodi_gui_dialogTextViewer; - struct AddonToKodiFuncTable_kodi_gui_dialogYesNo; - struct AddonToKodiFuncTable_kodi_gui_listItem; - struct AddonToKodiFuncTable_kodi_gui_window; - - typedef struct AddonToKodiFuncTable_kodi_gui - { - struct AddonToKodiFuncTable_kodi_gui_general* general; - struct AddonToKodiFuncTable_kodi_gui_control_button* control_button; - struct AddonToKodiFuncTable_kodi_gui_control_edit* control_edit; - struct AddonToKodiFuncTable_kodi_gui_control_fade_label* control_fade_label; - struct AddonToKodiFuncTable_kodi_gui_control_label* control_label; - struct AddonToKodiFuncTable_kodi_gui_control_image* control_image; - struct AddonToKodiFuncTable_kodi_gui_control_progress* control_progress; - struct AddonToKodiFuncTable_kodi_gui_control_radio_button* control_radio_button; - struct AddonToKodiFuncTable_kodi_gui_control_rendering* control_rendering; - struct AddonToKodiFuncTable_kodi_gui_control_settings_slider* control_settings_slider; - struct AddonToKodiFuncTable_kodi_gui_control_slider* control_slider; - struct AddonToKodiFuncTable_kodi_gui_control_spin* control_spin; - struct AddonToKodiFuncTable_kodi_gui_control_text_box* control_text_box; - KODI_HANDLE control_dummy1; - KODI_HANDLE control_dummy2; - KODI_HANDLE control_dummy3; - KODI_HANDLE control_dummy4; - KODI_HANDLE control_dummy5; - KODI_HANDLE control_dummy6; - KODI_HANDLE control_dummy7; - KODI_HANDLE control_dummy8; - KODI_HANDLE control_dummy9; - KODI_HANDLE control_dummy10; /* This and above used to add new controls */ - struct AddonToKodiFuncTable_kodi_gui_dialogContextMenu* dialogContextMenu; - struct AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress* dialogExtendedProgress; - struct AddonToKodiFuncTable_kodi_gui_dialogFileBrowser* dialogFileBrowser; - struct AddonToKodiFuncTable_kodi_gui_dialogKeyboard* dialogKeyboard; - struct AddonToKodiFuncTable_kodi_gui_dialogNumeric* dialogNumeric; - struct AddonToKodiFuncTable_kodi_gui_dialogOK* dialogOK; - struct AddonToKodiFuncTable_kodi_gui_dialogProgress* dialogProgress; - struct AddonToKodiFuncTable_kodi_gui_dialogSelect* dialogSelect; - struct AddonToKodiFuncTable_kodi_gui_dialogTextViewer* dialogTextViewer; - struct AddonToKodiFuncTable_kodi_gui_dialogYesNo* dialogYesNo; - KODI_HANDLE dialog_dummy1; - KODI_HANDLE dialog_dummy2; - KODI_HANDLE dialog_dummy3; - KODI_HANDLE dialog_dummy4; - KODI_HANDLE dialog_dummy5; - KODI_HANDLE dialog_dummy6; - KODI_HANDLE dialog_dummy7; - KODI_HANDLE dialog_dummy8; - KODI_HANDLE dialog_dummy9; - KODI_HANDLE dialog_dummy10; /* This and above used to add new dialogs */ - struct AddonToKodiFuncTable_kodi_gui_listItem* listItem; - struct AddonToKodiFuncTable_kodi_gui_window* window; - } AddonToKodiFuncTable_kodi_gui; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !C_API_GUI_DEFINITIONS_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/CMakeLists.txt index bc35e916047cd..91caa50f8e77a 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/CMakeLists.txt @@ -1,14 +1,19 @@ -set(HEADERS context_menu.h - extended_progress.h - filebrowser.h - keyboard.h - numeric.h - ok.h - progress.h - select.h - text_viewer.h - yes_no.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_gui_dialogs) +set(HEADERS + context_menu.h + extended_progress.h + filebrowser.h + keyboard.h + numeric.h + ok.h + progress.h + select.h + text_viewer.h + yes_no.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_gui_dialogs) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h index 130d831e5bb3b..c4c8cd41b333e 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/context_menu.h @@ -9,20 +9,16 @@ #ifndef C_API_GUI_DIALOGS_CONTEXT_MENU_H #define C_API_GUI_DIALOGS_CONTEXT_MENU_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogContextMenu - { - int (*open)(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size); - } AddonToKodiFuncTable_kodi_gui_dialogContextMenu; + ATTR_DLL_EXPORT int kodi_gui_dialogs_context_menu_open(const char* heading, + const char* entries[], + size_t size) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h index 0992d5c2288b0..d4132b4cacc5e 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/extended_progress.h @@ -9,30 +9,43 @@ #ifndef C_API_GUI_DIALOGS_EXTENDED_PROGRESS_H #define C_API_GUI_DIALOGS_EXTENDED_PROGRESS_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress - { - KODI_GUI_HANDLE (*new_dialog)(KODI_HANDLE kodiBase, const char* title); - void (*delete_dialog)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - char* (*get_title)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*set_title)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* title); - char* (*get_text)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*set_text)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* text); - bool (*is_finished)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*mark_finished)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - float (*get_percentage)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*set_percentage)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, float percentage); - void (*set_progress)(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - int currentItem, - int itemCount); - } AddonToKodiFuncTable_kodi_gui_dialogExtendedProgress; + typedef void* KODI_GUI_HANDLE; + + ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog(const char* title) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_delete_dialog(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_title(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_title(KODI_GUI_HANDLE handle, + const char* title) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_text(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_text(KODI_GUI_HANDLE handle, + const char* text) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_extended_progress_is_finished(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_mark_finished(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_dialogs_extended_progress_get_percentage(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_percentage(KODI_GUI_HANDLE handle, + float percentage) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_progress(KODI_GUI_HANDLE handle, + int currentItem, + int itemCount) + __INTRODUCED_IN_KODI(1); + #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h index ef3945b27468b..c173a6a40170c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/filebrowser.h @@ -9,64 +9,61 @@ #ifndef C_API_GUI_DIALOGS_FILEBROWSER_H #define C_API_GUI_DIALOGS_FILEBROWSER_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogFileBrowser - { - bool (*show_and_get_directory)(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out, - bool writeOnly); - bool (*show_and_get_file)(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories); - bool (*show_and_get_file_from_dir)(KODI_HANDLE kodiBase, - const char* directory, - const char* mask, - const char* heading, - const char* path_in, - char** path_out, - bool use_thumbs, - bool use_file_directories, - bool singleList); - bool (*show_and_get_file_list)(KODI_HANDLE kodiBase, - const char* shares, - const char* mask, - const char* heading, - char*** file_list, - unsigned int* entries, - bool use_thumbs, - bool use_file_directories); - bool (*show_and_get_source)(KODI_HANDLE kodiBase, - const char* path_in, - char** path_out, - bool allow_network_shares, - const char* additional_share, - const char* type); - bool (*show_and_get_image)(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - const char* path_in, - char** path_out); - bool (*show_and_get_image_list)(KODI_HANDLE kodiBase, - const char* shares, - const char* heading, - char*** file_list, - unsigned int* entries); - void (*clear_file_list)(KODI_HANDLE kodiBase, char*** file_list, unsigned int entries); - } AddonToKodiFuncTable_kodi_gui_dialogFileBrowser; + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_directory( + const char* shares, const char* heading, const char* path_in, char** path_out, bool write_only) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file(const char* shares, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( + const char* directory, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories, + bool single_list) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_list( + const char* shares, + const char* mask, + const char* heading, + char*** file_list, + size_t* entries, + bool use_thumbs, + bool use_file_directories) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_source( + const char* path_in, + char** path_out, + bool allow_network_shares, + const char* additional_share, + const char* type) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image(const char* shares, + const char* heading, + const char* path_in, + char** path_out) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image_list(const char* shares, + const char* heading, + char*** file_list, + size_t* entries) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_file_browser_clear_file_list(char*** file_list, + size_t entries) + __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h index f84dc204fefeb..eb8469e35e969 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/keyboard.h @@ -9,61 +9,54 @@ #ifndef C_API_GUI_DIALOGS_KEYBOARD_H #define C_API_GUI_DIALOGS_KEYBOARD_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogKeyboard - { - bool (*show_and_get_input_with_head)(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - const char* heading, - bool allow_empty_result, - bool hiddenInput, - unsigned int auto_close_ms); - bool (*show_and_get_input)(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool allow_empty_result, - unsigned int auto_close_ms); - bool (*show_and_get_new_password_with_head)(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - bool allow_empty_result, - unsigned int auto_close_ms); - bool (*show_and_get_new_password)(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - unsigned int auto_close_ms); - bool (*show_and_verify_new_password_with_head)(KODI_HANDLE kodiBase, - char** password_out, - const char* heading, - bool allow_empty_result, - unsigned int auto_close_ms); - bool (*show_and_verify_new_password)(KODI_HANDLE kodiBase, - char** password_out, - unsigned int auto_close_ms); - int (*show_and_verify_password)(KODI_HANDLE kodiBase, - const char* password_in, - char** password_out, - const char* heading, - int retries, - unsigned int auto_close_ms); - bool (*show_and_get_filter)(KODI_HANDLE kodiBase, - const char* text_in, - char** text_out, - bool searching, - unsigned int auto_close_ms); - bool (*send_text_to_active_keyboard)(KODI_HANDLE kodiBase, - const char* text, - bool close_keyboard); - bool (*is_keyboard_activated)(KODI_HANDLE kodiBase); - } AddonToKodiFuncTable_kodi_gui_dialogKeyboard; + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head( + const char* text_in, + char** text_out, + const char* heading, + bool allow_empty_result, + bool hidden_input, + unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input(const char* text_in, + char** text_out, + bool allow_empty_result, + unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( + const char* password_in, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password( + const char* password_in, char** password_out, unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( + char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password( + char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_dialogs_keyboard_show_and_verify_password(const char* password_in, + char** password_out, + const char* heading, + int retries, + unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_filter(const char* text_in, + char** text_out, + bool searching, + unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(const char* text, + bool close_keyboard) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_is_keyboard_activated() __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h index 08aaf25d86bc8..d1f64b6bd52be 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/numeric.h @@ -9,41 +9,43 @@ #ifndef C_API_GUI_DIALOGS_NUMERIC_H #define C_API_GUI_DIALOGS_NUMERIC_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogNumeric - { - bool (*show_and_verify_new_password)(KODI_HANDLE kodiBase, char** password); - int (*show_and_verify_password)(KODI_HANDLE kodiBase, - const char* password, - const char* heading, - int retries); - bool (*show_and_verify_input)(KODI_HANDLE kodiBase, - const char* verify_in, - char** verify_out, - const char* heading, - bool verify_input); - bool (*show_and_get_time)(KODI_HANDLE kodiBase, struct tm* time, const char* heading); - bool (*show_and_get_date)(KODI_HANDLE kodiBase, struct tm* date, const char* heading); - bool (*show_and_get_ip_address)(KODI_HANDLE kodiBase, - const char* ip_address_in, - char** ip_address_out, - const char* heading); - bool (*show_and_get_number)(KODI_HANDLE kodiBase, - const char* input_in, - char** input_out, - const char* heading, - unsigned int auto_close_ms); - bool (*show_and_get_seconds)(KODI_HANDLE kodiBase, - const char* time_in, - char** time_out, - const char* heading); - } AddonToKodiFuncTable_kodi_gui_dialogNumeric; + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_new_password(char** password) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_dialogs_numeric_show_and_verify_password(const char* password, + const char* heading, + int retries) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_input(const char* verify_in, + char** verify_out, + const char* heading, + bool verify_input) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_time(struct tm* time, + const char* heading) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_date(struct tm* date, + const char* heading) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_ip_address(const char* ip_address_in, + char** ip_address_out, + const char* heading) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_number(const char* number_in, + char** number_out, + const char* heading, + unsigned int auto_close_ms) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_seconds(const char* time_in, + char** time_out, + const char* heading) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h index 45fe0fc458fcf..a52c20910826e 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/ok.h @@ -9,24 +9,21 @@ #ifndef C_API_GUI_DIALOGS_OK_H #define C_API_GUI_DIALOGS_OK_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogOK - { - void (*show_and_get_input_single_text)(KODI_HANDLE kodiBase, - const char* heading, - const char* text); - void (*show_and_get_input_line_text)(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2); - } AddonToKodiFuncTable_kodi_gui_dialogOK; + ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_single_text(const char* heading, + const char* text) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_line_text(const char* heading, + const char* line0, + const char* line1, + const char* line2) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h index 60a003ab7b104..5413812d130a6 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/progress.h @@ -9,32 +9,46 @@ #ifndef C_API_GUI_DIALOGS_PROGRESS_H #define C_API_GUI_DIALOGS_PROGRESS_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogProgress - { - KODI_GUI_HANDLE (*new_dialog)(KODI_HANDLE kodiBase); - void (*delete_dialog)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*open)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*set_heading)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, const char* heading); - void (*set_line)(KODI_HANDLE kodiBase, - KODI_GUI_HANDLE handle, - unsigned int lineNo, - const char* line); - void (*set_can_cancel)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, bool canCancel); - bool (*is_canceled)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*set_percentage)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int percentage); - int (*get_percentage)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - void (*show_progress_bar)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, bool pnOff); - void (*set_progress_max)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int max); - void (*set_progress_advance)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle, int nSteps); - bool (*abort)(KODI_HANDLE kodiBase, KODI_GUI_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_dialogProgress; + typedef void* KODI_GUI_HANDLE; + + ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_delete_dialog(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_open(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_heading(KODI_GUI_HANDLE handle, + const char* heading) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_line(KODI_GUI_HANDLE handle, + unsigned int line_no, + const char* line) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_can_cancel(KODI_GUI_HANDLE handle, + bool can_cancel) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_is_canceled(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_percentage(KODI_GUI_HANDLE handle, + int percentage) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_dialogs_progress_get_percentage(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_show_progress_bar(KODI_GUI_HANDLE handle, + bool on_off) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_max(KODI_GUI_HANDLE handle, int max) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_advance(KODI_GUI_HANDLE handle, + int n_steps) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_abort(KODI_GUI_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h index 79635d775e008..a04a0d1cebc44 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/select.h @@ -9,29 +9,25 @@ #ifndef C_API_GUI_DIALOGS_SELECT_H #define C_API_GUI_DIALOGS_SELECT_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogSelect - { - int (*open)(KODI_HANDLE kodiBase, - const char* heading, - const char* entries[], - unsigned int size, - int selected, - unsigned int autoclose); - bool (*open_multi_select)(KODI_HANDLE kodiBase, - const char* heading, - const char* entryIDs[], - const char* entryNames[], - bool entriesSelected[], - unsigned int size, - unsigned int autoclose); - } AddonToKodiFuncTable_kodi_gui_dialogSelect; + ATTR_DLL_EXPORT int kodi_gui_dialogs_select_open(const char* heading, + const char* entries[], + size_t size, + int selected, + unsigned int autoclose) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_select_open_multi_select(const char* heading, + const char* entryIDs[], + const char* entryNames[], + uint8_t entriesSelected[], + size_t size, + unsigned int autoclose) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h index 4a1cfe687c7a6..3e6eb112b9afb 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/text_viewer.h @@ -9,17 +9,15 @@ #ifndef C_API_GUI_DIALOGS_TEXT_VIEWER_H #define C_API_GUI_DIALOGS_TEXT_VIEWER_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogTextViewer - { - void (*open)(KODI_HANDLE kodiBase, const char* heading, const char* text); - } AddonToKodiFuncTable_kodi_gui_dialogTextViewer; + ATTR_DLL_EXPORT void kodi_gui_dialogs_text_viewer_show(const char* heading, const char* text) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h index 8558acbc465b1..711966414cd82 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/dialogs/yes_no.h @@ -9,37 +9,34 @@ #ifndef C_API_GUI_DIALOGS_YES_NO_H #define C_API_GUI_DIALOGS_YES_NO_H -#include "../definitions.h" +#include "../../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_dialogYesNo - { - bool (*show_and_get_input_single_text)(KODI_HANDLE kodiBase, - const char* heading, - const char* text, - bool* canceled, - const char* noLabel, - const char* yesLabel); - bool (*show_and_get_input_line_text)(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - const char* noLabel, - const char* yesLabel); - bool (*show_and_get_input_line_button_text)(KODI_HANDLE kodiBase, - const char* heading, - const char* line0, - const char* line1, - const char* line2, - bool* canceled, - const char* noLabel, - const char* yesLabel); - } AddonToKodiFuncTable_kodi_gui_dialogYesNo; + ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_single_text(const char* heading, + const char* text, + bool* canceled, + const char* noLabel, + const char* yesLabel) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_text(const char* heading, + const char* line0, + const char* line1, + const char* line2, + const char* noLabel, + const char* yesLabel) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( + const char* heading, + const char* line0, + const char* line1, + const char* line2, + bool* canceled, + const char* noLabel, + const char* yesLabel) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/general.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/general.h index 676986725f401..7fa28e32e9e8b 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/general.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/general.h @@ -9,24 +9,21 @@ #ifndef C_API_GUI_GENERAL_H #define C_API_GUI_GENERAL_H -#include "definitions.h" +#include "../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_general - { - void (*lock)(); - void (*unlock)(); - int (*get_screen_height)(KODI_HANDLE kodiBase); - int (*get_screen_width)(KODI_HANDLE kodiBase); - int (*get_video_resolution)(KODI_HANDLE kodiBase); - int (*get_current_window_dialog_id)(KODI_HANDLE kodiBase); - int (*get_current_window_id)(KODI_HANDLE kodiBase); - ADDON_HARDWARE_CONTEXT (*get_hw_context)(KODI_HANDLE kodiBase); - } AddonToKodiFuncTable_kodi_gui_general; + ATTR_DLL_EXPORT void kodi_gui_lock() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_unlock() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_get_screen_height() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_get_screen_width() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT float kodi_gui_get_video_resolution() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_get_current_window_dialog_id() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_get_current_window_id() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context() __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/CMakeLists.txt index c0bbd11937a47..eb7dde09c9fab 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/CMakeLists.txt @@ -1,5 +1,10 @@ -set(HEADERS action_ids.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_c-api_gui_input) +set(HEADERS + action_ids.h +) + +if(HEADERS) + core_add_devkit_header(kodi_c-api_gui_input) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h index d2120ac355ada..a4a93313b9309 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/list_item.h @@ -9,41 +9,47 @@ #ifndef C_API_GUI_LIST_ITEM_H #define C_API_GUI_LIST_ITEM_H -#include "definitions.h" +#include "../addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - typedef struct AddonToKodiFuncTable_kodi_gui_listItem - { - KODI_GUI_LISTITEM_HANDLE(*create) - (KODI_HANDLE kodiBase, - const char* label, - const char* label2, - const char* path); - void (*destroy)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - - char* (*get_label)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - void (*set_label)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* label); - char* (*get_label2)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - void (*set_label2)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* label); - char* (*get_art)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* type); - void (*set_art)(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* type, - const char* image); - char* (*get_path)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - void (*set_path)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* path); - char* (*get_property)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, const char* key); - void (*set_property)(KODI_HANDLE kodiBase, - KODI_GUI_LISTITEM_HANDLE handle, - const char* key, - const char* value); - void (*select)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle, bool select); - bool (*is_selected)(KODI_HANDLE kodiBase, KODI_GUI_LISTITEM_HANDLE handle); - } AddonToKodiFuncTable_kodi_gui_listItem; + typedef void* KODI_GUI_LISTITEM_HANDLE; + + ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create(const char* label, + const char* label2, + const char* path) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_destroy(KODI_GUI_LISTITEM_HANDLE handle) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label(KODI_GUI_LISTITEM_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_set_label(KODI_GUI_LISTITEM_HANDLE handle, + const char* label) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label2(KODI_GUI_LISTITEM_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_set_label2(KODI_GUI_LISTITEM_HANDLE handle, + const char* label) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_listitem_get_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_set_art(KODI_GUI_LISTITEM_HANDLE handle, + const char* type, + const char* image) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_listitem_get_path(KODI_GUI_LISTITEM_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_set_path(KODI_GUI_LISTITEM_HANDLE handle, const char* path) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_listitem_get_property(KODI_GUI_LISTITEM_HANDLE handle, + const char* key) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_set_property(KODI_GUI_LISTITEM_HANDLE handle, + const char* key, + const char* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_listitem_select(KODI_GUI_LISTITEM_HANDLE handle, bool select) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_listitem_is_selected(KODI_GUI_LISTITEM_HANDLE handle) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/window.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/window.h index d7181c0538bb9..cd1f902b1d174 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/window.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/window.h @@ -9,8 +9,9 @@ #ifndef C_API_GUI_WINDOW_H #define C_API_GUI_WINDOW_H -#include "definitions.h" +#include "../addon_base.h" #include "input/action_ids.h" +#include "list_item.h" #include @@ -22,157 +23,156 @@ extern "C" { #endif /* __cplusplus */ + typedef void* KODI_GUI_WINDOW_HANDLE; + typedef void* KODI_GUI_CLIENT_HANDLE; + typedef void* KODI_GUI_CONTROL_HANDLE; + typedef struct gui_context_menu_pair { unsigned int id; char name[ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH]; } gui_context_menu_pair; - typedef struct AddonToKodiFuncTable_kodi_gui_window - { - /* Window creation functions */ - KODI_GUI_WINDOW_HANDLE(*create) - (KODI_HANDLE kodiBase, - const char* xml_filename, - const char* default_skin, - bool as_dialog, - bool is_media); - void (*destroy)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - void (*set_callbacks)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_CLIENT_HANDLE clienthandle, - bool (*CBInit)(KODI_GUI_CLIENT_HANDLE), - bool (*CBFocus)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBClick)(KODI_GUI_CLIENT_HANDLE, int), - bool (*CBOnAction)(KODI_GUI_CLIENT_HANDLE, enum ADDON_ACTION), - void (*CBGetContextButtons)( - KODI_GUI_CLIENT_HANDLE, int, gui_context_menu_pair*, unsigned int*), - bool (*CBOnContextButton)(KODI_GUI_CLIENT_HANDLE, int, unsigned int)); - bool (*show)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - bool (*close)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - bool (*do_modal)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* Window control functions */ - bool (*set_focus_id)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - int (*get_focus_id)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - void (*set_control_label)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - const char* label); - void (*set_control_visible)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool visible); - void (*set_control_selected)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int control_id, - bool selected); - - /* Window property functions */ - void (*set_property)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value); - void (*set_property_int)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - int value); - void (*set_property_bool)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - bool value); - void (*set_property_double)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - double value); - char* (*get_property)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, const char* key); - int (*get_property_int)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, const char* key); - bool (*get_property_bool)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, const char* key); - double (*get_property_double)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key); - void (*clear_properties)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - void (*clear_property)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, const char* key); - - /* List item functions */ - void (*clear_item_list)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - void (*add_list_item)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item, - int list_position); - void (*remove_list_item_from_position)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position); - void (*remove_list_item)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - KODI_GUI_LISTITEM_HANDLE item); - KODI_GUI_LISTITEM_HANDLE(*get_list_item) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int list_position); - void (*set_current_list_position)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - int list_position); - int (*get_current_list_position)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - int (*get_list_size)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - void (*set_container_property)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* key, - const char* value); - void (*set_container_content)(KODI_HANDLE kodiBase, - KODI_GUI_WINDOW_HANDLE handle, - const char* value); - int (*get_current_container_id)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* Various functions */ - void (*mark_dirty_region)(KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle); - - /* GUI control access functions */ - KODI_GUI_CONTROL_HANDLE(*get_control_button) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_edit) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_fade_label) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_image) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_label) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_progress) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_radio_button) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_render_addon) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_settings_slider) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_slider) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_spin) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_text_box) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy1) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy2) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy3) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy4) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy5) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy6) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy7) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy8) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy9) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - KODI_GUI_CONTROL_HANDLE(*get_control_dummy10) - (KODI_HANDLE kodiBase, KODI_GUI_WINDOW_HANDLE handle, int control_id); - /* This above used to add new get_control_* functions */ - } AddonToKodiFuncTable_kodi_gui_window; +// typedef bool(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_INIT_V1)(KODI_GUI_CLIENT_HANDLE clienthandle); +// typedef bool(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_FOCUS_V1)(KODI_GUI_CLIENT_HANDLE clienthandle, +// int control_id); +// typedef bool(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_CLICK_V1)(KODI_GUI_CLIENT_HANDLE clienthandle, +// int control_id); +// typedef bool(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_ON_ACTION_V1)(KODI_GUI_CLIENT_HANDLE clienthandle, +// enum ADDON_ACTION action); +// typedef void(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_GET_CONTEXT_BUTTONS_V1)( +// KODI_GUI_CLIENT_HANDLE clienthandle, +// int control_id, +// struct gui_context_menu_pair* entries, +// size_t* amount); +// typedef bool(ATTR_APIENTRYP PFN_KODI_GUI_WINDOW_ON_CONTEXT_BUTTON_V1)( +// KODI_GUI_CLIENT_HANDLE clienthandle, int control_id, size_t selected); + + /* Window creation functions */ + ATTR_DLL_EXPORT KODI_GUI_WINDOW_HANDLE kodi_gui_window_create(KODI_HANDLE kodiBase, + const char* xml_filename, + const char* default_skin, + bool as_dialog, + bool is_media) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_destroy(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + +// ATTR_DLL_EXPORT void kodi_gui_window_set_callbacks( +// KODI_GUI_WINDOW_HANDLE handle, +// KODI_GUI_CLIENT_HANDLE clienthandle, +// PFN_KODI_GUI_WINDOW_INIT_V1 cb_init, +// PFN_KODI_GUI_WINDOW_FOCUS_V1 cb_focus, +// PFN_KODI_GUI_WINDOW_CLICK_V1 cb_click, +// PFN_KODI_GUI_WINDOW_ON_ACTION_V1 cb_on_action, +// PFN_KODI_GUI_WINDOW_GET_CONTEXT_BUTTONS_V1 cb_get_context_buttons, +// PFN_KODI_GUI_WINDOW_ON_CONTEXT_BUTTON_V1 cb_on_context_button) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_window_show(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_window_close(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_window_do_modal(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + + /* Window control functions */ + ATTR_DLL_EXPORT bool kodi_gui_window_set_focus_id(KODI_GUI_WINDOW_HANDLE handle, int control_id) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_window_get_focus_id(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_control_label(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* label) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_control_visible(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool visible) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_control_selected(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool selected) __INTRODUCED_IN_KODI(1); + + /* Window property functions */ + ATTR_DLL_EXPORT void kodi_gui_window_set_property(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_property_int(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_property_bool(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + bool value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_property_double(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + double value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_gui_window_get_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_window_get_property_int(KODI_GUI_WINDOW_HANDLE handle, + const char* key) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_gui_window_get_property_bool(KODI_GUI_WINDOW_HANDLE handle, + const char* key) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT double kodi_gui_window_get_property_double(KODI_GUI_WINDOW_HANDLE handle, + const char* key) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_clear_properties(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_clear_property(KODI_GUI_WINDOW_HANDLE handle, + const char* key) __INTRODUCED_IN_KODI(1); + + /* List item functions */ + ATTR_DLL_EXPORT void kodi_gui_window_clear_item_list(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_add_list_item(KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item, + int list_position) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item_from_position(KODI_GUI_WINDOW_HANDLE handle, + int list_position) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item(KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_window_get_list_item(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_current_list_position(KODI_GUI_WINDOW_HANDLE handle, + int list_position) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_window_get_current_list_position(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_window_get_list_size(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_container_property(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_gui_window_set_container_content(KODI_GUI_WINDOW_HANDLE handle, + const char* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_gui_window_get_current_container_id(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + + /* Various functions */ + ATTR_DLL_EXPORT void kodi_gui_window_mark_dirty_region(KODI_GUI_WINDOW_HANDLE handle) + __INTRODUCED_IN_KODI(1); + + /* GUI control access functions */ + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_button( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_edit( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_fade_label( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_image( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_label( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_progress( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_radio_button( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_render_addon( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_settings_slider( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_slider( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_spin( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_text_box( + KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/monitor.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/monitor.h new file mode 100644 index 0000000000000..68d7fa1248b1a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/monitor.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_MONITOR_H +#define C_API_MONITOR_H + +#include "addon_base.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + ATTR_DLL_EXPORT bool kodi_monitor_wait_for_abort(double timeout) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + + ATTR_DLL_EXPORT bool kodi_monitor_abort_requested() __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !C_API_MONITOR_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/network.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/network.h index 8bd987be605ab..df2d587743dbb 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/network.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/network.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2018 Team Kodi + * Copyright (C) 2005-2020 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later @@ -9,38 +9,28 @@ #ifndef C_API_NETWORK_H #define C_API_NETWORK_H -#include +#include "addon_base.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - /* - * 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_network - { - bool (*wake_on_lan)(void* kodiBase, const char* mac); - char* (*get_ip_address)(void* kodiBase); - char* (*dns_lookup)(void* kodiBase, const char* url, bool* ret); - char* (*url_encode)(void* kodiBase, const char* url); - char* (*get_hostname)(void* kodiBase); - bool (*is_local_host)(void* kodiBase, const char* hostname); - bool (*is_host_on_lan)(void* kodiBase, const char* hostname, bool offLineCheck); - char* (*get_user_agent)(void* kodiBase); - } AddonToKodiFuncTable_kodi_network; +#if __KODI_API__ >= 1 + + ATTR_DLL_EXPORT bool kodi_network_wake_on_lan(const char* mac) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_network_get_ip_address() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_network_dns_lookup(const char* url, bool* ret) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_network_url_encode(const char* url) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_network_get_hostname() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_network_is_local_host(const char* hostname) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_network_is_host_on_lan(const char* hostname, bool offLineCheck) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_network_get_user_agent() __INTRODUCED_IN_KODI(1); + +#endif /* __KODI_API__ >= 1 */ #ifdef __cplusplus -} /* extern "C" */ +} #endif /* __cplusplus */ -#endif /* C_API_NETWORK_H */ +#endif /* !C_API_NETWORK_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/platform/android/system.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/platform/android/system.h deleted file mode 100644 index 09d8c8c91e8e5..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/platform/android/system.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#ifndef C_API_PLATFORM_ANDROID_H -#define C_API_PLATFORM_ANDROID_H - -#define INTERFACE_ANDROID_SYSTEM_NAME "ANDROID_SYSTEM" -#define INTERFACE_ANDROID_SYSTEM_VERSION "1.0.2" -#define INTERFACE_ANDROID_SYSTEM_VERSION_MIN "1.0.1" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - struct AddonToKodiFuncTable_android_system - { - void* (*get_jni_env)(); - int (*get_sdk_version)(); - const char *(*get_class_name)(); - }; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* !C_API_PLATFORM_ANDROID_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h new file mode 100644 index 0000000000000..8a18eeef74ac1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_VERSION_H +#define C_API_VERSION_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/** + * Major version of this KDK. + * + * For example: 1 for r1. + */ +#define __KDK_MAJOR__ 1 + +/** + * Minor version of this KDK. + * + * For example: 0 for r1 and 1 for r1b. + */ +#define __KDK_MINOR__ 0 + +/** + * Set to 0 if this is a release build, or 1 for beta 1, + * 2 for beta 2, and so on. + */ +#define __KDK_BETA__ 0 + +/** + * Set to 1 if this is a canary build, 0 if not. + */ +#define __KDK_CANARY__ 1 + +#define __KODI_API_FUTURE__ 10000 + +#ifndef __KODI_API__ +#define __KODI_API__ __KODI_API_FUTURE__ +#endif + +#define __KODI_API_1__ 1 + +#define __INTRODUCED_IN_KODI(api_level) +#define __DEPRECATED_IN_KODI(api_level) +#define __REMOVED_IN_KODI(api_level) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !C_API_VERSION_H */ + diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt index 8f12955a5ee9d..f17a1b4eee415 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt @@ -1,8 +1,10 @@ -set(HEADERS General.h - ListItem.h - Window.h - renderHelper.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_gui) +set(HEADERS + renderHelper.h +) + +if(HEADERS) + core_add_devkit_header(kodi_gui) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h deleted file mode 100644 index 85ba3f235fec2..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/gui/general.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ - -//============================================================================== -/// @addtogroup cpp_kodi_gui_general -/// Permits the use of the required functions of the add-on to Kodi. -/// -/// These are pure functions them no other initialization need. -/// -/// It has the header @ref kodi/gui/General.h "#include " be included -/// to enjoy it. -/// - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Performs a graphical lock of rendering engine. -/// -inline void ATTRIBUTE_HIDDEN Lock() -{ - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->general->lock(); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Performs a graphical unlock of previous locked rendering engine. -/// -inline void ATTRIBUTE_HIDDEN Unlock() -{ - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->general->unlock(); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Return the the current screen height with pixel. -/// -/// @return Screen height with pixel -/// -inline int ATTRIBUTE_HIDDEN GetScreenHeight() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_height( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Return the the current screen width with pixel. -/// -/// @return Screen width with pixel -/// -inline int ATTRIBUTE_HIDDEN GetScreenWidth() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_width( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Return the the current screen rendering resolution. -/// -/// @return Current screen rendering resolution -/// -inline int ATTRIBUTE_HIDDEN GetVideoResolution() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_video_resolution( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Returns the id for the current 'active' dialog as an integer. -/// -/// @return The currently active dialog Id -/// -/// -///------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// .. -/// int wid = kodi::gui::GetCurrentWindowDialogId(); -/// .. -/// ~~~~~~~~~~~~~ -/// -inline int ATTRIBUTE_HIDDEN GetCurrentWindowDialogId() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_dialog_id( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief Returns the id for the current 'active' window as an integer. -/// -/// @return The currently active window Id -/// -/// -///------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// .. -/// int wid = kodi::gui::GetCurrentWindowId(); -/// .. -/// ~~~~~~~~~~~~~ -/// -inline int ATTRIBUTE_HIDDEN GetCurrentWindowId() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_id( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -//============================================================================== -/// @ingroup cpp_kodi_gui_general -/// @brief To get hardware specific device context interface. -/// -/// @return A pointer to the used device with @ref cpp_kodi_Defs_HardwareContext "kodi::HardwareContext" -/// -/// @warning This function is only be supported under Windows, on all other -/// OS it return `nullptr`! -/// -/// @note Returned Windows class pointer is `ID3D11DeviceContext1`. -/// -/// -///------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// .. -/// ID3D11DeviceContext1* context = static_cast(kodi::gui::GetHWContext()); -/// .. -/// ~~~~~~~~~~~~~ -/// -inline kodi::HardwareContext GetHWContext() -{ - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->general->get_hw_context( - CAddonBase::m_interface->toKodi->kodiBase); -} -//------------------------------------------------------------------------------ - -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h deleted file mode 100644 index 3a4d50be2ce43..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/gui/list_item.h" - -#ifdef __cplusplus - -#include - -namespace kodi -{ -namespace gui -{ - -class CWindow; - -class ATTRIBUTE_HIDDEN CAddonGUIControlBase -{ -public: - KODI_GUI_LISTITEM_HANDLE GetControlHandle() const { return m_controlHandle; } - -protected: - explicit CAddonGUIControlBase(CAddonGUIControlBase* window) - : m_controlHandle(nullptr), - m_interface(::kodi::addon::CAddonBase::m_interface->toKodi), - m_Window(window) - { - } - - virtual ~CAddonGUIControlBase() = default; - - friend class CWindow; - - KODI_GUI_LISTITEM_HANDLE m_controlHandle; - AddonToKodiFuncTable_Addon* m_interface; - CAddonGUIControlBase* m_Window; - -private: - CAddonGUIControlBase() = delete; - CAddonGUIControlBase(const CAddonGUIControlBase&) = delete; - CAddonGUIControlBase& operator=(const CAddonGUIControlBase&) = delete; -}; - -class CListItem; - -//============================================================================== -/// @addtogroup cpp_kodi_gui_windows_listitem -/// @brief @cpp_class{ kodi::gui::CListItem } -/// **Selectable window list item**\n -/// The list item control is used for creating item lists in Kodi. -/// -/// The with @ref ListItem.h "#include " given -/// class is used to create a item entry for a list on window and to support it's -/// control. -/// -class ATTRIBUTE_HIDDEN CListItem : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Class constructor with parameters. - /// - /// @param[in] label [opt] Item label - /// @param[in] label2 [opt] Second Item label (if needed) - /// @param[in] path [opt] Path to where item is defined - /// - CListItem(const std::string& label = "", - const std::string& label2 = "", - const std::string& path = "") - : CAddonGUIControlBase(nullptr) - { - m_controlHandle = m_interface->kodi_gui->listItem->create(m_interface->kodiBase, label.c_str(), - label2.c_str(), path.c_str()); - } - - /* - * Constructor used for parts given by list items from addon window - * - * Related to call of "std::shared_ptr kodi::gui::CWindow::GetListItem(int listPos)" - * Not needed for addon development itself - */ - explicit CListItem(KODI_GUI_LISTITEM_HANDLE listItemHandle) : CAddonGUIControlBase(nullptr) - { - m_controlHandle = listItemHandle; - } - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Class destructor - /// - ~CListItem() override - { - m_interface->kodi_gui->listItem->destroy(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Returns the listitem label. - /// - /// @return Label of item - /// - std::string GetLabel() - { - std::string label; - char* ret = m_interface->kodi_gui->listItem->get_label(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets the listitem label. - /// - /// @param[in] label string or unicode - text string. - /// - void SetLabel(const std::string& label) - { - m_interface->kodi_gui->listItem->set_label(m_interface->kodiBase, m_controlHandle, - label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Returns the second listitem label. - /// - /// @return Second label of item - /// - std::string GetLabel2() - { - std::string label; - char* ret = m_interface->kodi_gui->listItem->get_label2(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets the listitem's label2. - /// - /// @param[in] label string or unicode - text string. - /// - void SetLabel2(const std::string& label) - { - m_interface->kodi_gui->listItem->set_label2(m_interface->kodiBase, m_controlHandle, - label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets the listitem's art - /// - /// @param[in] type Type of Art to set - /// - Some default art values (any string possible): - /// | value (type) | Type | - /// |:-------------:|:--------------------------------------------------| - /// | thumb | string - image filename - /// | poster | string - image filename - /// | banner | string - image filename - /// | fanart | string - image filename - /// | clearart | string - image filename - /// | clearlogo | string - image filename - /// | landscape | string - image filename - /// | icon | string - image filename - /// @return The url to use for Art - /// - std::string GetArt(const std::string& type) - { - std::string strReturn; - char* ret = m_interface->kodi_gui->listItem->get_art(m_interface->kodiBase, m_controlHandle, - type.c_str()); - if (ret != nullptr) - { - if (std::strlen(ret)) - strReturn = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return strReturn; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets the listitem's art - /// - /// @param[in] type Type of Art to set - /// @param[in] url The url to use for Art - /// - Some default art values (any string possible): - /// | value (type) | Type | - /// |:-------------:|:--------------------------------------------------| - /// | thumb | string - image filename - /// | poster | string - image filename - /// | banner | string - image filename - /// | fanart | string - image filename - /// | clearart | string - image filename - /// | clearlogo | string - image filename - /// | landscape | string - image filename - /// | icon | string - image filename - /// - void SetArt(const std::string& type, const std::string& url) - { - m_interface->kodi_gui->listItem->set_art(m_interface->kodiBase, m_controlHandle, type.c_str(), - url.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Returns the path / filename of this listitem. - /// - /// @return Path string - /// - std::string GetPath() - { - std::string strReturn; - char* ret = m_interface->kodi_gui->listItem->get_path(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - strReturn = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return strReturn; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets the listitem's path. - /// - /// @param[in] path string or unicode - path, activated when item is clicked. - /// - /// @note You can use the above as keywords for arguments. - /// - void SetPath(const std::string& path) - { - m_interface->kodi_gui->listItem->set_path(m_interface->kodiBase, m_controlHandle, path.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Sets a listitem property, similar to an infolabel. - /// - /// @param[in] key string - property name. - /// @param[in] value string or unicode - value of property. - /// - /// @note Key is NOT case sensitive. - /// You can use the above as keywords for arguments and skip certain@n - /// optional arguments.\n - /// Once you use a keyword, all following arguments require the - /// keyword. - /// - /// Some of these are treated internally by Kodi, such as the - /// 'StartOffset' property, which is the offset in seconds at which to - /// start playback of an item. Others may be used in the skin to add - /// extra information, such as 'WatchedCount' for tvshow items - /// - void SetProperty(const std::string& key, const std::string& value) - { - m_interface->kodi_gui->listItem->set_property(m_interface->kodiBase, m_controlHandle, - key.c_str(), value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Returns a listitem property as a string, similar to an infolabel. - /// - /// @param[in] key string - property name. - /// @return string - List item property - /// - /// @note Key is NOT case sensitive.\n - /// You can use the above as keywords for arguments and skip certain - /// optional arguments.\n - /// Once you use a keyword, all following arguments require the - /// keyword. - /// - std::string GetProperty(const std::string& key) - { - std::string label; - char* ret = m_interface->kodi_gui->listItem->get_property(m_interface->kodiBase, - m_controlHandle, key.c_str()); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief To control selection of item in list (also multiple selection, - /// in list on serveral items possible). - /// - /// @param[in] selected if true becomes set as selected - /// - void Select(bool selected) - { - m_interface->kodi_gui->listItem->select(m_interface->kodiBase, m_controlHandle, selected); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_listitem - /// @brief Returns the listitem's selected status. - /// - /// @return true if selected, otherwise false - /// - bool IsSelected() - { - return m_interface->kodi_gui->listItem->is_selected(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h deleted file mode 100644 index 10fa6efa21ddc..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h +++ /dev/null @@ -1,915 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../AddonBase.h" -#include "../c-api/gui/window.h" -#include "ListItem.h" -#include "input/ActionIDs.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_window_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_gui_windows_window -/// @brief **Library definition values**\n -/// Additional values, structures and things that are used in the Window class. -/// -/// ------------------------------------------------------------------------ -/// -/// @link cpp_kodi_gui_windows_window Go back to normal functions from CWindow@endlink -/// - -//============================================================================== -/// @ingroup cpp_kodi_gui_windows_window_Defs -/// @brief **Handler for addon-sided processing class**\n -/// If the callback functions used by the window are not used directly in the -/// @ref cpp_kodi_gui_windows_window "CWindow" class and are outside of it. -/// -/// This value here corresponds to a `void*` and returns the address -/// requested by the add-on for callbacks. -/// -using ClientHandle = KODI_GUI_CLIENT_HANDLE; -//------------------------------------------------------------------------------ - -class CListItem; - -//============================================================================== -/// @addtogroup cpp_kodi_gui_windows_window -/// @brief @cpp_class{ kodi::gui::CWindow } -/// **Main window control class**\n -/// The addon uses its own skin xml file and displays it in Kodi using this class. -/// -/// The with @ref Window.h "#include " -/// included file brings support to create a window or dialog on Kodi. -/// -/// The add-on has to integrate its own @ref cpp_kodi_gui_windows_window_callbacks "callback functions" -/// in order to process the necessary user access to its window. -/// -/// -/// -------------------------------------------------------------------------- -/// -/// **Window header example:** -/// ~~~~~~~~~~~~~{.xml} -/// -/// -/// RunScript(script.foobar) -/// SetProperty(foo,bar) -/// 2 -/// 9000 -/// 0xff00ff00 -/// 50,51,509,510 -/// Window.IsActive(Home) -/// WindowOpen -/// WindowClose -/// 1 -/// -/// 40 -/// 50 -/// Window.IsActive(Home) -/// -/// MyVideos -/// -/// -/// -/// .... -/// -/// -/// ~~~~~~~~~~~~~ -/// -/// -------------------------------------------------------------------------- -/// -/// On functions defined input variable controlId (GUI control identifier) -/// is the on window.xml defined value behind type added with id="..." and -/// used to identify for changes there and on callbacks. -/// -/// ~~~~~~~~~~~~~{.xml} -/// -/// Title Label -/// ... -/// -/// -/// progress control -/// ... -/// -/// ~~~~~~~~~~~~~ -/// -/// -class ATTRIBUTE_HIDDEN CWindow : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Class constructor with needed values for window / dialog. - /// - /// Creates a new Window class. - /// - /// @param[in] xmlFilename XML file for the skin - /// @param[in] defaultSkin Default skin to use if needed not available - /// @param[in] asDialog Use window as dialog if set - /// @param[in] isMedia [opt] bool - if False, create a regular window. - /// if True, create a mediawindow. (default=false) - /// - /// @note `isMedia` value as true only usable for windows not for dialogs. - /// - CWindow(const std::string& xmlFilename, - const std::string& defaultSkin, - bool asDialog, - bool isMedia = false) - : CAddonGUIControlBase(nullptr) - { - m_controlHandle = m_interface->kodi_gui->window->create( - m_interface->kodiBase, xmlFilename.c_str(), defaultSkin.c_str(), asDialog, isMedia); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow can't create window class from Kodi !!!"); - m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, this, - CBOnInit, CBOnFocus, CBOnClick, CBOnAction, - CBGetContextButtons, CBOnContextButton); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup CWindow - /// @brief Class destructor. - /// - ~CWindow() override - { - if (m_controlHandle) - m_interface->kodi_gui->window->destroy(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Show this window. - /// - /// Shows this window by activating it, calling close() after it wil activate - /// the current window again. - /// - /// @note If your Add-On ends this window will be closed to. To show it forever, - /// make a loop at the end of your Add-On or use @ref DoModal() instead. - /// - /// @warning If used must be the class be global present until Kodi becomes - /// closed. The creation can be done before "Show" becomes called, but - /// not delete class after them. - /// - /// @return Return true if call and show is successed, if false was something - /// failed to get needed skin parts. - /// - bool Show() - { - return m_interface->kodi_gui->window->show(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Closes this window. - /// - /// Closes this window by activating the old window. - /// @note The window is not deleted with this method. - /// - void Close() { m_interface->kodi_gui->window->close(m_interface->kodiBase, m_controlHandle); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Display this window until close() is called. - /// - void DoModal() - { - m_interface->kodi_gui->window->do_modal(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Gives the control with the supplied focus. - /// - /// @param[in] controlId On skin defined id of control - /// @return Return true if call and focus is successed, if false was something - /// failed to get needed skin parts - /// - bool SetFocusId(int controlId) - { - return m_interface->kodi_gui->window->set_focus_id(m_interface->kodiBase, m_controlHandle, - controlId); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Returns the id of the control which is focused. - /// - /// @return Focused control id - /// - int GetFocusId() - { - return m_interface->kodi_gui->window->get_focus_id(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To set the used label on given control id. - /// - /// @param[in] controlId Control id where label need to set - /// @param[in] label Label to use - /// - void SetControlLabel(int controlId, const std::string& label) - { - m_interface->kodi_gui->window->set_control_label(m_interface->kodiBase, m_controlHandle, - controlId, label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To set the visibility on given control id. - /// - /// @param[in] controlId Control id where visibility is changed - /// @param[in] visible Boolean value with `true` for visible, `false` for hidden - /// - void SetControlVisible(int controlId, bool visible) - { - m_interface->kodi_gui->window->set_control_visible(m_interface->kodiBase, m_controlHandle, - controlId, visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To set the selection on given control id. - /// - /// @param[in] controlId Control id where selection is changed - /// @param[in] selected Boolean value with `true` for selected, `false` for not - /// - void SetControlSelected(int controlId, bool selected) - { - m_interface->kodi_gui->window->set_control_selected(m_interface->kodiBase, m_controlHandle, - controlId, selected); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets a window property, similar to an infolabel. - /// - /// @param[in] key string - property name. - /// @param[in] value string or unicode - value of property. - /// - /// @note Key is NOT case sensitive. Setting value to an empty string is - /// equivalent to clearProperty(key).\n - /// You can use the above as keywords for arguments and skip certain - /// optional arguments.\n - /// Once you use a keyword, all following arguments require the keyword. - /// - void SetProperty(const std::string& key, const std::string& value) - { - m_interface->kodi_gui->window->set_property(m_interface->kodiBase, m_controlHandle, key.c_str(), - value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Returns a window property as a string, similar to an infolabel. - /// - /// @param[in] key string - property name. - /// @return The property as string (if present) - /// - /// @note Key is NOT case sensitive. Setting value to an empty string is - /// equivalent to clearProperty(key).\n - /// You can use the above as keywords for arguments and skip certain - /// optional arguments.\n - /// Once you use a keyword, all following arguments require the keyword. - /// - std::string GetProperty(const std::string& key) const - { - std::string label; - char* ret = m_interface->kodi_gui->window->get_property(m_interface->kodiBase, m_controlHandle, - key.c_str()); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets a window property with integer value - /// - /// @param[in] key string - property name. - /// @param[in] value integer value to set - /// - void SetPropertyInt(const std::string& key, int value) - { - m_interface->kodi_gui->window->set_property_int(m_interface->kodiBase, m_controlHandle, - key.c_str(), value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Returns a window property with integer value - /// - /// @param[in] key string - property name. - /// @return integer value of property - /// - int GetPropertyInt(const std::string& key) const - { - return m_interface->kodi_gui->window->get_property_int(m_interface->kodiBase, m_controlHandle, - key.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets a window property with boolean value - /// - /// @param[in] key string - property name. - /// @param[in] value boolean value to set - /// - void SetPropertyBool(const std::string& key, bool value) - { - m_interface->kodi_gui->window->set_property_bool(m_interface->kodiBase, m_controlHandle, - key.c_str(), value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Returns a window property with boolean value - /// - /// @param[in] key string - property name. - /// @return boolean value of property - /// - bool GetPropertyBool(const std::string& key) const - { - return m_interface->kodi_gui->window->get_property_bool(m_interface->kodiBase, m_controlHandle, - key.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets a window property with double value - /// - /// @param[in] key string - property name. - /// @param[in] value double value to set - /// - void SetPropertyDouble(const std::string& key, double value) - { - m_interface->kodi_gui->window->set_property_double(m_interface->kodiBase, m_controlHandle, - key.c_str(), value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Returns a window property with double value - /// - /// @param[in] key string - property name. - /// @return double value of property - /// - double GetPropertyDouble(const std::string& key) const - { - return m_interface->kodi_gui->window->get_property_double(m_interface->kodiBase, - m_controlHandle, key.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Remove all present properties from window - /// - void ClearProperties() - { - m_interface->kodi_gui->window->clear_properties(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Clears the specific window property. - /// - /// @param[in] key string - property name. - /// - /// @note Key is NOT case sensitive. Equivalent to SetProperty(key, "") - /// You can use the above as keywords for arguments and skip certain - /// optional arguments. - /// Once you use a keyword, all following arguments require the - /// keyword. - /// - /// - ///----------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// .. - /// ClearProperty('Category') - /// .. - /// ~~~~~~~~~~~~~ - /// - void ClearProperty(const std::string& key) - { - m_interface->kodi_gui->window->clear_property(m_interface->kodiBase, m_controlHandle, - key.c_str()); - } - //---------------------------------------------------------------------------- - - /// @{ - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Function delete all entries in integrated list. - /// - void ClearList() - { - m_interface->kodi_gui->window->clear_item_list(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To add a list item in the on window integrated list. - /// - /// @param[in] item List item to add - /// @param[in] itemPosition [opt] The position for item, default is on end - /// - void AddListItem(const std::shared_ptr& item, int itemPosition = -1) - { - m_interface->kodi_gui->window->add_list_item(m_interface->kodiBase, m_controlHandle, - item->m_controlHandle, itemPosition); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To add a list item based upon string in the on window integrated list. - /// - /// @param[in] item List item to add - /// @param[in] itemPosition [opt] The position for item, default is on end - /// - void AddListItem(const std::string& item, int itemPosition = -1) - { - m_interface->kodi_gui->window->add_list_item( - m_interface->kodiBase, m_controlHandle, - std::make_shared(item)->m_controlHandle, itemPosition); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Remove list item on position. - /// - /// @param[in] itemPosition List position to remove - /// - void RemoveListItem(int itemPosition) - { - m_interface->kodi_gui->window->remove_list_item_from_position(m_interface->kodiBase, - m_controlHandle, itemPosition); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Remove item with given control class from list. - /// - /// @param[in] item List item control class to remove - /// - void RemoveListItem(const std::shared_ptr& item) - { - m_interface->kodi_gui->window->remove_list_item(m_interface->kodiBase, m_controlHandle, - item->m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To get list item control class on wanted position. - /// - /// @param[in] listPos Position from where control is needed - /// @return The list item control class or null if not found - /// - /// @warning Function returns a new generated **CListItem** class! - /// - std::shared_ptr GetListItem(int listPos) - { - KODI_GUI_LISTITEM_HANDLE handle = m_interface->kodi_gui->window->get_list_item( - m_interface->kodiBase, m_controlHandle, listPos); - if (!handle) - return std::shared_ptr(); - - return std::make_shared(handle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To set position of selected part in list. - /// - /// @param[in] listPos Position to use - /// - void SetCurrentListPosition(int listPos) - { - m_interface->kodi_gui->window->set_current_list_position(m_interface->kodiBase, m_controlHandle, - listPos); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To get current selected position in list - /// - /// @return Current list position - /// - int GetCurrentListPosition() - { - return m_interface->kodi_gui->window->get_current_list_position(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To get the amount of entries in the list. - /// - /// @return Size of in window integrated control class - /// - int GetListSize() - { - return m_interface->kodi_gui->window->get_list_size(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets a container property, similar to an infolabel. - /// - /// @param[in] key string - property name. - /// @param[in] value string or unicode - value of property. - /// - /// @note Key is NOT case sensitive.\n - /// You can use the above as keywords for arguments and skip certain - /// optional arguments.\n - /// Once you use a keyword, all following arguments require the keyword. - /// - void SetContainerProperty(const std::string& key, const std::string& value) - { - m_interface->kodi_gui->window->set_container_property(m_interface->kodiBase, m_controlHandle, - key.c_str(), value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Sets the content type of the container. - /// - /// @param[in] value string or unicode - content value. - /// - /// __Available content types__ - /// | Name | Media | - /// |:-----------:|:-----------------------------------------| - /// | actors | Videos - /// | addons | Addons, Music, Pictures, Programs, Videos - /// | albums | Music, Videos - /// | artists | Music, Videos - /// | countries | Music, Videos - /// | directors | Videos - /// | files | Music, Videos - /// | games | Games - /// | genres | Music, Videos - /// | images | Pictures - /// | mixed | Music, Videos - /// | movies | Videos - /// | Musicvideos | Music, Videos - /// | playlists | Music, Videos - /// | seasons | Videos - /// | sets | Videos - /// | songs | Music - /// | studios | Music, Videos - /// | tags | Music, Videos - /// | tvshows | Videos - /// | videos | Videos - /// | years | Music, Videos - /// - void SetContainerContent(const std::string& value) - { - m_interface->kodi_gui->window->set_container_content(m_interface->kodiBase, m_controlHandle, - value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief Get the id of the currently visible container. - /// - /// @return currently visible container id - /// - int GetCurrentContainerId() - { - return m_interface->kodi_gui->window->get_current_container_id(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - /// @} - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window - /// @brief To inform Kodi that it need to render region new. - /// - void MarkDirtyRegion() - { - return m_interface->kodi_gui->window->mark_dirty_region(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_gui_windows_window_callbacks Callback functions from Kodi to add-on - /// @ingroup cpp_kodi_gui_windows_window - /// @{ - /// @brief GUI window callback functions.\n - /// Functions to handle control callbacks from Kodi - /// - /// ------------------------------------------------------------------------ - /// - /// @link cpp_kodi_gui_windows_window Go back to normal functions from CWindow@endlink - // - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief OnInit method. - /// - /// @return Return true if initialize was done successful - /// - /// - virtual bool OnInit() { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief OnFocus method. - /// - /// @param[in] controlId GUI control identifier - /// @return Return true if focus condition was handled there or false to handle - /// them by Kodi itself - /// - /// - virtual bool OnFocus(int controlId) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief OnClick method. - /// - /// @param[in] controlId GUI control identifier - /// @return Return true if click was handled there or false to handle them by - /// Kodi itself - /// - /// - virtual bool OnClick(int controlId) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief OnAction method. - /// - /// @param[in] actionId The action id to perform, see - /// @ref kodi_key_action_ids to get list of - /// them - /// @return Return true if action was handled there - /// or false to handle them by Kodi itself - /// - /// - /// This method will receive all actions that the main program will send - /// to this window. - /// - /// @note - /// - By default, only the @c ADDON_ACTION_PREVIOUS_MENU and @c ADDON_ACTION_NAV_BACK actions are handled. - /// - Overwrite this method to let your code handle all actions. - /// - Don't forget to capture @ref ADDON_ACTION_PREVIOUS_MENU or @ref ADDON_ACTION_NAV_BACK, else the user can't close this window. - /// - /// - ///---------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// .. - /// // Window used with parent / child way - /// bool cYOUR_CLASS::OnAction(ADDON_ACTION actionId) - /// { - /// switch (action) - /// { - /// case ADDON_ACTION_PREVIOUS_MENU: - /// case ADDON_ACTION_NAV_BACK: - /// printf("action recieved: previous"); - /// Close(); - /// return true; - /// case ADDON_ACTION_SHOW_INFO: - /// printf("action recieved: show info"); - /// break; - /// case ADDON_ACTION_STOP: - /// printf("action recieved: stop"); - /// break; - /// case ADDON_ACTION_PAUSE: - /// printf("action recieved: pause"); - /// break; - /// default: - /// break; - /// } - /// return false; - /// } - /// .. - /// ~~~~~~~~~~~~~ - /// - virtual bool OnAction(ADDON_ACTION actionId) - { - switch (actionId) - { - case ADDON_ACTION_PREVIOUS_MENU: - case ADDON_ACTION_NAV_BACK: - Close(); - return true; - default: - break; - } - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief Get context menu buttons for list entry. - /// - /// @param[in] itemNumber Selected list item entry - /// @param[in] buttons List where context menus becomes added with his - /// identifier and name - /// - virtual void GetContextButtons(int itemNumber, - std::vector>& buttons) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief Called after selection in context menu. - /// - /// @param[in] itemNumber Selected list item entry - /// @param[in] button The pressed button id - /// @return true if handled, otherwise false - /// - virtual bool OnContextButton(int itemNumber, unsigned int button) { return false; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_window_callbacks - /// @brief **Set independent callbacks** - /// - /// If the class is used independent (with "new CWindow") and - /// not as parent (with \"cCLASS_own : public @ref cpp_kodi_gui_windows_window "kodi::gui::CWindow"\") from own must be the - /// callback from Kodi to add-on overdriven with own functions! - /// - /// @param[in] cbhdl The pointer to own handle data structure / class - /// @param[in] CBOnInit Own defined window init function - /// @param[in] CBOnFocus Own defined focus function - /// @param[in] CBOnClick Own defined click function - /// @param[in] CBOnAction Own defined action function - /// @param[in] CBGetContextButtons [opt] To get context menu entries for - /// lists function - /// @param[in] CBOnContextButton [opt] Used context menu entry function - /// - /// - ///---------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// ... - /// - /// bool OnInit(kodi::gui::ClientHandle cbhdl) - /// { - /// ... - /// return true; - /// } - /// - /// bool OnFocus(kodi::gui::ClientHandle cbhdl, int controlId) - /// { - /// ... - /// return true; - /// } - /// - /// bool OnClick(kodi::gui::ClientHandle cbhdl, int controlId) - /// { - /// ... - /// return true; - /// } - /// - /// bool OnAction(kodi::gui::ClientHandle cbhdl, ADDON_ACTION actionId) - /// { - /// ... - /// return true; - /// } - /// - /// ... - /// // Somewhere where you create the window - /// CWindow myWindow = new CWindow; - /// myWindow->SetIndependentCallbacks(myWindow, OnInit, OnFocus, OnClick, OnAction); - /// ... - /// ~~~~~~~~~~~~~ - /// - void SetIndependentCallbacks(kodi::gui::ClientHandle cbhdl, - bool (*CBOnInit)(kodi::gui::ClientHandle cbhdl), - bool (*CBOnFocus)(kodi::gui::ClientHandle cbhdl, int controlId), - bool (*CBOnClick)(kodi::gui::ClientHandle cbhdl, int controlId), - bool (*CBOnAction)(kodi::gui::ClientHandle cbhdl, - ADDON_ACTION actionId), - void (*CBGetContextButtons)(kodi::gui::ClientHandle cbhdl, - int itemNumber, - gui_context_menu_pair* buttons, - unsigned int* size) = nullptr, - bool (*CBOnContextButton)(kodi::gui::ClientHandle cbhdl, - int itemNumber, - unsigned int button) = nullptr) - { - if (!cbhdl || !CBOnInit || !CBOnFocus || !CBOnClick || !CBOnAction) - { - kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow::%s called with nullptr !!!", __FUNCTION__); - return; - } - - m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, cbhdl, - CBOnInit, CBOnFocus, CBOnClick, CBOnAction, - CBGetContextButtons, CBOnContextButton); - } - //---------------------------------------------------------------------------- - /// @} - -private: - static bool CBOnInit(KODI_GUI_CLIENT_HANDLE cbhdl) - { - return static_cast(cbhdl)->OnInit(); - } - - static bool CBOnFocus(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId) - { - return static_cast(cbhdl)->OnFocus(controlId); - } - - static bool CBOnClick(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId) - { - return static_cast(cbhdl)->OnClick(controlId); - } - - static bool CBOnAction(KODI_GUI_CLIENT_HANDLE cbhdl, ADDON_ACTION actionId) - { - return static_cast(cbhdl)->OnAction(actionId); - } - - static void CBGetContextButtons(KODI_GUI_CLIENT_HANDLE cbhdl, - int itemNumber, - gui_context_menu_pair* buttons, - unsigned int* size) - { - std::vector> buttonList; - static_cast(cbhdl)->GetContextButtons(itemNumber, buttonList); - if (!buttonList.empty()) - { - unsigned int presentSize = static_cast(buttonList.size()); - if (presentSize > *size) - kodi::Log(ADDON_LOG_WARNING, "GetContextButtons: More as allowed '%i' entries present!", - *size); - else - *size = presentSize; - for (unsigned int i = 0; i < *size; ++i) - { - buttons[i].id = buttonList[i].first; - strncpy(buttons[i].name, buttonList[i].second.c_str(), ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH); - } - } - } - - static bool CBOnContextButton(KODI_GUI_CLIENT_HANDLE cbhdl, int itemNumber, unsigned int button) - { - return static_cast(cbhdl)->OnContextButton(itemNumber, button); - } -}; - -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h index 873a549d2a247..a34d44bda5e96 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h @@ -38,7 +38,7 @@ namespace controls /// @note The call of the control is only possible from the corresponding /// window as its class and identification number is required. /// -class ATTRIBUTE_HIDDEN CButton : public CAddonGUIControlBase +class ATTR_DLL_LOCAL CButton : public CAddonGUIControlBase { public: //============================================================================ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt index 3fdab0104743f..ce91a59597422 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt @@ -1,16 +1,10 @@ -set(HEADERS Button.h - Edit.h - FadeLabel.h - Image.h - Label.h - Progress.h - RadioButton.h - Rendering.h - SettingsSlider.h - Slider.h - Spin.h - TextBox.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_gui_controls) +set(HEADERS + Button.h +) + +if(HEADERS) + core_add_devkit_header(kodi_gui_controls) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h deleted file mode 100644 index 00c6231ce3736..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/edit.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CEdit Control Edit -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CEdit } -/// **Editable window text control used as an input control for the osd keyboard -/// and other input fields**\n -/// The edit control allows a user to input text in Kodi. -/// -/// You can choose the font, size, colour, location and header of the text to be -/// displayed. -/// -/// It has the header @ref Edit.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin partfor a @ref skin_Edit_control "edit control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// - -//============================================================================== -// see gui/definition.h for use of group "cpp_kodi_gui_windows_controls_CEdit_Defs" -/// -/// @defgroup cpp_kodi_gui_windows_controls_CEdit_Defs Definitions, structures and enumerators -/// @ingroup cpp_kodi_gui_windows_controls_CEdit -/// @brief **Library definition values** -/// - -class ATTRIBUTE_HIDDEN CEdit : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CEdit(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_edit( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::control::CEdit can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Destructor. - /// - ~CEdit() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_edit->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Set's the control's enabled/disabled state. - /// - /// @param[in] enabled If true enabled, otherwise disabled - /// - void SetEnabled(bool enabled) - { - m_interface->kodi_gui->control_edit->set_enabled(m_interface->kodiBase, m_controlHandle, - enabled); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief To set the text string on edit control. - /// - /// @param[in] label Text to show - /// - void SetLabel(const std::string& label) - { - m_interface->kodi_gui->control_edit->set_label(m_interface->kodiBase, m_controlHandle, - label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Returns the text heading for this edit control. - /// - /// @return Heading text - /// - std::string GetLabel() const - { - std::string label; - char* ret = - m_interface->kodi_gui->control_edit->get_label(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Set's text heading for this edit control. - /// - /// @param[in] text string or unicode - text string. - /// - void SetText(const std::string& text) - { - m_interface->kodi_gui->control_edit->set_text(m_interface->kodiBase, m_controlHandle, - text.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Returns the text value for this edit control. - /// - /// @return Text value of control - /// - std::string GetText() const - { - std::string text; - char* ret = - m_interface->kodi_gui->control_edit->get_text(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - text = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return text; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief Set the cursor position on text. - /// - /// @param[in] position The position to set - /// - void SetCursorPosition(unsigned int position) - { - m_interface->kodi_gui->control_edit->set_cursor_position(m_interface->kodiBase, m_controlHandle, - position); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief To get current cursor position on text field. - /// - /// @return The current cursor position - /// - unsigned int GetCursorPosition() - { - return m_interface->kodi_gui->control_edit->get_cursor_position(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CEdit - /// @brief To set field input type which are defined on @ref AddonGUIInputType. - /// - /// @param[in] type The @ref AddonGUIInputType "Add-on input type" to use - /// @param[in] heading The heading text for related keyboard dialog - /// - void SetInputType(AddonGUIInputType type, const std::string& heading) - { - m_interface->kodi_gui->control_edit->set_input_type(m_interface->kodiBase, m_controlHandle, - static_cast(type), heading.c_str()); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h deleted file mode 100644 index 01847fbd741a2..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/fade_label.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CFadeLabel Control Fade Label -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CFadeLabel } -/// **Window control used to show multiple pieces of text in the same position, -/// by fading from one to the other**\n -/// The fade label control is used for displaying multiple pieces of text in -/// the same space in Kodi. -/// -/// You can choose the font, size, colour, location and contents of the text to -/// be displayed. The first piece of information to display fades in over 50 -/// frames, then scrolls off to the left. Once it is finished scrolling off -/// screen, the second piece of information fades in and the process repeats. -/// A fade label control is not supported in a list container. -/// -/// It has the header @ref FadeLabel.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Fade_Label_Control "fade label control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CFadeLabel : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CFadeLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_fade_label( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CFadeLabel can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief Destructor. - /// - ~CFadeLabel() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_fade_label->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief To add additional text string on fade label. - /// - /// @param[in] label Text to show - /// - void AddLabel(const std::string& label) - { - m_interface->kodi_gui->control_fade_label->add_label(m_interface->kodiBase, m_controlHandle, - label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief Get the used text from button. - /// - /// @return Text shown - /// - std::string GetLabel() const - { - std::string label; - char* ret = m_interface->kodi_gui->control_fade_label->get_label(m_interface->kodiBase, - m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief To enable or disable scrolling on fade label. - /// - /// @param[in] scroll To enable scrolling set to true, otherwise is disabled - /// - void SetScrolling(bool scroll) - { - m_interface->kodi_gui->control_fade_label->set_scrolling(m_interface->kodiBase, m_controlHandle, - scroll); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel - /// @brief To reset al inserted labels. - /// - void Reset() - { - m_interface->kodi_gui->control_fade_label->reset(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h deleted file mode 100644 index 9dc493e3eb404..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/image.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================ -/// @defgroup cpp_kodi_gui_windows_controls_CImage Control Image -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CImage } -/// **Window control used to show an image.**\n -/// The image control is used for displaying images in Kodi. You can choose -/// the position, size, transparency and contents of the image to be displayed. -/// -/// It has the header @ref Image.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Image_Control "image control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CImage : public CAddonGUIControlBase -{ -public: - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CImage - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CImage(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_image( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CImage can't create control class from Kodi !!!"); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CImage - /// @brief Destructor. - /// - ~CImage() override = default; - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CImage - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_image->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CImage - /// @brief To set the filename used on image control. - /// - /// @param[in] filename Image file to use - /// @param[in] useCache To define storage of image, default is in cache, if - /// false becomes it loaded always on changes again - /// - void SetFileName(const std::string& filename, bool useCache = true) - { - m_interface->kodi_gui->control_image->set_filename(m_interface->kodiBase, m_controlHandle, - filename.c_str(), useCache); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CImage - /// @brief To set set the diffuse color on image. - /// - /// @param[in] colorDiffuse Color to use for diffuse - /// - void SetColorDiffuse(uint32_t colorDiffuse) - { - m_interface->kodi_gui->control_image->set_color_diffuse(m_interface->kodiBase, m_controlHandle, - colorDiffuse); - } - //-------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h deleted file mode 100644 index d10b85f4b7fbc..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/label.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CLabel Control Label -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CLabel } -/// **Window control used to show some lines of text**\n -/// The label control is used for displaying text in Kodi. You can choose -/// the font, size, colour, location and contents of the text to be displayed. -/// -/// It has the header @ref Label.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Label_Control "label control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CLabel : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CLabel - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_label( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CLabel can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CLabel - /// @brief Destructor. - /// - ~CLabel() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CLabel - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_label->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CLabel - /// @brief To set the text string on label. - /// - /// @param[in] text Text to show - /// - void SetLabel(const std::string& text) - { - m_interface->kodi_gui->control_label->set_label(m_interface->kodiBase, m_controlHandle, - text.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CLabel - /// @brief Get the used text from control. - /// - /// @return Used text on label control - /// - std::string GetLabel() const - { - std::string label; - char* ret = - m_interface->kodi_gui->control_label->get_label(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h deleted file mode 100644 index 83b16aae83c8d..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/progress.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CProgress Control Progress -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CProgress } -/// **Window control to show the progress of a particular operation**\n -/// The progress control is used to show the progress of an item that may take -/// a long time, or to show how far through a movie you are. -/// -/// You can choose the position, size, and look of the progress control. -/// -/// It has the header @ref Progress.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Progress_Control "progress control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CProgress : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CProgress - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CProgress(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_progress( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CProgress can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CProgress - /// @brief Destructor. - /// - ~CProgress() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CProgress - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_progress->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CProgress - /// @brief To set Percent position of control. - /// - /// @param[in] percent The percent position to use - /// - void SetPercentage(float percent) - { - m_interface->kodi_gui->control_progress->set_percentage(m_interface->kodiBase, m_controlHandle, - percent); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CProgress - /// @brief Get the active percent position of progress bar. - /// - /// @return Progress position as percent - /// - float GetPercentage() const - { - return m_interface->kodi_gui->control_progress->get_percentage(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h deleted file mode 100644 index 3b6a23c13b78b..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/radio_button.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CRadioButton Control Radio Button -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CRadioButton } -/// **Window control for a radio button (as used for on/off settings)**\n -/// The radio button control is used for creating push button on/off settings -/// in Kodi. -/// -/// You can choose the position, size, and look of the button. When the user -/// clicks on the radio button, the state will change, toggling the extra -/// textures (textureradioon and textureradiooff). Used for settings -/// controls. -/// -/// It has the header @ref RadioButton.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Radio_button_control "radio button control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -/// -/// -------------------------------------------------------------------------- -/// **Example:** -/// ~~~~~~~~~~~~cpp -/// #include -/// -/// #define MY_RADIO_BUTTON_CONTROL 1 -/// -/// class CMyWindow : public kodi::gui::CWindow -/// { -/// public: -/// CMyWindow() -/// -/// void ShowWindow(); -/// -/// bool OnInit() override; -/// bool OnClick(int controlId) override; -/// -/// private: -/// kodi::gui::controls::CSpin m_myRadioButtonControl; -/// }; -/// -/// CMyWindow::CMyWindow() -/// : kodi::gui::CWindow("my_skin.xml", "skin.estuary", true, false), -/// m_myRadioButtonControl(this, MY_RADIO_BUTTON_CONTROL) -/// { -/// } -/// -/// void CMyWindow::ShowWindow() -/// { -/// kodi::gui::CWindow::DoModal(); -/// } -/// -/// bool CMyWindow::OnInit() -/// { -/// m_myRadioButtonControl.SetSelected(false); // can also on skin set to default -/// return true; -/// } -/// -/// bool CMyWindow::OnClick(int controlId) -/// { -/// if (controlId == MY_RADIO_BUTTON_CONTROL) -/// { -/// bool selected = m_myRadioButtonControl.IsSelected(); -/// ... -/// } -/// return true; -/// } -/// return false; -/// } -/// ~~~~~~~~~~~~ -/// -class ATTRIBUTE_HIDDEN CRadioButton : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CRadioButton(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_radio_button( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CRadioButton can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief Destructor. - /// - ~CRadioButton() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton. - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_radio_button->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief Set's the control's enabled/disabled state. - /// - /// @param[in] enabled If true enabled, otherwise disabled - /// - void SetEnabled(bool enabled) - { - m_interface->kodi_gui->control_radio_button->set_enabled(m_interface->kodiBase, m_controlHandle, - enabled); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief To set the text string on radio button. - /// - /// @param[in] label Text to show - /// - void SetLabel(const std::string& label) - { - m_interface->kodi_gui->control_radio_button->set_label(m_interface->kodiBase, m_controlHandle, - label.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief Get the used text from control. - /// - /// @return Text shown - /// - std::string GetLabel() const - { - std::string label; - char* ret = m_interface->kodi_gui->control_radio_button->get_label(m_interface->kodiBase, - m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - label = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return label; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief To set radio button condition to on or off. - /// - /// @param[in] selected true set radio button to selection on, otherwise off - /// - void SetSelected(bool selected) - { - m_interface->kodi_gui->control_radio_button->set_selected(m_interface->kodiBase, - m_controlHandle, selected); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton - /// @brief Get the current selected condition of radio button. - /// - /// @return Selected condition - /// - bool IsSelected() const - { - return m_interface->kodi_gui->control_radio_button->is_selected(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h deleted file mode 100644 index 7f5feef3b5a2f..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/rendering.h" -#include "../Window.h" -#include "../renderHelper.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================ -/// @defgroup cpp_kodi_gui_windows_controls_CRendering Control Rendering -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CRendering } -/// **Window control for rendering own parts**\n -/// This rendering control is used when own parts are needed. -/// -/// You have the control over them to render direct OpenGL or DirectX content -/// to the screen set by the size of them. -/// -/// Alternative can be the virtual functions from t his been ignored if the -/// callbacks are defined by the @ref CRendering_SetIndependentCallbacks -/// function and class is used as single and not as a parent class. -/// -/// It has the header @ref Rendering.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Addon_Rendering_control "rendering control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CRendering : public CAddonGUIControlBase -{ -public: - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CRendering(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_render_addon( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (m_controlHandle) - m_interface->kodi_gui->control_rendering->set_callbacks(m_interface->kodiBase, - m_controlHandle, this, OnCreateCB, - OnRenderCB, OnStopCB, OnDirtyCB); - else - kodi::Log(ADDON_LOG_FATAL, "kodi::gui::controls::%s can't create control class from Kodi !!!", - __FUNCTION__); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief Destructor. - /// - ~CRendering() override - { - m_interface->kodi_gui->control_rendering->destroy(m_interface->kodiBase, m_controlHandle); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief To create rendering control on Add-on. - /// - /// Function creates the needed rendering control for Kodi which becomes - /// handled and processed from Add-on - /// - /// @note This is callback function from Kodi to Add-on and not to use - /// for calls from add-on to this function. - /// - /// @param[in] x Horizontal position - /// @param[in] y Vertical position - /// @param[in] w Width of control - /// @param[in] h Height of control - /// @param[in] device The device to use. For OpenGL is empty on Direct X is - /// the needed device send. - /// @return Add-on needs to return true if successed, otherwise false. - /// - /// @note The @ref kodi::HardwareContext is basically a simple pointer which - /// has to be changed to the desired format at the corresponding places using - /// `static_cast<...>(...)`. - /// - virtual bool Create(int x, int y, int w, int h, kodi::HardwareContext device) { return false; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief Render process call from Kodi. - /// - /// @note This is callback function from Kodi to Add-on and not to use for - /// calls from add-on to this function. - /// - virtual void Render() {} - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief Call from Kodi to stop rendering process. - /// - /// @note This is callback function from Kodi to Add-on and not to use - /// for calls from add-on to this function. - /// - virtual void Stop() {} - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @brief Call from Kodi where add-on becomes asked about dirty rendering - /// region. - /// - /// @note This is callback function from Kodi to Add-on and not to use - /// for calls from add-on to this function. - /// - /// @return True if a render region is dirty and need rendering. - /// - virtual bool Dirty() { return false; } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CRendering - /// @anchor CRendering_SetIndependentCallbacks - /// @brief If the class is used independent (with "new CRendering") - /// and not as parent (with "cCLASS_own : CRendering") from own must - /// be the callback from Kodi to add-on overdriven with own functions! - /// - /// @param[in] cbhdl Addon related class point where becomes given as value on - /// related functions. - /// @param[in] CBCreate External creation function pointer, see also @ref Create - /// about related values - /// @param[in] CBRender External render function pointer, see also @ref Render - /// about related values - /// @param[in] CBStop External stop function pointer, see also @ref Stop - /// about related values - /// @param[in] CBDirty External dirty function pointer, see also @ref Dirty - /// about related values - /// - void SetIndependentCallbacks(kodi::gui::ClientHandle cbhdl, - bool (*CBCreate)(kodi::gui::ClientHandle cbhdl, - int x, - int y, - int w, - int h, - kodi::HardwareContext device), - void (*CBRender)(kodi::gui::ClientHandle cbhdl), - void (*CBStop)(kodi::gui::ClientHandle cbhdl), - bool (*CBDirty)(kodi::gui::ClientHandle cbhdl)) - { - if (!cbhdl || !CBCreate || !CBRender || !CBStop || !CBDirty) - { - kodi::Log(ADDON_LOG_ERROR, "kodi::gui::controls::%s called with nullptr !!!", __FUNCTION__); - return; - } - - m_interface->kodi_gui->control_rendering->set_callbacks( - m_interface->kodiBase, m_controlHandle, cbhdl, CBCreate, CBRender, CBStop, CBDirty); - } - //-------------------------------------------------------------------------- - -private: - /* - * Defined callback functions from Kodi to add-on, for use in parent / child system - * (is private)! - */ - static bool OnCreateCB( - KODI_GUI_CLIENT_HANDLE cbhdl, int x, int y, int w, int h, ADDON_HARDWARE_CONTEXT device) - { - static_cast(cbhdl)->m_renderHelper = kodi::gui::GetRenderHelper(); - return static_cast(cbhdl)->Create(x, y, w, h, device); - } - - static void OnRenderCB(KODI_GUI_CLIENT_HANDLE cbhdl) - { - if (!static_cast(cbhdl)->m_renderHelper) - return; - static_cast(cbhdl)->m_renderHelper->Begin(); - static_cast(cbhdl)->Render(); - static_cast(cbhdl)->m_renderHelper->End(); - } - - static void OnStopCB(KODI_GUI_CLIENT_HANDLE cbhdl) - { - static_cast(cbhdl)->Stop(); - static_cast(cbhdl)->m_renderHelper = nullptr; - } - - static bool OnDirtyCB(KODI_GUI_CLIENT_HANDLE cbhdl) - { - return static_cast(cbhdl)->Dirty(); - } - - std::shared_ptr m_renderHelper; -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h deleted file mode 100644 index 5557fc400bb47..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/settings_slider.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CSettingsSlider Control Settings Slider -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CSettingsSlider } -/// **Window control for moveable slider with text name**\n -/// The settings slider control is used in the settings screens for when an -/// option is best specified on a sliding scale. -/// -/// You can choose the position, size, and look of the slider control. It is -/// basically a cross between the button control and a slider control. It has a -/// label and focus and non focus textures, as well as a slider control on the -/// right. -/// -/// It has the header @ref SettingsSlider.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Settings_Slider_Control "settings slider control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CSettingsSlider : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CSettingsSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_settings_slider( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CSettingsSlider can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Destructor. - /// - ~CSettingsSlider() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_settings_slider->set_visible(m_interface->kodiBase, - m_controlHandle, visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Set's the control's enabled/disabled state. - /// - /// @param[in] enabled If true enabled, otherwise disabled - /// - void SetEnabled(bool enabled) - { - m_interface->kodi_gui->control_settings_slider->set_enabled(m_interface->kodiBase, - m_controlHandle, enabled); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To set the text string on settings slider. - /// - /// @param[in] text Text to show - /// - void SetText(const std::string& text) - { - m_interface->kodi_gui->control_settings_slider->set_text(m_interface->kodiBase, m_controlHandle, - text.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To reset slider on defaults. - /// - void Reset() - { - m_interface->kodi_gui->control_settings_slider->reset(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To set the the range as integer of slider, e.g. -10 is the slider - /// start and e.g. +10 is the from here defined position where it reach the - /// end. - /// - /// Ad default is the range from 0 to 100. - /// - /// The integer interval is as default 1 and can be changed with - /// @ref SetIntInterval. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetIntRange(int start, int end) - { - m_interface->kodi_gui->control_settings_slider->set_int_range(m_interface->kodiBase, - m_controlHandle, start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Set the slider position with the given integer value. The Range - /// must be defined with a call from @ref SetIntRange before. - /// - /// @param[in] value Position in range to set with integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetIntValue(int value) - { - m_interface->kodi_gui->control_settings_slider->set_int_value(m_interface->kodiBase, - m_controlHandle, value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To get the current position as integer value. - /// - /// @return The position as integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - int GetIntValue() const - { - return m_interface->kodi_gui->control_settings_slider->get_int_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To set the interval steps of slider, as default is it 1. If it - /// becomes changed with this function will a step of the user with the - /// value fixed here be executed. - /// - /// @param[in] interval Intervall step to set. - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetIntInterval(int interval) - { - m_interface->kodi_gui->control_settings_slider->set_int_interval(m_interface->kodiBase, - m_controlHandle, interval); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Sets the percent of the slider. - /// - /// @param[in] percent float - Percent value of slide - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetPercentage(float percent) - { - m_interface->kodi_gui->control_settings_slider->set_percentage(m_interface->kodiBase, - m_controlHandle, percent); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Returns a float of the percent of the slider. - /// - /// @return float - Percent of slider - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - float GetPercentage() const - { - return m_interface->kodi_gui->control_settings_slider->get_percentage(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To set the the range as float of slider, e.g. -25.0 is the slider - /// start and e.g. +25.0 is the from here defined position where it reach - /// the end. - /// - /// As default is the range 0.0 to 1.0. - /// - /// The float interval is as default 0.1 and can be changed with - /// @ref SetFloatInterval. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetFloatRange(float start, float end) - { - m_interface->kodi_gui->control_settings_slider->set_float_range(m_interface->kodiBase, - m_controlHandle, start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief Set the slider position with the given float value. The Range can - /// be defined with a call from @ref SetIntRange before, as default it - /// is 0.0 to 1.0. - /// - /// @param[in] value Position in range to set with float - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetFloatValue(float value) - { - m_interface->kodi_gui->control_settings_slider->set_float_value(m_interface->kodiBase, - m_controlHandle, value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To get the current position as float value. - /// - /// @return The position as float - /// - float GetFloatValue() const - { - return m_interface->kodi_gui->control_settings_slider->get_float_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider - /// @brief To set the interval steps of slider, as default is it 0.1 If it - /// becomes changed with this function will a step of the user with the - /// value fixed here be executed. - /// - /// @param[in] interval Intervall step to set. - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetFloatInterval(float interval) - { - m_interface->kodi_gui->control_settings_slider->set_float_interval(m_interface->kodiBase, - m_controlHandle, interval); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h deleted file mode 100644 index 077def82fcced..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/slider.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CSlider Control Slider -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CSlider } -/// **Window control for moveable slider**\n -/// The slider control is used for things where a sliding bar best represents -/// the operation at hand (such as a volume control or seek control). -/// -/// You can choose the position, size, and look of the slider control. -/// -/// It has the header @ref Slider.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Slider_Control "slider control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CSlider : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_slider( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CSlider can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Destructor. - /// - ~CSlider() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_slider->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Set's the control's enabled/disabled state. - /// - /// @param[in] enabled If true enabled, otherwise disabled - /// - void SetEnabled(bool enabled) - { - m_interface->kodi_gui->control_slider->set_enabled(m_interface->kodiBase, m_controlHandle, - enabled); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To reset slider on defaults. - /// - void Reset() - { - m_interface->kodi_gui->control_slider->reset(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief With GetDescription becomes a string value of position returned. - /// - /// @return Text string about current slider position - /// - /// The following are the text definition returned from this: - /// | Value | Without range selection | With range selection | - /// |:---------:|:------------------------|:-------------------------------| - /// | float | %2.2f | [%2.2f, %2.2f] | - /// | integer | %i | [%i, %i] | - /// | percent | %i%% | [%i%%, %i%%] | - /// - std::string GetDescription() const - { - std::string text; - char* ret = m_interface->kodi_gui->control_slider->get_description(m_interface->kodiBase, - m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - text = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return text; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To set the the range as integer of slider, e.g. -10 is the slider - /// start and e.g. +10 is the from here defined position where it reach the - /// end. - /// - /// Ad default is the range from 0 to 100. - /// - /// The integer interval is as default 1 and can be changed with - /// @ref SetIntInterval. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - void SetIntRange(int start, int end) - { - m_interface->kodi_gui->control_slider->set_int_range(m_interface->kodiBase, m_controlHandle, - start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Set the slider position with the given integer value. The Range - /// must be defined with a call from @ref SetIntRange before. - /// - /// @param[in] value Position in range to set with integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - void SetIntValue(int value) - { - m_interface->kodi_gui->control_slider->set_int_value(m_interface->kodiBase, m_controlHandle, - value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To get the current position as integer value. - /// - /// @return The position as integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - int GetIntValue() const - { - return m_interface->kodi_gui->control_slider->get_int_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To set the interval steps of slider, as default is it 1. If it - /// becomes changed with this function will a step of the user with the - /// value fixed here be executed. - /// - /// @param[in] interval Intervall step to set. - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - void SetIntInterval(int interval) - { - m_interface->kodi_gui->control_slider->set_int_interval(m_interface->kodiBase, m_controlHandle, - interval); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Sets the percent of the slider. - /// - /// @param[in] percent float - Percent value of slide - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - void SetPercentage(float percent) - { - m_interface->kodi_gui->control_slider->set_percentage(m_interface->kodiBase, m_controlHandle, - percent); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Returns a float of the percent of the slider. - /// - /// @return float - Percent of slider - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - float GetPercentage() const - { - return m_interface->kodi_gui->control_slider->get_percentage(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To set the the range as float of slider, e.g. -25.0 is the slider - /// start and e.g. +25.0 is the from here defined position where it reach - /// the end. - /// - /// As default is the range 0.0 to 1.0. - /// - /// The float interval is as default 0.1 and can be changed with - /// @ref SetFloatInterval. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetFloatRange(float start, float end) - { - m_interface->kodi_gui->control_slider->set_float_range(m_interface->kodiBase, m_controlHandle, - start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief Set the slider position with the given float value. The Range - /// can be defined with a call from @ref SetIntRange before, as default it - /// is 0.0 to 1.0. - /// - /// @param[in] value Position in range to set with float - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only one - /// each can be used. - /// - void SetFloatValue(float value) - { - m_interface->kodi_gui->control_slider->set_float_value(m_interface->kodiBase, m_controlHandle, - value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To get the current position as float value. - /// - /// @return The position as float - /// - float GetFloatValue() const - { - return m_interface->kodi_gui->control_slider->get_float_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSlider - /// @brief To set the interval steps of slider, as default is it 0.1 If it - /// becomes changed with this function will a step of the user with the - /// value fixed here be executed. - /// - /// @param[in] interval Intervall step to set. - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used. - /// - void SetFloatInterval(float interval) - { - m_interface->kodi_gui->control_slider->set_float_interval(m_interface->kodiBase, - m_controlHandle, interval); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h deleted file mode 100644 index 6c552438d7dc6..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/spin.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================== -/// @defgroup cpp_kodi_gui_windows_controls_CSpin Control Spin -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CSpin } -/// **Window control used for cycling up/down controls**\n -/// The settings spin control is used in the settings screens for when a list -/// of options can be chosen from using up/down arrows. -/// -/// You can choose the position, size, and look of the spin control. It is -/// basically a cross between the button control and a spin control. It has a -/// label and focus and non focus textures, as well as a spin control on the -/// right. -/// -/// It has the header @ref Spin.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Spin_Control "spin control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -/// -------------------------------------------------------------------------- -/// **Example:** -/// ~~~~~~~~~~~~cpp -/// #include -/// -/// #define MY_SPIN_CONTROL 1 -/// -/// class CMyWindow : public kodi::gui::CWindow -/// { -/// public: -/// CMyWindow() -/// -/// void ShowWindow(); -/// -/// bool OnInit() override; -/// bool OnClick(int controlId) override; -/// -/// private: -/// kodi::gui::controls::CSpin m_mySpinControl; -/// }; -/// -/// CMyWindow::CMyWindow() -/// : kodi::gui::CWindow("my_skin.xml", "skin.estuary", true, false), -/// m_mySpinControl(this, MY_SPIN_CONTROL) -/// { -/// } -/// -/// void CMyWindow::ShowWindow() -/// { -/// kodi::gui::CWindow::DoModal(); -/// } -/// -/// bool CMyWindow::OnInit() -/// { -/// m_mySpinControl.SetType(kodi::gui::controls::ADDON_SPIN_CONTROL_TYPE_INT); -/// m_mySpinControl.SetIntRange(1, 80); -/// return true; -/// } -/// -/// bool CMyWindow::OnClick(int controlId) -/// { -/// if (controlId == MY_SPIN_CONTROL) -/// { -/// int value = m_mySpinControl.GetIntValue(); -/// ... -/// } -/// return true; -/// } -/// return false; -/// } -/// ~~~~~~~~~~~~ -/// - - -//============================================================================== -/// @ingroup cpp_kodi_gui_windows_controls_CSpin -/// @anchor AddonGUISpinControlType -/// @brief The values here defines the used value format for steps on -/// spin control. -/// -typedef enum AddonGUISpinControlType -{ - /// One spin step interpreted as integer - ADDON_SPIN_CONTROL_TYPE_INT = 1, - /// One spin step interpreted as floating point value - ADDON_SPIN_CONTROL_TYPE_FLOAT = 2, - /// One spin step interpreted as text string - ADDON_SPIN_CONTROL_TYPE_TEXT = 3, - /// One spin step interpreted as a page change value - ADDON_SPIN_CONTROL_TYPE_PAGE = 4 -} AddonGUISpinControlType; -//------------------------------------------------------------------------------ - -class ATTRIBUTE_HIDDEN CSpin : public CAddonGUIControlBase -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Construct a new control. - /// - /// @param[in] window Related window control class - /// @param[in] controlId Used skin xml control id - /// - CSpin(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_spin( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CSpin can't create control class from Kodi !!!"); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Destructor. - /// - ~CSpin() override = default; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_spin->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Set's the control's enabled/disabled state. - /// - /// @param[in] enabled If true enabled, otherwise disabled - /// - void SetEnabled(bool enabled) - { - m_interface->kodi_gui->control_spin->set_enabled(m_interface->kodiBase, m_controlHandle, - enabled); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To set the text string on spin control. - /// - /// @param[in] text Text to show as name for spin - /// - void SetText(const std::string& text) - { - m_interface->kodi_gui->control_spin->set_text(m_interface->kodiBase, m_controlHandle, - text.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To reset spin control to defaults. - /// - void Reset() - { - m_interface->kodi_gui->control_spin->reset(m_interface->kodiBase, m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To set the with SpinControlType defined types of spin. - /// - /// @param[in] type The type to use - /// - /// @note See description of @ref AddonGUISpinControlType for available types. - /// - void SetType(AddonGUISpinControlType type) - { - m_interface->kodi_gui->control_spin->set_type(m_interface->kodiBase, m_controlHandle, - (int)type); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To add a label entry in spin defined with a value as string. - /// - /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. - /// - /// @param[in] label Label string to view on skin - /// @param[in] value String value to use for selection of them - /// - void AddLabel(const std::string& label, const std::string& value) - { - m_interface->kodi_gui->control_spin->add_string_label(m_interface->kodiBase, m_controlHandle, - label.c_str(), value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To add a label entry in spin defined with a value as integer. - /// - /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_INT to use this function. - /// - /// @param[in] label Label string to view on skin - /// @param[in] value Integer value to use for selection of them. - /// - void AddLabel(const std::string& label, int value) - { - m_interface->kodi_gui->control_spin->add_int_label(m_interface->kodiBase, m_controlHandle, - label.c_str(), value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To change the spin to position with them string as value. - /// - /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. - /// - /// @param[in] value String value to change to - /// - void SetStringValue(const std::string& value) - { - m_interface->kodi_gui->control_spin->set_string_value(m_interface->kodiBase, m_controlHandle, - value.c_str()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To get the current spin control position with text string value. - /// - /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. - /// - /// @return Currently selected string value - /// - std::string GetStringValue() const - { - std::string value; - char* ret = m_interface->kodi_gui->control_spin->get_string_value(m_interface->kodiBase, - m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - value = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return value; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To set the the range as integer of slider, e.g. -10 is the slider - /// start and e.g. +10 is the from here defined position where it reach the - /// end. - /// - /// Ad default is the range from 0 to 100. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - void SetIntRange(int start, int end) - { - m_interface->kodi_gui->control_spin->set_int_range(m_interface->kodiBase, m_controlHandle, - start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Set the slider position with the given integer value. The Range - /// must be defined with a call from @ref SetIntRange before. - /// - /// @param[in] value Position in range to set with integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - void SetIntValue(int value) - { - m_interface->kodi_gui->control_spin->set_int_value(m_interface->kodiBase, m_controlHandle, - value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To get the current position as integer value. - /// - /// @return The position as integer - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - int GetIntValue() const - { - return m_interface->kodi_gui->control_spin->get_int_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To set the the range as float of spin, e.g. -25.0 is the spin - /// start and e.g. +25.0 is the from here defined position where it reach - /// the end. - /// - /// As default is the range 0.0 to 1.0. - /// - /// The float interval is as default 0.1 and can be changed with - /// @ref SetFloatInterval. - /// - /// @param[in] start Integer start value - /// @param[in] end Integer end value - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - void SetFloatRange(float start, float end) - { - m_interface->kodi_gui->control_spin->set_float_range(m_interface->kodiBase, m_controlHandle, - start, end); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief Set the spin position with the given float value. The Range - /// can be defined with a call from @ref SetIntRange before, as default it - /// is 0.0 to 1.0. - /// - /// @param[in] value Position in range to set with float - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - void SetFloatValue(float value) - { - m_interface->kodi_gui->control_spin->set_float_value(m_interface->kodiBase, m_controlHandle, - value); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To get the current position as float value. - /// - /// @return The position as float - /// - float GetFloatValue() const - { - return m_interface->kodi_gui->control_spin->get_float_value(m_interface->kodiBase, - m_controlHandle); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_gui_windows_controls_CSpin - /// @brief To set the interval steps of spin, as default is it 0.1 If it - /// becomes changed with this function will a step of the user with the - /// value fixed here be executed. - /// - /// @param[in] interval Intervall step to set. - /// - /// @note Percent, floating point or integer are alone possible. Combining - /// these different values can be not together and can, therefore, only - /// one each can be used and must be defined with @ref SetType before. - /// - void SetFloatInterval(float interval) - { - m_interface->kodi_gui->control_spin->set_float_interval(m_interface->kodiBase, m_controlHandle, - interval); - } - //---------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h deleted file mode 100644 index 2634568e873bd..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/controls/text_box.h" -#include "../Window.h" - -#ifdef __cplusplus - -namespace kodi -{ -namespace gui -{ -namespace controls -{ - -//============================================================================ -/// @defgroup cpp_kodi_gui_windows_controls_CTextBox Control Text Box -/// @ingroup cpp_kodi_gui_windows_controls -/// @brief @cpp_class{ kodi::gui::controls::CTextBox } -/// **Used to show a multi-page piece of text**\n -/// The text box control can be used to display descriptions, help texts or -/// other larger texts. -/// -/// It corresponds to the representation which is also to be seen on the -/// @ref CDialogTextViewer. -/// -/// It has the header @ref TextBox.h "#include " -/// be included to enjoy it. -/// -/// Here you find the needed skin part for a @ref Text_Box "textbox control". -/// -/// @note The call of the control is only possible from the corresponding -/// window as its class and identification number is required. -/// -class ATTRIBUTE_HIDDEN CTextBox : public CAddonGUIControlBase -{ -public: - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief Construct a new control. - /// - /// @param[in] window related window control class - /// @param[in] controlId Used skin xml control id - /// - CTextBox(CWindow* window, int controlId) : CAddonGUIControlBase(window) - { - m_controlHandle = m_interface->kodi_gui->window->get_control_text_box( - m_interface->kodiBase, m_Window->GetControlHandle(), controlId); - if (!m_controlHandle) - kodi::Log(ADDON_LOG_FATAL, - "kodi::gui::controls::CTextBox can't create control class from Kodi !!!"); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief Destructor. - /// - ~CTextBox() override = default; - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief Set the control on window to visible. - /// - /// @param[in] visible If true visible, otherwise hidden - /// - void SetVisible(bool visible) - { - m_interface->kodi_gui->control_text_box->set_visible(m_interface->kodiBase, m_controlHandle, - visible); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief To reset box an remove all the text. - /// - void Reset() { m_interface->kodi_gui->control_text_box->reset(m_controlHandle, m_controlHandle); } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief To set the text on box. - /// - /// @param[in] text Text to show - /// - void SetText(const std::string& text) - { - m_interface->kodi_gui->control_text_box->set_text(m_interface->kodiBase, m_controlHandle, - text.c_str()); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief Get the used text from control. - /// - /// @return Text shown - /// - std::string GetText() const - { - std::string text; - char* ret = - m_interface->kodi_gui->control_text_box->get_text(m_interface->kodiBase, m_controlHandle); - if (ret != nullptr) - { - if (std::strlen(ret)) - text = ret; - m_interface->free_string(m_interface->kodiBase, ret); - } - return text; - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief To scroll text on other position. - /// - /// @param[in] position The line position to scroll to - /// - void Scroll(unsigned int position) - { - m_interface->kodi_gui->control_text_box->scroll(m_interface->kodiBase, m_controlHandle, - position); - } - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_gui_windows_controls_CTextBox - /// @brief To set automatic scrolling of textbox - /// - /// Specifies the timing and conditions of any autoscrolling this textbox - /// should have. Times are in milliseconds. The content is delayed for the - /// given delay, then scrolls at a rate of one line per time interval until - /// the end. If the repeat tag is present, it then delays for the repeat - /// time, fades out over 1 second, and repeats. It does not wrap or reset - /// to the top at the end of the scroll. - /// - /// @param[in] delay Content delay - /// @param[in] time One line per time interval - /// @param[in] repeat Delays with given time, fades out over 1 second, and - /// repeats - /// - void SetAutoScrolling(int delay, int time, int repeat) - { - m_interface->kodi_gui->control_text_box->set_auto_scrolling( - m_interface->kodiBase, m_controlHandle, delay, time, repeat); - } - //-------------------------------------------------------------------------- -}; - -} /* namespace controls */ -} /* namespace gui */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt index 9aaee4ff0f1d8..a6d32bb74e404 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt @@ -1,14 +1,19 @@ -set(HEADERS ContextMenu.h - ExtendedProgress.h - FileBrowser.h - Keyboard.h - Numeric.h - OK.h - Progress.h - Select.h - TextViewer.h - YesNo.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_gui_dialogs) +set(HEADERS + ContextMenu.h + ExtendedProgress.h + FileBrowser.h + Keyboard.h + Numeric.h + OK.h + Progress.h + Select.h + TextViewer.h + YesNo.h +) + +if(HEADERS) + core_add_devkit_header(kodi_gui_dialogs) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h index b576b9a9fa820..7fcb22aa841fe 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h @@ -13,6 +13,8 @@ #ifdef __cplusplus +#include + namespace kodi { namespace gui @@ -65,18 +67,16 @@ namespace ContextMenu /// fprintf(stderr, "Selected item is: %i\n", selected); /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, - const std::vector& entries) +inline int ATTR_DLL_LOCAL Show(const std::string& heading, + const std::vector& entries) { - using namespace ::kodi::addon; - unsigned int size = static_cast(entries.size()); + const size_t size = entries.size(); const char** cEntries = static_cast(malloc(size * sizeof(const char**))); for (unsigned int i = 0; i < size; ++i) { cEntries[i] = entries[i].c_str(); } - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size); + int ret = kodi::dl::api.kodi_gui_dialogs_context_menu_open(heading.c_str(), cEntries, size); free(cEntries); return ret; } @@ -113,18 +113,16 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, /// fprintf(stderr, "Selected item is: %i\n", selected); /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, +inline int ATTR_DLL_LOCAL Show(const std::string& heading, const std::vector>& entries) { - using namespace ::kodi::addon; - unsigned int size = static_cast(entries.size()); + const size_t size = entries.size(); const char** cEntries = static_cast(malloc(size * sizeof(const char**))); for (unsigned int i = 0; i < size; ++i) { cEntries[i] = entries[i].second.c_str(); } - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size); + int ret = kodi::dl::api.kodi_gui_dialogs_context_menu_open(heading.c_str(), cEntries, size); free(cEntries); return ret; } @@ -161,18 +159,16 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, /// fprintf(stderr, "Selected item is: %i\n", selected); /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, +inline int ATTR_DLL_LOCAL Show(const std::string& heading, const std::vector>& entries) { - using namespace ::kodi::addon; - unsigned int size = static_cast(entries.size()); + const size_t size = entries.size(); const char** cEntries = static_cast(malloc(size * sizeof(const char**))); for (unsigned int i = 0; i < size; ++i) { cEntries[i] = entries[i].second.c_str(); } - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size); + int ret = kodi::dl::api.kodi_gui_dialogs_context_menu_open(heading.c_str(), cEntries, size); free(cEntries); return ret; } diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h index c650483f1c423..10d5475d4019b 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h @@ -13,6 +13,8 @@ #ifdef __cplusplus +#include + namespace kodi { namespace gui @@ -55,7 +57,7 @@ namespace dialogs /// delete ext_progress; /// ~~~~~~~~~~~~~ /// -class ATTRIBUTE_HIDDEN CExtendedProgress +class ATTR_DLL_LOCAL CExtendedProgress { public: //============================================================================ @@ -66,9 +68,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// explicit CExtendedProgress(const std::string& title = "") { - using namespace ::kodi::addon; - m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->new_dialog( - CAddonBase::m_interface->toKodi->kodiBase, title.c_str()); + m_DialogHandle = kodi::dl::api.kodi_gui_dialogs_extended_progress_new_dialog(title.c_str()); if (!m_DialogHandle) kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CDialogExtendedProgress can't create window class from Kodi !!!"); @@ -81,10 +81,8 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// ~CExtendedProgress() { - using namespace ::kodi::addon; if (m_DialogHandle) - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->delete_dialog( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + kodi::dl::api.kodi_gui_dialogs_extended_progress_delete_dialog(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -96,16 +94,13 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// std::string Title() const { - using namespace ::kodi::addon; std::string text; - char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_title( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + char* strMsg = kodi::dl::api.kodi_gui_dialogs_extended_progress_get_title(m_DialogHandle); if (strMsg != nullptr) { if (std::strlen(strMsg)) text = strMsg; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - strMsg); + free(strMsg); } return text; } @@ -119,9 +114,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// void SetTitle(const std::string& title) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_title( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, title.c_str()); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_title(m_DialogHandle, title.c_str()); } //---------------------------------------------------------------------------- @@ -133,16 +126,13 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// std::string Text() const { - using namespace ::kodi::addon; std::string text; - char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_text( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + char* strMsg = kodi::dl::api.kodi_gui_dialogs_extended_progress_get_text(m_DialogHandle); if (strMsg != nullptr) { if (std::strlen(strMsg)) text = strMsg; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - strMsg); + free(strMsg); } return text; } @@ -156,9 +146,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// void SetText(const std::string& text) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_text( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, text.c_str()); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_text(m_DialogHandle, text.c_str()); } //---------------------------------------------------------------------------- @@ -168,24 +156,14 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// /// @return True if on end /// - bool IsFinished() const - { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->is_finished( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + bool IsFinished() const { return kodi::dl::api.kodi_gui_dialogs_extended_progress_is_finished(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress /// @brief Mark progress finished. /// - void MarkFinished() - { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->mark_finished( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + void MarkFinished() { kodi::dl::api.kodi_gui_dialogs_extended_progress_mark_finished(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ @@ -196,9 +174,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// float Percentage() const { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_percentage( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + return kodi::dl::api.kodi_gui_dialogs_extended_progress_get_percentage(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -210,9 +186,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// void SetPercentage(float percentage) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_percentage( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_percentage(m_DialogHandle, percentage); } //---------------------------------------------------------------------------- @@ -225,9 +199,7 @@ class ATTRIBUTE_HIDDEN CExtendedProgress /// void SetProgress(int currentItem, int itemCount) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_progress( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, currentItem, itemCount); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_progress(m_DialogHandle, currentItem, itemCount); } //---------------------------------------------------------------------------- diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h index 244c76cc9fca5..b2af30bee8b79 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h @@ -13,6 +13,9 @@ #ifdef __cplusplus +#include +#include + namespace kodi { namespace gui @@ -67,22 +70,19 @@ namespace FileBrowser /// fprintf(stderr, "Selected directory is : %s and was %s\n", directory.c_str(), ret ? "OK" : "Canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetDirectory(const std::string& shares, - const std::string& heading, - std::string& path, - bool writeOnly = false) +inline bool ATTR_DLL_LOCAL ShowAndGetDirectory(const std::string& shares, + const std::string& heading, + std::string& path, + bool writeOnly = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_directory( - CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), path.c_str(), - &retString, writeOnly); + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_directory( + shares.c_str(), heading.c_str(), path.c_str(), &retString, writeOnly); if (retString != nullptr) { if (std::strlen(retString)) path = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -102,24 +102,22 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetDirectory(const std::string& shares, /// handled as directories. /// @return False if selection becomes canceled /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetFile(const std::string& shares, - const std::string& mask, - const std::string& heading, - std::string& path, - bool useThumbs = false, - bool useFileDirectories = false) +inline bool ATTR_DLL_LOCAL ShowAndGetFile(const std::string& shares, + const std::string& mask, + const std::string& heading, + std::string& path, + bool useThumbs = false, + bool useFileDirectories = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file( - CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), mask.c_str(), heading.c_str(), - path.c_str(), &retString, useThumbs, useFileDirectories); + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_file( + shares.c_str(), mask.c_str(), heading.c_str(), path.c_str(), &retString, useThumbs, + useFileDirectories); if (retString != nullptr) { if (std::strlen(retString)) path = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -141,26 +139,23 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetFile(const std::string& shares, /// @param[in] singleList [opt] /// @return False if selection becomes canceled /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetFileFromDir(const std::string& directory, - const std::string& mask, - const std::string& heading, - std::string& path, - bool useThumbs = false, - bool useFileDirectories = false, - bool singleList = false) +inline bool ATTR_DLL_LOCAL ShowAndGetFileFromDir(const std::string& directory, + const std::string& mask, + const std::string& heading, + std::string& path, + bool useThumbs = false, + bool useFileDirectories = false, + bool singleList = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = - CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_from_dir( - CAddonBase::m_interface->toKodi->kodiBase, directory.c_str(), mask.c_str(), - heading.c_str(), path.c_str(), &retString, useThumbs, useFileDirectories, singleList); + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( + directory.c_str(), mask.c_str(), heading.c_str(), path.c_str(), &retString, useThumbs, + useFileDirectories, singleList); if (retString != nullptr) { if (std::strlen(retString)) path = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -179,25 +174,23 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetFileFromDir(const std::string& directory, /// handled as directories. /// @return False if selection becomes canceled. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetFileList(const std::string& shares, - const std::string& mask, - const std::string& heading, - std::vector& fileList, - bool useThumbs = false, - bool useFileDirectories = false) +inline bool ATTR_DLL_LOCAL ShowAndGetFileList(const std::string& shares, + const std::string& mask, + const std::string& heading, + std::vector& fileList, + bool useThumbs = false, + bool useFileDirectories = false) { - using namespace ::kodi::addon; char** list = nullptr; - unsigned int listSize = 0; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_list( - CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), mask.c_str(), heading.c_str(), - &list, &listSize, useThumbs, useFileDirectories); + size_t listSize = 0; + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_file_list(shares.c_str(), mask.c_str(), + heading.c_str(), &list, &listSize, + useThumbs, useFileDirectories); if (ret) { - for (unsigned int i = 0; i < listSize; ++i) + for (size_t i = 0; i < listSize; ++i) fileList.emplace_back(list[i]); - CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( - CAddonBase::m_interface->toKodi->kodiBase, &list, listSize); + kodi::dl::api.kodi_gui_dialogs_file_browser_clear_file_list(&list, listSize); } return ret; } @@ -215,22 +208,19 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetFileList(const std::string& shares, /// @param[in] type [opt] /// @return False if selection becomes canceled /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetSource(std::string& path, - bool allowNetworkShares, - const std::string& additionalShare = "", - const std::string& type = "") +inline bool ATTR_DLL_LOCAL ShowAndGetSource(std::string& path, + bool allowNetworkShares, + const std::string& additionalShare = "", + const std::string& type = "") { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_source( - CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), &retString, allowNetworkShares, - additionalShare.c_str(), type.c_str()); + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_source( + path.c_str(), &retString, allowNetworkShares, additionalShare.c_str(), type.c_str()); if (retString != nullptr) { if (std::strlen(retString)) path = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -245,21 +235,18 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetSource(std::string& path, /// @param[out] path Return value about selected image /// @return False if selection becomes canceled /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetImage(const std::string& shares, - const std::string& heading, - std::string& path) +inline bool ATTR_DLL_LOCAL ShowAndGetImage(const std::string& shares, + const std::string& heading, + std::string& path) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image( - CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), path.c_str(), - &retString); + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_image(shares.c_str(), heading.c_str(), + path.c_str(), &retString); if (retString != nullptr) { if (std::strlen(retString)) path = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -274,26 +261,26 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetImage(const std::string& shares, /// @param[out] file_list Return value about selected images /// @return False if selection becomes canceled /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetImageList(const std::string& shares, - const std::string& heading, - std::vector& file_list) +inline bool ATTR_DLL_LOCAL ShowAndGetImageList(const std::string& shares, + const std::string& heading, + std::vector& file_list) { - using namespace ::kodi::addon; char** list = nullptr; - unsigned int listSize = 0; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image_list( - CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), &list, &listSize); + size_t listSize = 0; + bool ret = kodi::dl::api.kodi_gui_dialogs_file_browser_show_and_get_image_list(shares.c_str(), heading.c_str(), + &list, &listSize); if (ret) { - for (unsigned int i = 0; i < listSize; ++i) + for (size_t i = 0; i < listSize; ++i) file_list.emplace_back(list[i]); - CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( - CAddonBase::m_interface->toKodi->kodiBase, &list, listSize); + kodi::dl::api.kodi_gui_dialogs_file_browser_clear_file_list(&list, listSize); } return ret; } //------------------------------------------------------------------------------ -}; // namespace FileBrowser + + +} /* namespace FileBrowser */ } /* namespace dialogs */ } /* namespace gui */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h index 710b7dd56312f..d56d6670a0c64 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h @@ -13,6 +13,8 @@ #ifdef __cplusplus +#include + namespace kodi { namespace gui @@ -71,23 +73,19 @@ namespace Keyboard /// text.c_str(), bRet ? "OK" : "Canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, - const std::string& heading, - bool allowEmptyResult, - bool hiddenInput = false, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetInput(std::string& text, + const std::string& heading, + bool allowEmptyResult, + bool hiddenInput = false, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = - CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input_with_head( - CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, heading.c_str(), - allowEmptyResult, hiddenInput, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_get_input_with_head( + text.c_str(), &retString, heading.c_str(), allowEmptyResult, hiddenInput, autoCloseMs); if (retString != nullptr) { text = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -107,20 +105,17 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, - bool allowEmptyResult, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetInput(std::string& text, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input( - CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, allowEmptyResult, - autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_get_input(text.c_str(), &retString, + allowEmptyResult, autoCloseMs); if (retString != nullptr) { text = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -140,22 +135,19 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, - const std::string& heading, - bool allowEmptyResult, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetNewPassword(std::string& newPassword, + const std::string& heading, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; + ; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard - ->show_and_get_new_password_with_head( - CAddonBase::m_interface->toKodi->kodiBase, newPassword.c_str(), &retString, - heading.c_str(), allowEmptyResult, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( + newPassword.c_str(), &retString, heading.c_str(), allowEmptyResult, autoCloseMs); if (retString != nullptr) { newPassword = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -173,18 +165,16 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetNewPassword(std::string& newPassword, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password( - CAddonBase::m_interface->toKodi->kodiBase, newPassword.c_str(), &retString, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_get_new_password(newPassword.c_str(), &retString, + autoCloseMs); if (retString != nullptr) { newPassword = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -246,22 +236,18 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, /// } /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, - const std::string& heading, - bool allowEmptyResult, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword, + const std::string& heading, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard - ->show_and_verify_new_password_with_head(CAddonBase::m_interface->toKodi->kodiBase, - &retString, heading.c_str(), - allowEmptyResult, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( + &retString, heading.c_str(), allowEmptyResult, autoCloseMs); if (retString != nullptr) { newPassword = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -279,19 +265,15 @@ inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = - CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password( - CAddonBase::m_interface->toKodi->kodiBase, &retString, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_verify_new_password(&retString, autoCloseMs); if (retString != nullptr) { newPassword = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -311,21 +293,18 @@ inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, /// @return 0 if successful display and user input. 1 if unsuccessful input. /// -1 if no user input or canceled editing. /// -inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(std::string& password, - const std::string& heading, - int retries, - unsigned int autoCloseMs = 0) +inline int ATTR_DLL_LOCAL ShowAndVerifyPassword(std::string& password, + const std::string& heading, + int retries, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_password( - CAddonBase::m_interface->toKodi->kodiBase, password.c_str(), &retString, heading.c_str(), - retries, autoCloseMs); + int ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_verify_password( + password.c_str(), &retString, heading.c_str(), retries, autoCloseMs); if (retString != nullptr) { password = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -346,19 +325,17 @@ inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(std::string& password, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetFilter(std::string& text, - bool searching, - unsigned int autoCloseMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetFilter(std::string& text, + bool searching, + unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_filter( - CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, searching, autoCloseMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_get_filter(text.c_str(), &retString, searching, + autoCloseMs); if (retString != nullptr) { text = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -373,12 +350,10 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetFilter(std::string& text, /// @return true if successful done, false if unsuccessful or keyboard not /// present. /// -inline bool ATTRIBUTE_HIDDEN SendTextToActiveKeyboard(const std::string& text, - bool closeKeyboard = false) +inline bool ATTR_DLL_LOCAL SendTextToActiveKeyboard(const std::string& text, + bool closeKeyboard = false) { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->send_text_to_active_keyboard( - CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), closeKeyboard); + return kodi::dl::api.kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(text.c_str(), closeKeyboard); } //------------------------------------------------------------------------------ @@ -388,11 +363,9 @@ inline bool ATTRIBUTE_HIDDEN SendTextToActiveKeyboard(const std::string& text, /// /// @return true if keyboard present, false if not present /// -inline bool ATTRIBUTE_HIDDEN IsKeyboardActivated() +inline bool ATTR_DLL_LOCAL IsKeyboardActivated() { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->is_keyboard_activated( - CAddonBase::m_interface->toKodi->kodiBase); + return kodi::dl::api.kodi_gui_dialogs_keyboard_is_keyboard_activated(); } //------------------------------------------------------------------------------ }; // namespace Keyboard diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h index 835a8d4ccdde0..8d5dfc88db4e8 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h @@ -47,16 +47,14 @@ namespace Numeric /// @return true if successful display and user input entry/re-entry. false if /// unsuccessful display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword) +inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword) { - using namespace ::kodi::addon; char* pw = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password( - CAddonBase::m_interface->toKodi->kodiBase, &pw); + bool ret = kodi::dl::api.kodi_gui_dialogs_numeric_show_and_verify_new_password(&pw); if (pw != nullptr) { newPassword = pw; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, pw); + free(pw); } return ret; } @@ -121,13 +119,12 @@ inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword) /// } /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(const std::string& password, - const std::string& heading, - int retries) +inline int ATTR_DLL_LOCAL ShowAndVerifyPassword(const std::string& password, + const std::string& heading, + int retries) { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_password( - CAddonBase::m_interface->toKodi->kodiBase, password.c_str(), heading.c_str(), retries); + return kodi::dl::api.kodi_gui_dialogs_numeric_show_and_verify_password(password.c_str(), heading.c_str(), + retries); } //------------------------------------------------------------------------------ @@ -142,20 +139,17 @@ inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(const std::string& password, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndVerifyInput(std::string& toVerify, - const std::string& heading, - bool verifyInput) +inline bool ATTR_DLL_LOCAL ShowAndVerifyInput(std::string& toVerify, + const std::string& heading, + bool verifyInput) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_input( - CAddonBase::m_interface->toKodi->kodiBase, toVerify.c_str(), &retString, heading.c_str(), - verifyInput); + bool ret = kodi::dl::api.kodi_gui_dialogs_numeric_show_and_verify_input(toVerify.c_str(), &retString, + heading.c_str(), verifyInput); if (retString != nullptr) { toVerify = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -191,11 +185,9 @@ inline bool ATTRIBUTE_HIDDEN ShowAndVerifyInput(std::string& toVerify, /// printf("Selected time it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetTime(tm& time, const std::string& heading) +inline bool ATTR_DLL_LOCAL ShowAndGetTime(tm& time, const std::string& heading) { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_time( - CAddonBase::m_interface->toKodi->kodiBase, &time, heading.c_str()); + return kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_time(&time, heading.c_str()); } //------------------------------------------------------------------------------ @@ -229,11 +221,9 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetTime(tm& time, const std::string& heading /// printf("Selected date it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetDate(tm& date, const std::string& heading) +inline bool ATTR_DLL_LOCAL ShowAndGetDate(tm& date, const std::string& heading) { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_date( - CAddonBase::m_interface->toKodi->kodiBase, &date, heading.c_str()); + return kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_date(&date, heading.c_str()); } //------------------------------------------------------------------------------ @@ -247,17 +237,15 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetDate(tm& date, const std::string& heading /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetIPAddress(std::string& ipAddress, const std::string& heading) +inline bool ATTR_DLL_LOCAL ShowAndGetIPAddress(std::string& ipAddress, const std::string& heading) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_ip_address( - CAddonBase::m_interface->toKodi->kodiBase, ipAddress.c_str(), &retString, heading.c_str()); + bool ret = kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_ip_address(ipAddress.c_str(), &retString, + heading.c_str()); if (retString != nullptr) { ipAddress = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -292,20 +280,17 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetIPAddress(std::string& ipAddress, const s /// strtoull(number.c_str(), nullptr, 0), bRet ? "OK" : "Canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetNumber(std::string& input, - const std::string& heading, - unsigned int autoCloseTimeoutMs = 0) +inline bool ATTR_DLL_LOCAL ShowAndGetNumber(std::string& input, + const std::string& heading, + unsigned int autoCloseTimeoutMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_number( - CAddonBase::m_interface->toKodi->kodiBase, input.c_str(), &retString, heading.c_str(), - autoCloseTimeoutMs); + bool ret = kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_number(input.c_str(), &retString, + heading.c_str(), autoCloseTimeoutMs); if (retString != nullptr) { input = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -321,17 +306,15 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetNumber(std::string& input, /// @return true if successful display and user input. false if unsuccessful /// display, no user input, or canceled editing. /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetSeconds(std::string& time, const std::string& heading) +inline bool ATTR_DLL_LOCAL ShowAndGetSeconds(std::string& time, const std::string& heading) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_seconds( - CAddonBase::m_interface->toKodi->kodiBase, time.c_str(), &retString, heading.c_str()); + bool ret = + kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_seconds(time.c_str(), &retString, heading.c_str()); if (retString != nullptr) { time = retString; - CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h index 747ab9d3fbe02..3e70624905ad8 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h @@ -52,11 +52,10 @@ namespace OK /// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!\nI'm a call from add-on\n :) :D"); /// ~~~~~~~~~~~~~ /// -inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, const std::string& text) +inline void ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& text) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_single_text( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str()); + kodi::dl::api.kodi_gui_dialogs_ok_show_and_get_input_single_text( + heading.c_str(), text.c_str()); } //------------------------------------------------------------------------------ @@ -80,14 +79,13 @@ inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, const s /// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!", "I'm a call from add-on", " :) :D"); /// ~~~~~~~~~~~~~ /// -inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, +inline void ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& line0, const std::string& line1, const std::string& line2) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_line_text( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), + kodi::dl::api.kodi_gui_dialogs_ok_show_and_get_input_line_text( + heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str()); } //------------------------------------------------------------------------------ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h index d242a565ee404..09ac5d5a01c7b 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h @@ -49,7 +49,7 @@ namespace dialogs /// delete progress; /// ~~~~~~~~~~~~~ /// -class ATTRIBUTE_HIDDEN CProgress +class ATTR_DLL_LOCAL CProgress { public: //============================================================================ @@ -58,9 +58,7 @@ class ATTRIBUTE_HIDDEN CProgress /// CProgress() { - using namespace ::kodi::addon; - m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->new_dialog( - CAddonBase::m_interface->toKodi->kodiBase); + m_DialogHandle = kodi::dl::api.kodi_gui_dialogs_progress_new_dialog(); if (!m_DialogHandle) kodi::Log(ADDON_LOG_FATAL, "kodi::gui::dialogs::CProgress can't create window class from Kodi !!!"); @@ -73,10 +71,8 @@ class ATTRIBUTE_HIDDEN CProgress /// ~CProgress() { - using namespace ::kodi::addon; if (m_DialogHandle) - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->delete_dialog( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + kodi::dl::api.kodi_gui_dialogs_progress_delete_dialog(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -84,12 +80,7 @@ class ATTRIBUTE_HIDDEN CProgress /// @ingroup cpp_kodi_gui_dialogs_CProgress /// @brief To open the dialog /// - void Open() - { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->open( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + void Open() { kodi::dl::api.kodi_gui_dialogs_progress_open(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ @@ -100,9 +91,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void SetHeading(const std::string& heading) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_heading( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, heading.c_str()); + kodi::dl::api.kodi_gui_dialogs_progress_set_heading(m_DialogHandle, heading.c_str()); } //---------------------------------------------------------------------------- @@ -115,9 +104,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void SetLine(unsigned int iLine, const std::string& line) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_line( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, iLine, line.c_str()); + kodi::dl::api.kodi_gui_dialogs_progress_set_line(m_DialogHandle, iLine, line.c_str()); } //---------------------------------------------------------------------------- @@ -129,9 +116,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void SetCanCancel(bool canCancel) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_can_cancel( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, canCancel); + kodi::dl::api.kodi_gui_dialogs_progress_set_can_cancel(m_DialogHandle, canCancel); } //---------------------------------------------------------------------------- @@ -141,12 +126,7 @@ class ATTRIBUTE_HIDDEN CProgress /// /// @return True if canceled /// - bool IsCanceled() const - { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->is_canceled( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + bool IsCanceled() const { return kodi::dl::api.kodi_gui_dialogs_progress_is_canceled(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ @@ -157,9 +137,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void SetPercentage(int percentage) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_percentage( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + kodi::dl::api.kodi_gui_dialogs_progress_set_percentage(m_DialogHandle, percentage); } //---------------------------------------------------------------------------- @@ -169,12 +147,7 @@ class ATTRIBUTE_HIDDEN CProgress /// /// @return Current Position used from 0 to 100 /// - int GetPercentage() const - { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->get_percentage( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + int GetPercentage() const { return kodi::dl::api.kodi_gui_dialogs_progress_get_percentage(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ @@ -185,9 +158,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void ShowProgressBar(bool onOff) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->show_progress_bar( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, onOff); + kodi::dl::api.kodi_gui_dialogs_progress_show_progress_bar(m_DialogHandle, onOff); } //---------------------------------------------------------------------------- @@ -197,12 +168,7 @@ class ATTRIBUTE_HIDDEN CProgress /// /// @param[in] max Biggest usable position to use /// - void SetProgressMax(int max) - { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_max( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, max); - } + void SetProgressMax(int max) { kodi::dl::api.kodi_gui_dialogs_progress_set_progress_max(m_DialogHandle, max); } //---------------------------------------------------------------------------- //============================================================================ @@ -213,9 +179,7 @@ class ATTRIBUTE_HIDDEN CProgress /// void SetProgressAdvance(int steps = 1) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_advance( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, steps); + kodi::dl::api.kodi_gui_dialogs_progress_set_progress_advance(m_DialogHandle, steps); } //---------------------------------------------------------------------------- @@ -225,12 +189,7 @@ class ATTRIBUTE_HIDDEN CProgress /// /// @return True if aborted /// - bool Abort() - { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->abort( - CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + bool Abort() { return kodi::dl::api.kodi_gui_dialogs_progress_abort(m_DialogHandle); } //---------------------------------------------------------------------------- private: diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h index 9b1923e94f1de..5bd8efe9b6a58 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h @@ -13,6 +13,8 @@ #ifdef __cplusplus +#include + namespace kodi { namespace gui @@ -103,10 +105,10 @@ namespace Select /// fprintf(stderr, "Selected item is: %i\n", selected); /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, - const std::vector& entries, - int selected = -1, - unsigned int autoclose = 0) +inline int ATTR_DLL_LOCAL Show(const std::string& heading, + const std::vector& entries, + int selected = -1, + unsigned int autoclose = 0) { using namespace ::kodi::addon; unsigned int size = static_cast(entries.size()); @@ -115,9 +117,7 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, { cEntries[i] = entries[i].c_str(); } - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size, selected, - autoclose); + int ret = kodi::dl::api.kodi_gui_dialogs_select_open(heading.c_str(), cEntries, size, selected, autoclose); free(cEntries); return ret; } @@ -162,12 +162,11 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, /// fprintf(stderr, "Selected item is: %i\n", selected); /// ~~~~~~~~~~~~~ /// -inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, - std::vector& entries, - int selected = -1, - unsigned int autoclose = 0) +inline int ATTR_DLL_LOCAL Show(const std::string& heading, + std::vector& entries, + int selected = -1, + unsigned int autoclose = 0) { - using namespace ::kodi::addon; unsigned int size = static_cast(entries.size()); const char** cEntries = static_cast(malloc(size * sizeof(const char*))); for (unsigned int i = 0; i < size; ++i) @@ -176,9 +175,7 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, if (selected == -1 && entries[i].selected) selected = i; } - int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size, selected, - autoclose); + int ret = kodi::dl::api.kodi_gui_dialogs_select_open(heading.c_str(), cEntries, size, selected, autoclose); if (ret >= 0) { entries[ret].selected = true; @@ -230,24 +227,23 @@ inline int ATTRIBUTE_HIDDEN Show(const std::string& heading, /// } /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowMultiSelect(const std::string& heading, - std::vector& entries, - int autoclose = 0) +inline bool ATTR_DLL_LOCAL +ShowMultiSelect(const std::string& heading, + std::vector& entries, + int autoclose = 0) { - using namespace ::kodi::addon; unsigned int size = static_cast(entries.size()); const char** cEntryIDs = static_cast(malloc(size * sizeof(const char*))); const char** cEntryNames = static_cast(malloc(size * sizeof(const char*))); - bool* cEntriesSelected = static_cast(malloc(size * sizeof(bool))); + uint8_t* cEntriesSelected = static_cast(malloc(size * sizeof(uint8_t))); for (unsigned int i = 0; i < size; ++i) { cEntryIDs[i] = entries[i].id.c_str(); cEntryNames[i] = entries[i].name.c_str(); cEntriesSelected[i] = entries[i].selected; } - bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open_multi_select( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntryIDs, cEntryNames, - cEntriesSelected, size, autoclose); + bool ret = kodi::dl::api.kodi_gui_dialogs_select_open_multi_select(heading.c_str(), cEntryIDs, cEntryNames, + cEntriesSelected, size, autoclose); if (ret) { for (unsigned int i = 0; i < size; ++i) diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h index dc89740a023e9..94d437732eb61 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h @@ -92,11 +92,9 @@ namespace TextViewer /// "interspersed renderings from classical composers.\n"); /// ~~~~~~~~~~~~~ /// -inline void ATTRIBUTE_HIDDEN Show(const std::string& heading, const std::string& text) +inline void ATTR_DLL_LOCAL Show(const std::string& heading, const std::string& text) { - using namespace ::kodi::addon; - CAddonBase::m_interface->toKodi->kodi_gui->dialogTextViewer->open( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str()); + kodi::dl::api.kodi_gui_dialogs_text_viewer_show(heading.c_str(), text.c_str()); } //------------------------------------------------------------------------------ }; // namespace TextViewer diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h index 6e6e069ea00f2..3e4f6624113ee 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h @@ -71,16 +71,14 @@ namespace YesNo /// canceled ? "canceled" : "not canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, - const std::string& text, - bool& canceled, - const std::string& noLabel = "", - const std::string& yesLabel = "") +inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, + const std::string& text, + bool& canceled, + const std::string& noLabel = "", + const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_single_text( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str(), &canceled, - noLabel.c_str(), yesLabel.c_str()); + return kodi::dl::api.kodi_gui_dialogs_yesno_show_and_get_input_single_text( + heading.c_str(), text.c_str(), &canceled, noLabel.c_str(), yesLabel.c_str()); } //------------------------------------------------------------------------------ @@ -114,17 +112,16 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, /// ret ? "yes" : "no"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, - const std::string& line0, - const std::string& line1, - const std::string& line2, - const std::string& noLabel = "", - const std::string& yesLabel = "") +inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, + const std::string& line0, + const std::string& line1, + const std::string& line2, + const std::string& noLabel = "", + const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_text( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), - line2.c_str(), noLabel.c_str(), yesLabel.c_str()); + return kodi::dl::api.kodi_gui_dialogs_yesno_show_and_get_input_line_text(heading.c_str(), line0.c_str(), + line1.c_str(), line2.c_str(), + noLabel.c_str(), yesLabel.c_str()); } //------------------------------------------------------------------------------ @@ -163,19 +160,17 @@ inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, /// canceled ? "canceled" : "not canceled"); /// ~~~~~~~~~~~~~ /// -inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, - const std::string& line0, - const std::string& line1, - const std::string& line2, - bool& canceled, - const std::string& noLabel = "", - const std::string& yesLabel = "") +inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, + const std::string& line0, + const std::string& line1, + const std::string& line2, + bool& canceled, + const std::string& noLabel = "", + const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo - ->show_and_get_input_line_button_text( - CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), - line2.c_str(), &canceled, noLabel.c_str(), yesLabel.c_str()); + return kodi::dl::api.kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( + heading.c_str(), line0.c_str(), line1.c_str(), line2.c_str(), &canceled, noLabel.c_str(), + yesLabel.c_str()); } //------------------------------------------------------------------------------ }; // namespace YesNo diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt index 844902d2e20c0..36b823cbde431 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt @@ -1,7 +1,12 @@ -set(HEADERS GL.h - GLonDX.h - Shader.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_gui_gl) +set(HEADERS + GL.h + GLonDX.h + Shader.h +) + +if(HEADERS) + core_add_devkit_header(kodi_gui_gl) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h index 5d4e3841872f8..eebcbb3f8c90a 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h @@ -17,8 +17,8 @@ #include #include #include -#include -#include +#include "../../AddonBase.h" +#include "../../gui/General.h" #include #pragma comment(lib, "d3dcompiler.lib") diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h index a088f1bf87d1c..ab2435e0d5e02 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h @@ -16,8 +16,8 @@ #include #include -#include -#include +#include "../../AddonBase.h" +#include "../../Filesystem.h" #define LOG_SIZE 1024 #define GLchar char @@ -31,7 +31,7 @@ namespace gl //======================================================================== /// CShader - base class -class ATTRIBUTE_HIDDEN CShader +class ATTR_DLL_LOCAL CShader { public: CShader() = default; @@ -51,7 +51,7 @@ class ATTRIBUTE_HIDDEN CShader file.c_str()); return false; } - size_t len = source.Read(buffer, sizeof(buffer)); + size_t len = source.Read(reinterpret_cast(buffer), sizeof(buffer)); m_source.assign(buffer); m_source[len] = 0; source.Close(); @@ -69,7 +69,7 @@ class ATTRIBUTE_HIDDEN CShader //======================================================================== /// CVertexShader -class ATTRIBUTE_HIDDEN CVertexShader : public CShader +class ATTR_DLL_LOCAL CVertexShader : public CShader { public: CVertexShader() = default; @@ -130,7 +130,7 @@ class ATTRIBUTE_HIDDEN CVertexShader : public CShader //======================================================================== /// CPixelShader -class ATTRIBUTE_HIDDEN CPixelShader : public CShader +class ATTR_DLL_LOCAL CPixelShader : public CShader { public: CPixelShader() = default; @@ -208,7 +208,7 @@ class ATTRIBUTE_HIDDEN CPixelShader : public CShader /// #include /// ... /// -/// class ATTRIBUTE_HIDDEN CExample +/// class ATTR_DLL_LOCAL CExample /// : ..., /// public kodi::gui::gl::CShaderProgram /// { @@ -273,7 +273,7 @@ class ATTRIBUTE_HIDDEN CPixelShader : public CShader /// ADDONCREATOR(CExample); /// ~~~~~~~~~~~~~ /// -class ATTRIBUTE_HIDDEN CShaderProgram +class ATTR_DLL_LOCAL CShaderProgram { public: //========================================================================== diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h deleted file mode 100644 index 4c816a43090da..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../c-api/gui/input/action_ids.h" diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt deleted file mode 100644 index d5769749ff45e..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(HEADERS ActionIDs.h) - -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_gui_input) -endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h index b08f8989b927a..87139de2bc7af 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h @@ -16,7 +16,7 @@ namespace kodi { namespace gui { -struct ATTRIBUTE_HIDDEN IRenderHelper +struct ATTR_DLL_LOCAL IRenderHelper { virtual ~IRenderHelper() = default; virtual bool Init() = 0; @@ -36,7 +36,7 @@ namespace kodi { namespace gui { -struct ATTRIBUTE_HIDDEN CRenderHelperStub : public IRenderHelper +struct ATTR_DLL_LOCAL CRenderHelperStub : public IRenderHelper { bool Init() override { return true; } void Begin() override {} @@ -61,17 +61,17 @@ namespace gui * * Function defines here and not in CAddonBase because of a hen and egg problem. */ -inline std::shared_ptr ATTRIBUTE_HIDDEN GetRenderHelper() +inline std::shared_ptr ATTR_DLL_LOCAL GetRenderHelper() { using namespace ::kodi::addon; - if (static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper) - return static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper; + if (static_cast(CAddonBase::ifc.m_addonBase)->m_renderHelper) + return static_cast(CAddonBase::ifc.m_addonBase)->m_renderHelper; std::shared_ptr renderHelper(new CRenderHelper()); if (!renderHelper->Init()) return nullptr; - static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper = + static_cast(CAddonBase::ifc.m_addonBase)->m_renderHelper = renderHelper; // Hold on base for other types return renderHelper; } diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/platform/android/System.h b/xbmc/addons/kodi-dev-kit/include/kodi/platform/android/System.h deleted file mode 100644 index b25435261b2f8..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/platform/android/System.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2005-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "../../AddonBase.h" -#include "../../c-api/platform/android/system.h" - -#ifdef __cplusplus -namespace kodi -{ -namespace platform -{ - -//============================================================================== -/// @defgroup cpp_kodi_platform_CInterfaceAndroidSystem class CInterfaceAndroidSystem -/// @ingroup cpp_kodi_platform -/// @brief **Android platform specific functions**\n -/// C++ class to query Android specific things in Kodi. -/// -/// It has the header is @ref System.h "#include ". -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// #if defined(ANDROID) -/// kodi::platform::CInterfaceAndroidSystem system; -/// if (system.GetSDKVersion() >= 23) -/// { -/// ... -/// } -/// #endif -/// ~~~~~~~~~~~~~ -/// -class ATTRIBUTE_HIDDEN CInterfaceAndroidSystem -{ -public: - CInterfaceAndroidSystem() - : m_interface(static_cast( - GetInterface(INTERFACE_ANDROID_SYSTEM_NAME, INTERFACE_ANDROID_SYSTEM_VERSION))) - { - } - - //============================================================================ - /// @ingroup cpp_kodi_platform_CInterfaceAndroidSystem - /// @brief Request an JNI env pointer for the calling thread. - /// - /// JNI env has to be controlled by kodi because of the underlying - /// threading concep. - /// - /// @return JNI env pointer for the calling thread - /// - inline void* GetJNIEnv() - { - if (m_interface) - return m_interface->get_jni_env(); - - return nullptr; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_platform_CInterfaceAndroidSystem - /// @brief Request the android sdk version to e.g. initialize `JNIBase`. - /// - /// @return Android SDK version - /// - inline int GetSDKVersion() - { - if (m_interface) - return m_interface->get_sdk_version(); - - return 0; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_platform_CInterfaceAndroidSystem - /// @brief Request the android main class name e.g. `org.xbmc.kodi`. - /// - /// @return package class name - /// - inline std::string GetClassName() - { - if (m_interface) - return m_interface->get_class_name(); - - return std::string(); - } - //---------------------------------------------------------------------------- - -private: - AddonToKodiFuncTable_android_system* m_interface; -}; -//------------------------------------------------------------------------------ - -} /* namespace platform */ -} /* namespace kodi */ -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/tools/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/tools/CMakeLists.txt index 16b83cb1595e7..e2f1f6c35c70f 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/tools/CMakeLists.txt @@ -1,9 +1,11 @@ -set(HEADERS DllHelper.h - EndTime.h - StringUtils.h - Thread.h - Timer.h) +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. -if(NOT ENABLE_STATIC_LIBS) - core_add_library(addons_kodi-dev-kit_include_kodi_tools) +set(HEADERS + DllHelper.h + StringUtils.h +) + +if(HEADERS) + core_add_devkit_header(kodi_tools) endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h b/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h index 0726c396fa2c6..97603cb9a6273 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h @@ -13,8 +13,9 @@ #include #include -#include -#include +#include "../AddonBase.h" +#include "../General.h" +#include "../Filesystem.h" //============================================================================== /// @ingroup cpp_kodi_tools_CDllHelper @@ -89,7 +90,7 @@ namespace tools /// ~~~~~~~~~~~~~ /// ///@{ -class ATTRIBUTE_HIDDEN CDllHelper +class ATTR_DLL_LOCAL CDllHelper { public: //============================================================================ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/tools/EndTime.h b/xbmc/addons/kodi-dev-kit/include/kodi/tools/EndTime.h deleted file mode 100644 index 14983faaaf563..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/EndTime.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSE.md for more information. - */ - -#pragma once - -#ifdef __cplusplus - -#include - -namespace kodi -{ -namespace tools -{ - -//============================================================================== -/// @defgroup cpp_kodi_tools_CEndTime class CEndTime -/// @ingroup cpp_kodi_tools -/// @brief **Timeout check**\n -/// Class which makes it easy to check if a specified amount of time has passed. -/// -/// This code uses the support of platform-independent chrono system introduced -/// with C++11. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class ATTRIBUTE_HIDDEN CExample -/// { -/// public: -/// CExample() -/// { -/// TimerCall(); -/// } -/// -/// void TimerCall() -/// { -/// fprintf(stderr, "Hello World\n"); -/// CEndTime timer(1000); -/// -/// while (timer.MillisLeft()) -/// { -/// if (timer.IsTimePast()) -/// { -/// fprintf(stderr, "We timed out!\n"); -/// } -/// std::this_thread::sleep_for(std::chrono::milliseconds(10)); -/// } -/// } -/// -/// }; -/// ~~~~~~~~~~~~~ -/// -///@{ -class CEndTime -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Class constructor with no time to expiry set - /// - inline CEndTime() = default; - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Class constructor to set future time when timer has expired - /// - /// @param[in] millisecondsIntoTheFuture the time in the future we cosider this timer as expired - /// - inline explicit CEndTime(unsigned int millisecondsIntoTheFuture) - : m_startTime(std::chrono::system_clock::now().time_since_epoch()), - m_totalWaitTime(std::chrono::milliseconds(millisecondsIntoTheFuture)) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Set the time in the future we cosider this timer as expired - /// - /// @param[in] millisecondsIntoTheFuture the time in the future we cosider this timer as expired - /// - inline void Set(unsigned int millisecondsIntoTheFuture) - { - using namespace std::chrono; - - m_startTime = system_clock::now().time_since_epoch(); - m_totalWaitTime = milliseconds(millisecondsIntoTheFuture); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Check if the expiry time has been reached - /// - /// @return True if the expiry amount of time has past, false otherwise - /// - inline bool IsTimePast() const - { - using namespace std::chrono; - - // timer is infinite - if (m_totalWaitTime.count() == std::numeric_limits::max()) - return false; - - if (m_totalWaitTime.count() == 0) - return true; - else - return (system_clock::now().time_since_epoch() - m_startTime) >= m_totalWaitTime; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief The amount of time left till this timer expires - /// - /// @return 0 if the expiry amount of time has past, the numbe rof milliseconds remaining otherwise - /// - inline unsigned int MillisLeft() const - { - using namespace std::chrono; - - // timer is infinite - if (m_totalWaitTime.count() == std::numeric_limits::max()) - return std::numeric_limits::max(); - - if (m_totalWaitTime.count() == 0) - return 0; - - auto elapsed = system_clock::now().time_since_epoch() - m_startTime; - - auto timeWaitedAlready = duration_cast(elapsed).count(); - - if (timeWaitedAlready >= m_totalWaitTime.count()) - return 0; - - return static_cast(m_totalWaitTime.count() - timeWaitedAlready); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Consider this timer expired - /// - inline void SetExpired() - { - using namespace std::chrono; - m_totalWaitTime = milliseconds(0); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Set this timer as never expiring - /// - inline void SetInfinite() - { - using namespace std::chrono; - m_totalWaitTime = milliseconds(std::numeric_limits::max()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Check if the timer has been set to infinite expiry - /// - /// @return True if the expiry has been set as infinite, false otherwise - /// - inline bool IsInfinite(void) const - { - return (m_totalWaitTime.count() == std::numeric_limits::max()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Get the initial timeout value this timer had - /// - /// @return The initial expiry amount of time this timer had in milliseconds - /// - inline unsigned int GetInitialTimeoutValue(void) const - { - auto value = std::chrono::duration_cast(m_totalWaitTime); - return static_cast(value.count()); - } - - //============================================================================ - /// @ingroup cpp_kodi_tools_CEndTime - /// @brief Get the time this timer started - /// - /// @return The time this timer started in milliseconds since epoch - /// - inline uint64_t GetStartTime(void) const - { - auto value = std::chrono::duration_cast(m_startTime); - return value.count(); - } - //---------------------------------------------------------------------------- - -private: - std::chrono::system_clock::duration m_startTime; - std::chrono::system_clock::duration m_totalWaitTime; -}; - -} /* namespace tools */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/tools/Thread.h b/xbmc/addons/kodi-dev-kit/include/kodi/tools/Thread.h deleted file mode 100644 index 4cae13ec2b019..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/Thread.h +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#ifdef __cplusplus - -#include "../General.h" - -#include -#include -#include -#include -#include - -namespace kodi -{ -namespace tools -{ - -//============================================================================== -/// @defgroup cpp_kodi_tools_CThread class CThread -/// @ingroup cpp_kodi_tools -/// @brief **Helper class to represent threads of execution**\n -/// An execution thread is a sequence of instructions that can run concurrently -/// with other such sequences in multithreaded environments while sharing the -/// same address space. -/// -/// Is intended to reduce any code work of C++ on addons and to have them faster -/// to use. -/// -/// His code uses the support of platform-independent thread system introduced -/// with C++11. -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// #include -/// -/// class ATTRIBUTE_HIDDEN CTestAddon -/// : public kodi::addon::CAddonBase, -/// public kodi::tools::CThread -/// { -/// public: -/// CTestAddon() = default; -/// -/// ADDON_STATUS Create() override; -/// -/// void Process() override; -/// }; -/// -/// ADDON_STATUS CTestAddon::Create() -/// { -/// kodi::Log(ADDON_LOG_INFO, "Starting thread"); -/// CreateThread(); -/// -/// Sleep(4000); -/// -/// kodi::Log(ADDON_LOG_INFO, "Stopping thread"); -/// // This added as example and also becomes stopped by class destructor -/// StopThread(); -/// -/// return ADDON_STATUS_OK; -/// } -/// -/// void CTestAddon::Process() -/// { -/// kodi::Log(ADDON_LOG_INFO, "Thread started"); -/// -/// while (!m_threadStop) -/// { -/// kodi::Log(ADDON_LOG_INFO, "Hello World"); -/// Sleep(1000); -/// } -/// -/// kodi::Log(ADDON_LOG_INFO, "Thread ended"); -/// } -/// -/// ADDONCREATOR(CTestAddon) -/// ~~~~~~~~~~~~~ -/// -///@{ -class CThread -{ -public: - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Class constructor. - /// - CThread() : m_threadStop(false) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Class destructor. - /// - virtual ~CThread() - { - StopThread(); - if (m_thread != nullptr) - { - m_thread->detach(); - delete m_thread; - } - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Check auto delete is enabled on this thread class. - /// - /// @return true if auto delete is used, false otherwise - /// - bool IsAutoDelete() const { return m_autoDelete; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Check caller is on this running thread. - /// - /// @return true if called from thread inside the class, false if from another - /// thread - /// - bool IsCurrentThread() const { return m_threadId == std::this_thread::get_id(); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Check thread inside this class is running and active. - /// - /// @note This function should be used from outside and not within process to - /// check thread is active. Use use atomic bool @ref m_threadStop for this. - /// - /// @return true if running, false if not - /// - bool IsRunning() const - { - if (m_thread != nullptr) - { - // it's possible that the thread exited on it's own without a call to StopThread. If so then - // the promise should be fulfilled. - std::future_status stat = m_future.wait_for(std::chrono::milliseconds(0)); - // a status of 'ready' means the future contains the value so the thread has exited - // since the thread can't exit without setting the future. - if (stat == std::future_status::ready) // this is an indication the thread has exited. - return false; - return true; // otherwise the thread is still active. - } - else - return false; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Create a new thread defined by this class on child. - /// - /// This starts then @ref Process() where is available on the child by addon. - /// - /// @param[in] autoDelete To set thread to delete itself after end, default is - /// false - /// - void CreateThread(bool autoDelete = false) - { - if (m_thread != nullptr) - { - // if the thread exited on it's own, without a call to StopThread, then we can get here - // incorrectly. We should be able to determine this by checking the promise. - std::future_status stat = m_future.wait_for(std::chrono::milliseconds(0)); - // a status of 'ready' means the future contains the value so the thread has exited - // since the thread can't exit without setting the future. - if (stat == std::future_status::ready) // this is an indication the thread has exited. - StopThread(true); // so let's just clean up - else - { // otherwise we have a problem. - kodi::Log(ADDON_LOG_FATAL, "%s - fatal error creating thread - old thread id not null", - __func__); - exit(1); - } - } - - m_autoDelete = autoDelete; - m_threadStop = false; - m_startEvent.notify_all(); - m_stopEvent.notify_all(); - - std::promise prom; - m_future = prom.get_future(); - - { - // The std::thread internals must be set prior to the lambda doing - // any work. This will cause the lambda to wait until m_thread - // is fully initialized. Interestingly, using a std::atomic doesn't - // have the appropriate memory barrier behavior to accomplish the - // same thing so a full system mutex needs to be used. - std::unique_lock lock(m_threadMutex); - m_thread = new std::thread( - [](CThread* thread, std::promise promise) { - try - { - { - // Wait for the pThread->m_thread internals to be set. Otherwise we could - // get to a place where we're reading, say, the thread id inside this - // lambda's call stack prior to the thread that kicked off this lambda - // having it set. Once this lock is released, the CThread::Create function - // that kicked this off is done so everything should be set. - std::unique_lock lock(thread->m_threadMutex); - } - - thread->m_threadId = std::this_thread::get_id(); - std::stringstream ss; - ss << thread->m_threadId; - std::string id = ss.str(); - bool autodelete = thread->m_autoDelete; - - kodi::Log(ADDON_LOG_DEBUG, "Thread %s start, auto delete: %s", id.c_str(), - (autodelete ? "true" : "false")); - - thread->m_running = true; - thread->m_startEvent.notify_one(); - - thread->Process(); - - if (autodelete) - { - kodi::Log(ADDON_LOG_DEBUG, "Thread %s terminating (autodelete)", id.c_str()); - delete thread; - thread = nullptr; - } - else - kodi::Log(ADDON_LOG_DEBUG, "Thread %s terminating", id.c_str()); - } - catch (const std::exception& e) - { - kodi::Log(ADDON_LOG_DEBUG, "Thread Terminating with Exception: %s", e.what()); - } - catch (...) - { - kodi::Log(ADDON_LOG_DEBUG, "Thread Terminating with Exception"); - } - - promise.set_value(true); - }, - this, std::move(prom)); - - m_startEvent.wait(lock); - } - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Stop a running thread. - /// - /// @param[in] wait As true (default) to wait until thread is finished and - /// stopped, as false the function return directly and thread - /// becomes independently stopped. - /// - void StopThread(bool wait = true) - { - std::unique_lock lock(m_threadMutex); - - if (m_threadStop) - return; - - if (m_thread && !m_running) - m_startEvent.wait(lock); - m_running = false; - m_threadStop = true; - m_stopEvent.notify_one(); - - std::thread* lthread = m_thread; - if (lthread != nullptr && wait && !IsCurrentThread()) - { - lock.unlock(); - if (lthread->joinable()) - lthread->join(); - delete m_thread; - m_thread = nullptr; - m_threadId = std::thread::id(); - } - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Thread sleep with given amount of milliseconds. - /// - /// This makes a sleep in the thread with a given time value. If it is called - /// within the process itself, it is also checked whether the thread is - /// terminated and the sleep process is thereby interrupted. - /// - /// If the external point calls this, only a regular sleep is used, which runs - /// through completely. - /// - /// @param[in] milliseconds Time to sleep - /// - void Sleep(uint32_t milliseconds) - { - if (milliseconds > 10 && IsCurrentThread()) - { - std::unique_lock lock(m_threadMutex); - m_stopEvent.wait_for(lock, std::chrono::milliseconds(milliseconds)); - } - else - { - std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); - } - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief The function returns when the thread execution has completed or - /// timing is reached in milliseconds beforehand - /// - /// This synchronizes the moment this function returns with the completion of - /// all operations on the thread. - /// - /// @param[in] milliseconds Time to wait for join - /// - bool Join(unsigned int milliseconds) - { - std::unique_lock lock(m_threadMutex); - std::thread* lthread = m_thread; - if (lthread != nullptr) - { - if (IsCurrentThread()) - return false; - - { - m_threadMutex.unlock(); // don't hold the thread lock while we're waiting - std::future_status stat = m_future.wait_for(std::chrono::milliseconds(milliseconds)); - if (stat != std::future_status::ready) - return false; - m_threadMutex.lock(); - } - - // it's possible it's already joined since we released the lock above. - if (lthread->joinable()) - m_thread->join(); - return true; - } - else - return false; - } - //---------------------------------------------------------------------------- - -protected: - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief The function to be added by the addon as a child to carry out the - /// process thread. - /// - /// Use @ref m_threadStop to check about active of thread and want stopped from - /// external place. - /// - /// @note This function is necessary and must be implemented by the addon. - /// - virtual void Process() = 0; - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CThread - /// @brief Atomic bool to indicate thread is active. - /// - /// This should be used in @ref Process() to check the activity of the thread and, - /// if true, to terminate the process. - /// - /// - `false`: Thread active and should be run - /// - `true`: Thread ends and should be stopped - /// - std::atomic m_threadStop; - //---------------------------------------------------------------------------- - -private: - bool m_autoDelete = false; - bool m_running = false; - std::condition_variable_any m_stopEvent; - std::condition_variable_any m_startEvent; - std::recursive_mutex m_threadMutex; - std::thread::id m_threadId; - std::thread* m_thread = nullptr; - std::future m_future; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace tools */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/tools/Timer.h b/xbmc/addons/kodi-dev-kit/include/kodi/tools/Timer.h deleted file mode 100644 index 0e0ced7769ed3..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/Timer.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2005-2020 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#ifdef __cplusplus - -#include "Thread.h" - -#include - -namespace kodi -{ -namespace tools -{ - -//============================================================================== -/// @defgroup cpp_kodi_tools_CTimer class CTimer -/// @ingroup cpp_kodi_tools -/// @brief **Time interval management**\n -/// Class which enables a time interval to be called up by a given function or -/// class by means of a thread. -/// -/// His code uses the support of platform-independent thread system introduced -/// with C++11. -/// -/// -/// ---------------------------------------------------------------------------- -/// -/// **Example:** -/// ~~~~~~~~~~~~~{.cpp} -/// #include -/// -/// class ATTRIBUTE_HIDDEN CExample -/// { -/// public: -/// CExample() : m_timer([this](){TimerCall();}) -/// { -/// m_timer.Start(5000, true); // let call continuously all 5 seconds -/// } -/// -/// void TimerCall() -/// { -/// fprintf(stderr, "Hello World\n"); -/// } -/// -/// private: -/// kodi::tools::CTimer m_timer; -/// }; -/// ~~~~~~~~~~~~~ -/// -///@{ -class CTimer : protected CThread -{ -public: - class ITimerCallback; - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Class constructor to pass individual other class as callback. - /// - /// @param[in] callback Child class of parent @ref ITimerCallback with - /// implemented function @ref ITimerCallback::OnTimeout(). - /// - explicit CTimer(kodi::tools::CTimer::ITimerCallback* callback) - : CTimer(std::bind(&ITimerCallback::OnTimeout, callback)) - { - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Class constructor to pass individual function as callback. - /// - /// @param[in] callback Function to pass as callback about timeout. - /// - /// **Callback function style:** - /// ~~~~~~~~~~~~~{.cpp} - /// void TimerCallback() - /// { - /// } - /// ~~~~~~~~~~~~~ - explicit CTimer(std::function const& callback) : m_callback(callback) {} - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Class destructor. - /// - ~CTimer() override { Stop(true); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Start the timer by given time in milliseconds to make his call - /// by arrive of them. - /// - /// If interval is activated, it calls the associated callback function - /// continuously in the given interval. - /// - /// @param[in] timeout Timeout in milliseconds - /// @param[in] interval [opt] To run continuously if true, false only one time - /// and default - /// @return True if successfully done, false if not (callback missing, - /// timeout = 0 or was already running. - /// - bool Start(uint64_t timeout, bool interval = false) - { - using namespace std::chrono; - - if (m_callback == nullptr || timeout == 0 || IsRunning()) - return false; - - m_timeout = milliseconds(timeout); - m_interval = interval; - - CreateThread(); - return true; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Stop the timer if it is active. - /// - /// @param[in] wait [opt] Wait until timer is stopped, false is default and - /// call unblocked - /// @return True if timer was active and was stopped, false if already was - /// stopped. - /// - bool Stop(bool wait = false) - { - if (!IsRunning()) - return false; - - m_threadStop = true; - m_eventTimeout.notify_all(); - StopThread(wait); - - return true; - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Restart timer complete by stop and restart his thread again. - /// - /// @note Restart only possible as long the timer was running and not done his - /// work. - /// - /// @return True if start was successfully done, on error, or if was already - /// finished returned as false - /// - bool Restart() - { - using namespace std::chrono; - - if (!IsRunning()) - return false; - - Stop(true); - return Start(duration_cast(m_timeout).count(), m_interval); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Restart the timer with new timeout without touch of his thread. - /// - /// @param[in] timeout Time as milliseconds to wait for next call - /// - void RestartAsync(uint64_t timeout) - { - using namespace std::chrono; - - m_timeout = milliseconds(timeout); - const auto now = system_clock::now(); - m_endTime = now.time_since_epoch() + m_timeout; - m_eventTimeout.notify_all(); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Check timer is still active to wait for next call. - /// - /// @return True if active, false if all his work done and no more running - /// - bool IsRunning() const { return CThread::IsRunning(); } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Get elapsed time as floating point of timer as seconds. - /// - /// @return Elapsed time - /// - float GetElapsedSeconds() const { return GetElapsedMilliseconds() / 1000.0f; } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @ingroup cpp_kodi_tools_CTimer - /// @brief Get elapsed time as floating point of timer as milliseconds. - /// - /// @return Elapsed time - /// - float GetElapsedMilliseconds() const - { - using namespace std::chrono; - - if (!IsRunning()) - return 0.0f; - - const auto now = system_clock::now(); - return static_cast(duration_cast(now.time_since_epoch() - (m_endTime - m_timeout)).count()); - } - //---------------------------------------------------------------------------- - - //============================================================================ - /// @defgroup cpp_kodi_tools_CTimer_CB class ITimerCallback - /// @ingroup cpp_kodi_tools_CTimer - /// @brief **Callback class of timer**\n - /// To give on contructor by @ref CTimer(kodi::tools::CTimer::ITimerCallback* callback) - /// - class ITimerCallback - { - public: - //========================================================================== - /// @ingroup cpp_kodi_tools_CTimer_CB - /// @brief Class destructor. - /// - virtual ~ITimerCallback() = default; - //-------------------------------------------------------------------------- - - //========================================================================== - /// @ingroup cpp_kodi_tools_CTimer_CB - /// @brief Callback function to implement if constuctor @ref CTimer(kodi::tools::CTimer::ITimerCallback* callback) - /// is used and this as parent on related class - /// - /// ---------------------------------------------------------------------------- - /// - /// **Example:** - /// ~~~~~~~~~~~~~{.cpp} - /// #include - /// - /// class CExample : public kodi::tools::CTimer, - /// private kodi::tools::CTimer::ITimerCallback - /// { - /// public: - /// CExample() : kodi::tools::CTimer(this) - /// { - /// } - /// - /// void OnTimeout() override - /// { - /// // Some work - /// } - /// }; - /// - /// ~~~~~~~~~~~~~ - /// - virtual void OnTimeout() = 0; - //-------------------------------------------------------------------------- - }; - //---------------------------------------------------------------------------- - -protected: - void Process() override - { - using namespace std::chrono; - - while (!m_threadStop) - { - auto currentTime = system_clock::now(); - m_endTime = currentTime.time_since_epoch() + m_timeout; - - // wait the necessary time - std::mutex mutex; - std::unique_lock lock(mutex); - const auto waitTime = duration_cast(m_endTime - currentTime.time_since_epoch()); - if (m_eventTimeout.wait_for(lock, waitTime) == std::cv_status::timeout) - { - currentTime = system_clock::now(); - if (m_endTime.count() <= currentTime.time_since_epoch().count()) - { - // execute OnTimeout() callback - m_callback(); - - // continue if this is an interval timer, or if it was restarted during callback - if (!m_interval && m_endTime.count() <= currentTime.time_since_epoch().count()) - break; - } - } - } - } - -private: - bool m_interval = false; - std::function m_callback; - std::chrono::system_clock::duration m_timeout; - std::chrono::system_clock::duration m_endTime; - std::condition_variable_any m_eventTimeout; -}; -///@} -//------------------------------------------------------------------------------ - -} /* namespace tools */ -} /* namespace kodi */ - -#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h b/xbmc/addons/kodi-dev-kit/include/kodi/versions.h index dcfe1ffc6a86c..933b43f789d4a 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/versions.h @@ -85,10 +85,10 @@ "tools/Thread.h" \ "tools/Timer.h" -#define ADDON_INSTANCE_VERSION_AUDIODECODER "3.0.0" -#define ADDON_INSTANCE_VERSION_AUDIODECODER_MIN "3.0.0" +#define ADDON_INSTANCE_VERSION_AUDIODECODER "4.0.0" +#define ADDON_INSTANCE_VERSION_AUDIODECODER_MIN "4.0.0" #define ADDON_INSTANCE_VERSION_AUDIODECODER_XML_ID "kodi.binary.instance.audiodecoder" -#define ADDON_INSTANCE_VERSION_AUDIODECODER_DEPENDS "c-api/addon-instance/audio_decoder.h" \ +#define ADDON_INSTANCE_VERSION_AUDIODECODER_DEPENDS "c-api/addon-instance/audiodecoder.h" \ "addon-instance/AudioDecoder.h" #define ADDON_INSTANCE_VERSION_AUDIOENCODER "2.1.0" diff --git a/xbmc/addons/kodi-dev-kit/src/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/CMakeLists.txt new file mode 100644 index 0000000000000..74c6492a1f6c0 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(shared) + diff --git a/xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt new file mode 100644 index 0000000000000..d6543da27c6b3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt @@ -0,0 +1,70 @@ +# Addon helper library generator to allow operation between him and Kodi +# +# WARNING: This CMakeLists.txt is not complete autogenerated and need edited by +# hand. +# +project(kodidevkit) + +include(../../cmake/Macros.cmake) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../..) + +#---AUTO_GEN_PARSE--- +add_subdirectory(api) +add_subdirectory(api/addon-instance) +add_subdirectory(api/dl) +add_subdirectory(api/gui) +add_subdirectory(api/gui/controls) +add_subdirectory(api/gui/dialogs) +add_subdirectory(core) +#---AUTO_GEN_PARSE--- + +cmake_parse_arguments(arg "WRAPPED" "DEVKIT_OUTPUT_DIRECTORY" "" ${ARGN}) +if(arg_DEVKIT_OUTPUT_DIRECTORY) + set(DEVKIT_OUTPUT_DIRECTORY ${arg_DEVKIT_OUTPUT_DIRECTORY}) +else() + set(DEVKIT_OUTPUT_DIRECTORY "addons/kodi.binary.devkit") +endif() + +if(CORE_SYSTEM_NAME STREQUAL windows) + set(OUTPUT_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}) +else() + set(OUTPUT_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}-${ARCH}) +endif() + +set(DEVKIT_LIBRARY ${OUTPUT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE STRING "Library used for dev-kit") + +add_library(${PROJECT_NAME} SHARED ${DEV_KIT_HEADER} ${DEVKIT_OBJECTS} $) +set_target_properties(${PROJECT_NAME} PROPERTIES C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY} + OUTPUT_NAME ${OUTPUT_NAME} PREFIX "") +foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}) +endforeach() + +if(CORE_SYSTEM_NAME STREQUAL android) + message(FATAL_ERROR "OS currently not supported and in TODO!!!") +elseif(CORE_SYSTEM_NAME STREQUAL darwin_embedded) + add_definitions(-DKODI_INHIBIT_SHARED) + message(FATAL_ERROR "OS currently not supported and in TODO!!!") +elseif(CORE_SYSTEM_NAME STREQUAL freebsd) + message(FATAL_ERROR "OS currently not supported and in TODO!!!") +elseif(CORE_SYSTEM_NAME STREQUAL linux) + #target_link_libraries(${PROJECT_NAME} PRIVATE -static-libgcc -static-libstdc++ m c rt pthread) + target_link_libraries(${PROJECT_NAME} PUBLIC stdc++ gcc pthread m c rt ) +elseif(CORE_SYSTEM_NAME STREQUAL osx) + message(FATAL_ERROR "OS currently not supported and in TODO!!!") +elseif(CORE_SYSTEM_NAME STREQUAL windows) + message(FATAL_ERROR "OS currently not supported and in TODO!!!") +else() + message(FATAL_ERROR "Not supported OS '${CORE_SYSTEM_NAME}' used for kodi-dev-kit!") +endif() + +set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/${OUTPUT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE STRING "" FORCE) diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/CMakeLists.txt new file mode 100644 index 0000000000000..344ba50f72e90 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/CMakeLists.txt @@ -0,0 +1,24 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + addon_base.cpp + audio_engine.cpp + filesystem.cpp + general.cpp + monitor.cpp + network.cpp +) + +set(HEADERS + addon_base.h + audio_engine.h + filesystem.h + general.h + monitor.h + network.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/CMakeLists.txt new file mode 100644 index 0000000000000..41f255eddd682 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/CMakeLists.txt @@ -0,0 +1,34 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + audiodecoder.cpp + audioencoder.cpp + game.cpp + imagedecoder.cpp + inputstream.cpp + peripheral.cpp + pvr.cpp + screensaver.cpp + vfs.cpp + videocodec.cpp + visualization.cpp +) + +set(HEADERS + audiodecoder.h + audioencoder.h + game.h + imagedecoder.h + inputstream.h + peripheral.h + pvr.h + screensaver.h + vfs.h + videocodec.h + visualization.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api_addon-instance) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.cpp new file mode 100644 index 0000000000000..9f4fcdf5dd6d0 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.cpp @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audiodecoder.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_audiodecoder_h::InitDirect( + directFuncToAddon_addoninstance_audiodecoder_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_audiodecoder_create_v1 = kodi_addon_audiodecoder_create_v1; + ifcToAddon->kodi_addon_audiodecoder_destroy_v1 = kodi_addon_audiodecoder_destroy_v1; + ifcToAddon->kodi_addon_audiodecoder_can_operate_file_v1 = + kodi_addon_audiodecoder_can_operate_file_v1; + ifcToAddon->kodi_addon_audiodecoder_init_v1 = kodi_addon_audiodecoder_init_v1; + ifcToAddon->kodi_addon_audiodecoder_read_pcm_v1 = kodi_addon_audiodecoder_read_pcm_v1; + ifcToAddon->kodi_addon_audiodecoder_seek_v1 = kodi_addon_audiodecoder_seek_v1; + ifcToAddon->kodi_addon_audiodecoder_read_tag_v1 = kodi_addon_audiodecoder_read_tag_v1; + ifcToAddon->kodi_addon_audiodecoder_track_count_v1 = kodi_addon_audiodecoder_track_count_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_audiodecoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_audiodecoder_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_audiodecoder_create_v1: + { + // Original API call: typedef KODI_ADDON_AUDIODECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CREATE_V1)( KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_AUDIODECODER_HDL auto_gen_ret = + kodi_addon_audiodecoder_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_audiodecoder_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1)( KODI_ADDON_AUDIODECODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_audiodecoder_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_audiodecoder_can_operate_file_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_can_operate_file_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& file = std::get<1>(t); + bool auto_gen_ret = + kodi_addon_audiodecoder_can_operate_file_v1(this, auto_gen_hdl, file.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_can_operate_file_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_audiodecoder_init_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_INIT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, unsigned int filecache, int* channels, int* samplerate, int* bitspersample, int64_t* totaltime, int* bitrate, enum AudioEngineDataFormat* format, enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); + // Tuple in: typedef std::tuple> msgChild__IN_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_init_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& file = std::get<1>(t); + unsigned int filecache = std::get<2>(t); + int channels = std::get<3>(t); + int samplerate = std::get<4>(t); + int bitspersample = std::get<5>(t); + int64_t totaltime = std::get<6>(t); + int bitrate = std::get<7>(t); + enum AudioEngineDataFormat format = std::get<8>(t); + std::array& info = std::get<9>(t); + bool auto_gen_ret = kodi_addon_audiodecoder_init_v1( + this, auto_gen_hdl, file.c_str(), filecache, &channels, &samplerate, &bitspersample, + &totaltime, &bitrate, &format, info.data()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_init_v1( + auto_gen_ret, channels, samplerate, bitspersample, totaltime, bitrate, + format, info)); + return true; + } + case funcChild_kodi_addon_audiodecoder_read_pcm_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, uint8_t* buffer, size_t size, size_t* actualsize); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_read_pcm_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + size_t size = std::get<1>(t); + size_t actualsize = std::get<2>(t); + std::vector buffer(size); + int auto_gen_ret = + kodi_addon_audiodecoder_read_pcm_v1(this, auto_gen_hdl, buffer.data(), size, &actualsize); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_audiodecoder_read_pcm_v1(auto_gen_ret, buffer, actualsize)); + return true; + } + case funcChild_kodi_addon_audiodecoder_seek_v1: + { + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SEEK_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_seek_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int64_t time = std::get<1>(t); + int64_t auto_gen_ret = kodi_addon_audiodecoder_seek_v1(this, auto_gen_hdl, time); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_seek_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_audiodecoder_read_tag_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_read_tag_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& file = std::get<1>(t); + struct KODI_ADDON_AUDIODECODER_INFO_TAG tag; + bool auto_gen_ret = + kodi_addon_audiodecoder_read_tag_v1(this, auto_gen_hdl, file.c_str(), &tag); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_read_tag_v1(auto_gen_ret, &tag)); + IFC_KODI_ADDON_AUDIODECODER_INFO_TAG::CleanCStructure(&tag); + return true; + } + case funcChild_kodi_addon_audiodecoder_track_count_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_track_count_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& file = std::get<1>(t); + int auto_gen_ret = kodi_addon_audiodecoder_track_count_v1(this, auto_gen_hdl, file.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_track_count_v1(auto_gen_ret)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_AUDIODECODER_HDL CHdl_kodi_addoninstance_audiodecoder_h:: + kodi_addon_audiodecoder_create_v1(void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_AUDIODECODER_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_audiodecoder.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_audiodecoder.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_AUDIODECODER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_audiodecoder.v1.destroy) + { + union_data->types.kodi_addon_audiodecoder.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_can_operate_file_v1( + void* thisClassHdl, const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_audiodecoder.v1.can_operate_file) + { + auto_gen_ret = + union_data->types.kodi_addon_audiodecoder.v1.can_operate_file(union_data->hdl, file); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_init_v1( + void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + unsigned int filecache, + int* channels, + int* samplerate, + int* bitspersample, + int64_t* totaltime, + int* bitrate, + enum AudioEngineDataFormat* format, + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_audiodecoder.v1.init) + { + auto_gen_ret = union_data->types.kodi_addon_audiodecoder.v1.init( + union_data->hdl, file, filecache, channels, samplerate, bitspersample, totaltime, bitrate, + format, info); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_read_pcm_v1( + void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + uint8_t* buffer, + size_t size, + size_t* actualsize) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_audiodecoder.v1.read_pcm) + { + auto_gen_ret = union_data->types.kodi_addon_audiodecoder.v1.read_pcm(union_data->hdl, buffer, + size, actualsize); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_seek_v1( + void* thisClassHdl, const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_audiodecoder.v1.seek) + { + auto_gen_ret = union_data->types.kodi_addon_audiodecoder.v1.seek(union_data->hdl, time); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_read_tag_v1( + void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_audiodecoder.v1.read_tag) + { + auto_gen_ret = + union_data->types.kodi_addon_audiodecoder.v1.read_tag(union_data->hdl, file, tag); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_track_count_v1( + void* thisClassHdl, const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_audiodecoder.v1.track_count) + { + auto_gen_ret = union_data->types.kodi_addon_audiodecoder.v1.track_count(union_data->hdl, file); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.h new file mode 100644 index 0000000000000..61b33310879d7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/audiodecoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_audiodecoder_h; +struct directFuncToKodi_addoninstance_audiodecoder_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_audiodecoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_audiodecoder_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_audiodecoder_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_AUDIODECODER_HDL kodi_addon_audiodecoder_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_audiodecoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_AUDIODECODER_HDL hdl); // Added with API 1 + + static bool kodi_addon_audiodecoder_can_operate_file_v1(void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file); // Added with API 1 + + static bool kodi_addon_audiodecoder_init_v1( + void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + unsigned int filecache, + int* channels, + int* samplerate, + int* bitspersample, + int64_t* totaltime, + int* bitrate, + enum AudioEngineDataFormat* format, + enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); // Added with API 1 + + static int kodi_addon_audiodecoder_read_pcm_v1(void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + uint8_t* buffer, + size_t size, + size_t* actualsize); // Added with API 1 + + static int64_t kodi_addon_audiodecoder_seek_v1(void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + int64_t time); // Added with API 1 + + static bool kodi_addon_audiodecoder_read_tag_v1( + void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file, + struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); // Added with API 1 + + static int kodi_addon_audiodecoder_track_count_v1(void* thisClassHdl, + const KODI_ADDON_AUDIODECODER_HDL hdl, + const char* file); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.cpp new file mode 100644 index 0000000000000..a5021ed2d1079 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.cpp @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audioencoder.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_audioencoder_h::InitDirect( + directFuncToAddon_addoninstance_audioencoder_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_audioencoder_create_v1 = kodi_addon_audioencoder_create_v1; + ifcToAddon->kodi_addon_audioencoder_destroy_v1 = kodi_addon_audioencoder_destroy_v1; + ifcToAddon->kodi_addon_audioencoder_start_v1 = kodi_addon_audioencoder_start_v1; + ifcToAddon->kodi_addon_audioencoder_encode_v1 = kodi_addon_audioencoder_encode_v1; + ifcToAddon->kodi_addon_audioencoder_finish_v1 = kodi_addon_audioencoder_finish_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_audioencoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_audioencoder_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_audioencoder_create_v1: + { + // Original API call: typedef KODI_ADDON_AUDIOENCODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audioencoder_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_AUDIOENCODER_HDL auto_gen_ret = + kodi_addon_audioencoder_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audioencoder_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_audioencoder_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audioencoder_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_audioencoder_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_audioencoder_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct AUDIOENCODER_INFO_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_start_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audioencoder_start_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + AUDIOENCODER_INFO_TAG tag; + std::get<1>(t).SetCStructure(&tag); + bool auto_gen_ret = kodi_addon_audioencoder_start_v1(this, auto_gen_hdl, &tag); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audioencoder_start_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_audioencoder_encode_v1: + { + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const uint8_t* pbt_stream, size_t num_bytes_read); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audioencoder_encode_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::vector& pbt_stream = std::get<1>(t); + size_t num_bytes_read = std::get<2>(t); + ssize_t auto_gen_ret = + kodi_addon_audioencoder_encode_v1(this, auto_gen_hdl, pbt_stream.data(), num_bytes_read); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audioencoder_encode_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_audioencoder_finish_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audioencoder_finish_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_audioencoder_finish_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audioencoder_finish_v1(auto_gen_ret)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_AUDIOENCODER_HDL CHdl_kodi_addoninstance_audioencoder_h:: + kodi_addon_audioencoder_create_v1(void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_AUDIOENCODER_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_audioencoder.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_audioencoder.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_AUDIOENCODER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_audioencoder.v1.destroy) + { + union_data->types.kodi_addon_audioencoder.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_start_v1( + void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct AUDIOENCODER_INFO_TAG* tag) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_audioencoder.v1.start) + { + auto_gen_ret = union_data->types.kodi_addon_audioencoder.v1.start(union_data->hdl, tag); + } + return auto_gen_ret; +} + +ssize_t CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_encode_v1( + void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const uint8_t* pbt_stream, + size_t num_bytes_read) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + ssize_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_audioencoder.v1.encode) + { + auto_gen_ret = union_data->types.kodi_addon_audioencoder.v1.encode(union_data->hdl, pbt_stream, + num_bytes_read); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_finish_v1( + void* thisClassHdl, KODI_ADDON_AUDIOENCODER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_audioencoder.v1.finish) + { + auto_gen_ret = union_data->types.kodi_addon_audioencoder.v1.finish(union_data->hdl); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_OWN_HDL hdl, + const uint8_t* data, + size_t len) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_OWN_HDL hdl, const uint8_t* data, size_t len) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_addon_audioencoder_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_write_v1; /* Autogenerated */ + + if (hdl == nullptr || data == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_audioencoder_write_v1( + PtrValue(hdl), std::vector(data, data + len), len)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_audioencoder_h, funcParent_kodi_addon_audioencoder_write_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_audioencoder_write_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_audioencoder_h; + return auto_gen_group.kodi_addon_audioencoder_write_v1(auto_gen_group.thisClassHdl, hdl, data, + len); +} + +ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_OWN_HDL hdl, size_t pos, int whence) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_OWN_HDL hdl, size_t pos, int whence) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_audioencoder_seek_v1(PtrValue(hdl), pos, whence)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_audioencoder_h, funcParent_kodi_addon_audioencoder_seek_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_audioencoder_seek_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_audioencoder_h; + return auto_gen_group.kodi_addon_audioencoder_seek_v1(auto_gen_group.thisClassHdl, hdl, pos, + whence); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.h new file mode 100644 index 0000000000000..f75c6072a56be --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/audioencoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_audioencoder_h; +struct directFuncToKodi_addoninstance_audioencoder_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_audioencoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_audioencoder_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_audioencoder_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_AUDIOENCODER_HDL kodi_addon_audioencoder_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_audioencoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_AUDIOENCODER_HDL hdl); // Added with API 1 + + static bool kodi_addon_audioencoder_start_v1( + void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct AUDIOENCODER_INFO_TAG* tag); // Added with API 1 + + static ssize_t kodi_addon_audioencoder_encode_v1(void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const uint8_t* pbt_stream, + size_t num_bytes_read); // Added with API 1 + + static bool kodi_addon_audioencoder_finish_v1( + void* thisClassHdl, KODI_ADDON_AUDIOENCODER_HDL hdl); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.cpp new file mode 100644 index 0000000000000..cef021d51d4bf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.cpp @@ -0,0 +1,667 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "game.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_game_h::InitDirect(directFuncToAddon_addoninstance_game_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_game_create_v1 = kodi_addon_game_create_v1; + ifcToAddon->kodi_addon_game_destroy_v1 = kodi_addon_game_destroy_v1; + ifcToAddon->kodi_addon_game_load_game_v1 = kodi_addon_game_load_game_v1; + ifcToAddon->kodi_addon_game_load_game_special_v1 = kodi_addon_game_load_game_special_v1; + ifcToAddon->kodi_addon_game_load_standalone_v1 = kodi_addon_game_load_standalone_v1; + ifcToAddon->kodi_addon_game_unload_game_v1 = kodi_addon_game_unload_game_v1; + ifcToAddon->kodi_addon_game_get_game_timing_v1 = kodi_addon_game_get_game_timing_v1; + ifcToAddon->kodi_addon_game_get_region_v1 = kodi_addon_game_get_region_v1; + ifcToAddon->kodi_addon_game_requires_game_loop_v1 = kodi_addon_game_requires_game_loop_v1; + ifcToAddon->kodi_addon_game_run_frame_v1 = kodi_addon_game_run_frame_v1; + ifcToAddon->kodi_addon_game_reset_v1 = kodi_addon_game_reset_v1; + ifcToAddon->kodi_addon_game_hw_context_reset_v1 = kodi_addon_game_hw_context_reset_v1; + ifcToAddon->kodi_addon_game_hw_context_destroy_v1 = kodi_addon_game_hw_context_destroy_v1; + ifcToAddon->kodi_addon_game_has_feature_v1 = kodi_addon_game_has_feature_v1; + ifcToAddon->kodi_addon_game_get_topology_v1 = kodi_addon_game_get_topology_v1; + ifcToAddon->kodi_addon_game_free_topology_v1 = kodi_addon_game_free_topology_v1; + ifcToAddon->kodi_addon_game_set_controller_layouts_v1 = kodi_addon_game_set_controller_layouts_v1; + ifcToAddon->kodi_addon_game_enable_keyboard_v1 = kodi_addon_game_enable_keyboard_v1; + ifcToAddon->kodi_addon_game_enable_mouse_v1 = kodi_addon_game_enable_mouse_v1; + ifcToAddon->kodi_addon_game_connect_controller_v1 = kodi_addon_game_connect_controller_v1; + ifcToAddon->kodi_addon_game_input_event_v1 = kodi_addon_game_input_event_v1; + ifcToAddon->kodi_addon_game_serialize_size_v1 = kodi_addon_game_serialize_size_v1; + ifcToAddon->kodi_addon_game_serialize_v1 = kodi_addon_game_serialize_v1; + ifcToAddon->kodi_addon_game_deserialize_v1 = kodi_addon_game_deserialize_v1; + ifcToAddon->kodi_addon_game_cheat_reset_v1 = kodi_addon_game_cheat_reset_v1; + ifcToAddon->kodi_addon_game_get_memory_v1 = kodi_addon_game_get_memory_v1; + ifcToAddon->kodi_addon_game_set_cheat_v1 = kodi_addon_game_set_cheat_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_game_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_game_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_GAME_HDL CHdl_kodi_addoninstance_game_h::kodi_addon_game_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_GAME_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_game.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_destroy_v1( + void* thisClassHdl, KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_game.v1.destroy) + { + union_data->types.kodi_addon_game.v1.destroy(union_data->hdl); + } +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_game_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl, const char* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.load_game) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.load_game(union_data->hdl, url); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_game_special_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + enum SPECIAL_GAME_TYPE type, + const char** urls, + size_t urlCount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.load_game_special) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.load_game_special(union_data->hdl, type, + urls, urlCount); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_load_standalone_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.load_standalone) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.load_standalone(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_unload_game_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.unload_game) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.unload_game(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_game_timing_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + struct game_system_timing* timing_info) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.get_game_timing) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.get_game_timing(union_data->hdl, timing_info); + } + return auto_gen_ret; +} + +enum GAME_REGION CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_region_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_REGION_UNKNOWN; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_REGION auto_gen_ret = GAME_REGION_UNKNOWN; + if (union_data->types.kodi_addon_game.v1.get_region) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.get_region(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_requires_game_loop_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.requires_game_loop) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.requires_game_loop(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_run_frame_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.run_frame) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.run_frame(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.reset) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.reset(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_hw_context_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.hw_context_reset) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.hw_context_reset(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_hw_context_destroy_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.hw_context_destroy) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.hw_context_destroy(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_has_feature_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const char* controller_id, + const char* feature_name) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.has_feature) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.has_feature(union_data->hdl, controller_id, + feature_name); + } + return auto_gen_ret; +} + +struct game_input_topology* CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_topology_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + struct game_input_topology* auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_game.v1.get_topology) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.get_topology(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_free_topology_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + struct game_input_topology* topology) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_game.v1.free_topology) + { + union_data->types.kodi_addon_game.v1.free_topology(union_data->hdl, topology); + } +} + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_set_controller_layouts_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const struct game_controller_layout* controllers, + size_t controller_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_game.v1.set_controller_layouts) + { + union_data->types.kodi_addon_game.v1.set_controller_layouts(union_data->hdl, controllers, + controller_count); + } +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_enable_keyboard_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.enable_keyboard) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.enable_keyboard(union_data->hdl, enable, + controller_id); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_enable_mouse_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.enable_mouse) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.enable_mouse(union_data->hdl, enable, controller_id); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_connect_controller_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool connect, + const char* port_address, + const char* controller_id) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.connect_controller) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.connect_controller( + union_data->hdl, connect, port_address, controller_id); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_input_event_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const struct game_input_event* event) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_game.v1.input_event) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.input_event(union_data->hdl, event); + } + return auto_gen_ret; +} + +size_t CHdl_kodi_addoninstance_game_h::kodi_addon_game_serialize_size_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + size_t auto_gen_ret = 0; + if (union_data->types.kodi_addon_game.v1.serialize_size) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.serialize_size(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_serialize_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + uint8_t* data, + size_t size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.serialize) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.serialize(union_data->hdl, data, size); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_deserialize_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const uint8_t* data, + size_t size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.deserialize) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.deserialize(union_data->hdl, data, size); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_cheat_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.cheat_reset) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.cheat_reset(union_data->hdl); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_get_memory_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + enum GAME_MEMORY type, + uint8_t** data, + size_t* size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.get_memory) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.get_memory(union_data->hdl, type, data, size); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_set_cheat_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + unsigned int index, + bool enabled, + const char* code) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return GAME_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum GAME_ERROR auto_gen_ret = GAME_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_game.v1.set_cheat) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.set_cheat(union_data->hdl, index, enabled, code); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + auto_gen_group.kodi_addon_game_close_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT KODI_GAME_STREAM_HANDLE +kodi_addon_game_open_stream(KODI_OWN_HDL hdl, const struct game_stream_properties* properties) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GAME_STREAM_HANDLE kodi_addon_game_open_stream(KODI_OWN_HDL hdl, const struct game_stream_properties* properties) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || properties == nullptr) + return nullptr; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + return auto_gen_group.kodi_addon_game_open_stream_v1(auto_gen_group.thisClassHdl, hdl, + properties); +} + +ATTR_DLL_EXPORT bool kodi_addon_game_get_stream_buffer(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + unsigned int width, + unsigned int height, + struct game_stream_buffer* buffer) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_game_get_stream_buffer(KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl, unsigned int width, unsigned int height, struct game_stream_buffer* buffer) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || game_hdl == nullptr || buffer == nullptr) + return false; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + return auto_gen_group.kodi_addon_game_get_stream_buffer_v1(auto_gen_group.thisClassHdl, hdl, + game_hdl, width, height, buffer); +} + +ATTR_DLL_EXPORT void kodi_addon_game_add_stream_data(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + const struct game_stream_packet* packet) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_add_stream_data(KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl, const struct game_stream_packet* packet) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || game_hdl == nullptr || packet == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + auto_gen_group.kodi_addon_game_add_stream_data_v1(auto_gen_group.thisClassHdl, hdl, game_hdl, + packet); +} + +ATTR_DLL_EXPORT void kodi_addon_game_release_stream_buffer(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl, + struct game_stream_buffer* buffer) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_release_stream_buffer(KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl, struct game_stream_buffer* buffer) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || game_hdl == nullptr || buffer == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + auto_gen_group.kodi_addon_game_release_stream_buffer_v1(auto_gen_group.thisClassHdl, hdl, + game_hdl, buffer); +} + +ATTR_DLL_EXPORT void kodi_addon_game_close_stream(KODI_OWN_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_close_stream(KODI_OWN_HDL hdl, KODI_GAME_STREAM_HANDLE game_hdl) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || game_hdl == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + auto_gen_group.kodi_addon_game_close_stream_v1(auto_gen_group.thisClassHdl, hdl, game_hdl); +} + +ATTR_DLL_EXPORT game_proc_address_t kodi_addon_hw_get_proc_address(KODI_OWN_HDL hdl, + const char* symbol) +{ + // Original API call: ATTR_DLL_EXPORT game_proc_address_t kodi_addon_hw_get_proc_address(KODI_OWN_HDL hdl, const char* symbol) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || symbol == nullptr) + return nullptr; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + return auto_gen_group.kodi_addon_hw_get_proc_address_v1(auto_gen_group.thisClassHdl, hdl, symbol); +} + +ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_OWN_HDL hdl, + const struct game_input_event* event) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_OWN_HDL hdl, const struct game_input_event* event) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || event == nullptr) + return false; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_game_h; + return auto_gen_group.kodi_addon_game_input_event_v1(auto_gen_group.thisClassHdl, hdl, event); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.h new file mode 100644 index 0000000000000..76e909f2a7003 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.h @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/game.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_game_h; +struct directFuncToKodi_addoninstance_game_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_game_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_game_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_game_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_GAME_HDL kodi_addon_game_create_v1(void* thisClassHdl, + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_game_destroy_v1(void* thisClassHdl, + KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_load_game_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const char* url); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_load_game_special_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + enum SPECIAL_GAME_TYPE type, + const char** urls, + size_t urlCount); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_load_standalone_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_unload_game_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_get_game_timing_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + struct game_system_timing* timing_info); // Added with API 1 + + static enum GAME_REGION kodi_addon_game_get_region_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static bool kodi_addon_game_requires_game_loop_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_run_frame_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_hw_context_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_hw_context_destroy_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static bool kodi_addon_game_has_feature_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const char* controller_id, + const char* feature_name); // Added with API 1 + + static struct game_input_topology* kodi_addon_game_get_topology_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static void kodi_addon_game_free_topology_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + struct game_input_topology* topology); // Added with API 1 + + static void kodi_addon_game_set_controller_layouts_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const struct game_controller_layout* controllers, + size_t controller_count); // Added with API 1 + + static bool kodi_addon_game_enable_keyboard_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id); // Added with API 1 + + static bool kodi_addon_game_enable_mouse_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool enable, + const char* controller_id); // Added with API 1 + + static bool kodi_addon_game_connect_controller_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + bool connect, + const char* port_address, + const char* controller_id); // Added with API 1 + + static bool kodi_addon_game_input_event_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const struct game_input_event* event); // Added with API 1 + + static size_t kodi_addon_game_serialize_size_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_serialize_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + uint8_t* data, + size_t size); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_deserialize_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + const uint8_t* data, + size_t size); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_cheat_reset_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_get_memory_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + enum GAME_MEMORY type, + uint8_t** data, + size_t* size); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_set_cheat_v1(void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + unsigned int index, + bool enabled, + const char* code); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.cpp new file mode 100644 index 0000000000000..a856ab1059783 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.cpp @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "imagedecoder.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_imagedecoder_h::InitDirect( + directFuncToAddon_addoninstance_imagedecoder_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_imagedecoder_create_v1 = kodi_addon_imagedecoder_create_v1; + ifcToAddon->kodi_addon_imagedecoder_destroy_v1 = kodi_addon_imagedecoder_destroy_v1; + ifcToAddon->kodi_addon_imagedecoder_load_image_from_memory_v1 = + kodi_addon_imagedecoder_load_image_from_memory_v1; + ifcToAddon->kodi_addon_imagedecoder_decode_v1 = kodi_addon_imagedecoder_decode_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_imagedecoder_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_imagedecoder_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_imagedecoder_create_v1: + { + // Original API call: typedef KODI_ADDON_IMAGEDECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_IMAGEDECODER_HDL auto_gen_ret = + kodi_addon_imagedecoder_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_imagedecoder_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_imagedecoder_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_imagedecoder_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_imagedecoder_load_image_from_memory_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)( KODI_ADDON_IMAGEDECODER_HDL hdl, const uint8_t* buffer, size_t buf_size, unsigned int* width, unsigned int* height); + // Tuple in: typedef std::tuple, size_t, unsigned int, unsigned int> msgChild__IN_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_load_image_from_memory_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::vector& buffer = std::get<1>(t); + size_t buf_size = std::get<2>(t); + unsigned int width = std::get<3>(t); + unsigned int height = std::get<4>(t); + bool auto_gen_ret = kodi_addon_imagedecoder_load_image_from_memory_v1( + this, auto_gen_hdl, buffer.data(), buf_size, &width, &height); + + msgpack::pack(out, msgChild_OUT_kodi_addon_imagedecoder_load_image_from_memory_v1( + auto_gen_ret, width, height)); + return true; + } + case funcChild_kodi_addon_imagedecoder_decode_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl, uint8_t* pixels, size_t pixels_size, unsigned int width, unsigned int height, unsigned int pitch, enum ADDON_IMG_FMT format); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_decode_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + size_t pixels_size = std::get<1>(t); + unsigned int width = std::get<2>(t); + unsigned int height = std::get<3>(t); + unsigned int pitch = std::get<4>(t); + enum ADDON_IMG_FMT format = std::get<5>(t); + std::vector pixels(pixels_size); + bool auto_gen_ret = kodi_addon_imagedecoder_decode_v1( + this, auto_gen_hdl, pixels.data(), pixels_size, width, height, pitch, format); + + msgpack::pack(out, msgChild_OUT_kodi_addon_imagedecoder_decode_v1(auto_gen_ret, pixels)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_IMAGEDECODER_HDL CHdl_kodi_addoninstance_imagedecoder_h:: + kodi_addon_imagedecoder_create_v1(void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_IMAGEDECODER_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_imagedecoder.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_imagedecoder.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_IMAGEDECODER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_imagedecoder.v1.destroy) + { + union_data->types.kodi_addon_imagedecoder.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_load_image_from_memory_v1( + void* thisClassHdl, + KODI_ADDON_IMAGEDECODER_HDL hdl, + const uint8_t* buffer, + size_t buf_size, + unsigned int* width, + unsigned int* height) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_imagedecoder.v1.load_image_from_memory) + { + auto_gen_ret = union_data->types.kodi_addon_imagedecoder.v1.load_image_from_memory( + union_data->hdl, buffer, buf_size, width, height); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_decode_v1( + void* thisClassHdl, + KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, + unsigned int width, + unsigned int height, + unsigned int pitch, + enum ADDON_IMG_FMT format) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_imagedecoder.v1.decode) + { + auto_gen_ret = union_data->types.kodi_addon_imagedecoder.v1.decode( + union_data->hdl, pixels, pixels_size, width, height, pitch, format); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT char* kodi_addon_imagedecoder_mimetype(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_imagedecoder_mimetype(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ + + if (hdl == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_imagedecoder_mimetype_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_imagedecoder_h, funcParent_kodi_addon_imagedecoder_mimetype_v1, + in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_imagedecoder_mimetype_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_imagedecoder_h; + return auto_gen_group.kodi_addon_imagedecoder_mimetype_v1(auto_gen_group.thisClassHdl, hdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.h new file mode 100644 index 0000000000000..8bb41038d1766 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/imagedecoder.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_imagedecoder_h; +struct directFuncToKodi_addoninstance_imagedecoder_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_imagedecoder_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_imagedecoder_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_imagedecoder_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_IMAGEDECODER_HDL kodi_addon_imagedecoder_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_imagedecoder_destroy_v1( + void* thisClassHdl, KODI_ADDON_IMAGEDECODER_HDL hdl); // Added with API 1 + + static bool kodi_addon_imagedecoder_load_image_from_memory_v1( + void* thisClassHdl, + KODI_ADDON_IMAGEDECODER_HDL hdl, + const uint8_t* buffer, + size_t buf_size, + unsigned int* width, + unsigned int* height); // Added with API 1 + + static bool kodi_addon_imagedecoder_decode_v1(void* thisClassHdl, + KODI_ADDON_IMAGEDECODER_HDL hdl, + uint8_t* pixels, + size_t pixels_size, + unsigned int width, + unsigned int height, + unsigned int pitch, + enum ADDON_IMG_FMT format); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.cpp new file mode 100644 index 0000000000000..f1364486f69b8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.cpp @@ -0,0 +1,674 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "inputstream.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_inputstream_h::InitDirect( + directFuncToAddon_addoninstance_inputstream_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_inputstream_create_v1 = kodi_addon_inputstream_create_v1; + ifcToAddon->kodi_addon_inputstream_destroy_v1 = kodi_addon_inputstream_destroy_v1; + ifcToAddon->kodi_addon_inputstream_open_v1 = kodi_addon_inputstream_open_v1; + ifcToAddon->kodi_addon_inputstream_close_v1 = kodi_addon_inputstream_close_v1; + ifcToAddon->kodi_addon_inputstream_get_path_list_v1 = kodi_addon_inputstream_get_path_list_v1; + ifcToAddon->kodi_addon_inputstream_get_capabilities_v1 = + kodi_addon_inputstream_get_capabilities_v1; + ifcToAddon->kodi_addon_inputstream_get_stream_ids_v1 = kodi_addon_inputstream_get_stream_ids_v1; + ifcToAddon->kodi_addon_inputstream_get_stream_v1 = kodi_addon_inputstream_get_stream_v1; + ifcToAddon->kodi_addon_inputstream_enable_stream_v1 = kodi_addon_inputstream_enable_stream_v1; + ifcToAddon->kodi_addon_inputstream_open_stream_v1 = kodi_addon_inputstream_open_stream_v1; + ifcToAddon->kodi_addon_inputstream_demux_reset_v1 = kodi_addon_inputstream_demux_reset_v1; + ifcToAddon->kodi_addon_inputstream_demux_abort_v1 = kodi_addon_inputstream_demux_abort_v1; + ifcToAddon->kodi_addon_inputstream_demux_flush_v1 = kodi_addon_inputstream_demux_flush_v1; + ifcToAddon->kodi_addon_inputstream_demux_read_v1 = kodi_addon_inputstream_demux_read_v1; + ifcToAddon->kodi_addon_inputstream_demux_seek_time_v1 = kodi_addon_inputstream_demux_seek_time_v1; + ifcToAddon->kodi_addon_inputstream_demux_set_speed_v1 = kodi_addon_inputstream_demux_set_speed_v1; + ifcToAddon->kodi_addon_inputstream_set_video_resolution_v1 = + kodi_addon_inputstream_set_video_resolution_v1; + ifcToAddon->kodi_addon_inputstream_get_total_time_v1 = kodi_addon_inputstream_get_total_time_v1; + ifcToAddon->kodi_addon_inputstream_get_time_v1 = kodi_addon_inputstream_get_time_v1; + ifcToAddon->kodi_addon_inputstream_get_times_v1 = kodi_addon_inputstream_get_times_v1; + ifcToAddon->kodi_addon_inputstream_pos_time_v1 = kodi_addon_inputstream_pos_time_v1; + ifcToAddon->kodi_addon_inputstream_read_stream_v1 = kodi_addon_inputstream_read_stream_v1; + ifcToAddon->kodi_addon_inputstream_seek_stream_v1 = kodi_addon_inputstream_seek_stream_v1; + ifcToAddon->kodi_addon_inputstream_position_stream_v1 = kodi_addon_inputstream_position_stream_v1; + ifcToAddon->kodi_addon_inputstream_length_stream_v1 = kodi_addon_inputstream_length_stream_v1; + ifcToAddon->kodi_addon_inputstream_is_real_time_stream_v1 = + kodi_addon_inputstream_is_real_time_stream_v1; + ifcToAddon->kodi_addon_inputstream_get_chapter_v1 = kodi_addon_inputstream_get_chapter_v1; + ifcToAddon->kodi_addon_inputstream_get_chapter_count_v1 = + kodi_addon_inputstream_get_chapter_count_v1; + ifcToAddon->kodi_addon_inputstream_get_chapter_name_v1 = + kodi_addon_inputstream_get_chapter_name_v1; + ifcToAddon->kodi_addon_inputstream_get_chapter_pos_v1 = kodi_addon_inputstream_get_chapter_pos_v1; + ifcToAddon->kodi_addon_inputstream_seek_chapter_v1 = kodi_addon_inputstream_seek_chapter_v1; + ifcToAddon->kodi_addon_inputstream_block_size_stream_v1 = + kodi_addon_inputstream_block_size_stream_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_inputstream_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_inputstream_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_INPUTSTREAM_HDL CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_INPUTSTREAM_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_inputstream.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_destroy_v1( + void* thisClassHdl, KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.destroy) + { + union_data->types.kodi_addon_inputstream.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_open_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_PROPERTY* props) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.open) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.open(union_data->hdl, props); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_close_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.close) + { + union_data->types.kodi_addon_inputstream.v1.close(union_data->hdl); + } +} + +const char* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_path_list_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + const char* auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_inputstream.v1.get_path_list) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_path_list(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_capabilities_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_CAPABILITIES* capabilities) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.get_capabilities) + { + union_data->types.kodi_addon_inputstream.v1.get_capabilities(union_data->hdl, capabilities); + } +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_stream_ids_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_IDS* ids) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.get_stream_ids) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_stream_ids(union_data->hdl, ids); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_stream_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + struct INPUTSTREAM_INFO* info, + KODI_OWN_HDL* demuxStream, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.get_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_stream( + union_data->hdl, streamid, info, demuxStream, transfer_stream); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_enable_stream_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + bool enable) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.enable_stream) + { + union_data->types.kodi_addon_inputstream.v1.enable_stream(union_data->hdl, streamid, enable); + } +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_open_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int streamid) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.open_stream) + { + auto_gen_ret = + union_data->types.kodi_addon_inputstream.v1.open_stream(union_data->hdl, streamid); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_reset_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.demux_reset) + { + union_data->types.kodi_addon_inputstream.v1.demux_reset(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_abort_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.demux_abort) + { + union_data->types.kodi_addon_inputstream.v1.demux_abort(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_flush_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.demux_flush) + { + union_data->types.kodi_addon_inputstream.v1.demux_flush(union_data->hdl); + } +} + +struct DEMUX_PACKET* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_read_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + struct DEMUX_PACKET* auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_inputstream.v1.demux_read) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.demux_read(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_seek_time_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + double time, + bool backwards, + double* startpts) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.demux_seek_time) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.demux_seek_time( + union_data->hdl, time, backwards, startpts); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_demux_set_speed_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int speed) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.demux_set_speed) + { + union_data->types.kodi_addon_inputstream.v1.demux_set_speed(union_data->hdl, speed); + } +} + +void CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_set_video_resolution_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int width, + int height) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_inputstream.v1.set_video_resolution) + { + union_data->types.kodi_addon_inputstream.v1.set_video_resolution(union_data->hdl, width, + height); + } +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_total_time_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.get_total_time) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_total_time(union_data->hdl); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_time_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.get_time) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_time(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_times_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_TIMES* times) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.get_times) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_times(union_data->hdl, times); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_pos_time_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int ms) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.pos_time) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.pos_time(union_data->hdl, ms); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_read_stream_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + uint8_t* buffer, + unsigned int bufferSize) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.read_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.read_stream(union_data->hdl, buffer, + bufferSize); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_seek_stream_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int64_t position, + int whence) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.seek_stream) + { + auto_gen_ret = + union_data->types.kodi_addon_inputstream.v1.seek_stream(union_data->hdl, position, whence); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_position_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.position_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.position_stream(union_data->hdl); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_length_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.length_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.length_stream(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_is_real_time_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.is_real_time_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.is_real_time_stream(union_data->hdl); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.get_chapter) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_chapter(union_data->hdl); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_count_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.get_chapter_count) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_chapter_count(union_data->hdl); + } + return auto_gen_ret; +} + +const char* CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_name_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + const char* auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_inputstream.v1.get_chapter_name) + { + auto_gen_ret = + union_data->types.kodi_addon_inputstream.v1.get_chapter_name(union_data->hdl, ch); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_get_chapter_pos_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.get_chapter_pos) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.get_chapter_pos(union_data->hdl, ch); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_seek_chapter_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_inputstream.v1.seek_chapter) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.seek_chapter(union_data->hdl, ch); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_inputstream_h::kodi_addon_inputstream_block_size_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_inputstream.v1.block_size_stream) + { + auto_gen_ret = union_data->types.kodi_addon_inputstream.v1.block_size_stream(union_data->hdl); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_demux_packet(KODI_OWN_HDL hdl, + int data_size) +{ + // Original API call: ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_demux_packet( KODI_OWN_HDL hdl, int data_size) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr) + return nullptr; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_inputstream_h; + return auto_gen_group.kodi_addon_inputstream_allocate_demux_packet_v1(auto_gen_group.thisClassHdl, + hdl, data_size); +} + +ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet( + KODI_OWN_HDL hdl, unsigned int data_size, unsigned int encrypted_subsample_count) +{ + // Original API call: ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet( KODI_OWN_HDL hdl, unsigned int data_size, unsigned int encrypted_subsample_count) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr) + return nullptr; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_inputstream_h; + return auto_gen_group.kodi_addon_inputstream_allocate_encrypted_demux_packet_v1( + auto_gen_group.thisClassHdl, hdl, data_size, encrypted_subsample_count); +} + +ATTR_DLL_EXPORT void kodi_addon_inputstream_free_demux_packet(KODI_OWN_HDL hdl, + struct DEMUX_PACKET* packet) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_inputstream_free_demux_packet(KODI_OWN_HDL hdl, struct DEMUX_PACKET* packet) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || packet == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_inputstream_h; + auto_gen_group.kodi_addon_inputstream_free_demux_packet_v1(auto_gen_group.thisClassHdl, hdl, + packet); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.h new file mode 100644 index 0000000000000..d5efbb996be29 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.h @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/inputstream.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_inputstream_h; +struct directFuncToKodi_addoninstance_inputstream_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_inputstream_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_inputstream_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_inputstream_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_INPUTSTREAM_HDL kodi_addon_inputstream_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_inputstream_destroy_v1(void* thisClassHdl, + KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static bool kodi_addon_inputstream_open_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_PROPERTY* props); // Added with API 1 + + static void kodi_addon_inputstream_close_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static const char* kodi_addon_inputstream_get_path_list_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static void kodi_addon_inputstream_get_capabilities_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_CAPABILITIES* capabilities); // Added with API 1 + + static bool kodi_addon_inputstream_get_stream_ids_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_IDS* ids); // Added with API 1 + + static bool kodi_addon_inputstream_get_stream_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + struct INPUTSTREAM_INFO* info, + KODI_OWN_HDL* demuxStream, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM transfer_stream); // Added with API 1 + + static void kodi_addon_inputstream_enable_stream_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid, + bool enable); // Added with API 1 + + static bool kodi_addon_inputstream_open_stream_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int streamid); // Added with API 1 + + static void kodi_addon_inputstream_demux_reset_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static void kodi_addon_inputstream_demux_abort_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static void kodi_addon_inputstream_demux_flush_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static struct DEMUX_PACKET* kodi_addon_inputstream_demux_read_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static bool kodi_addon_inputstream_demux_seek_time_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + double time, + bool backwards, + double* startpts); // Added with API 1 + + static void kodi_addon_inputstream_demux_set_speed_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int speed); // Added with API 1 + + static void kodi_addon_inputstream_set_video_resolution_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int width, + int height); // Added with API 1 + + static int kodi_addon_inputstream_get_total_time_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static int kodi_addon_inputstream_get_time_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static bool kodi_addon_inputstream_get_times_v1( + void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + struct INPUTSTREAM_TIMES* times); // Added with API 1 + + static bool kodi_addon_inputstream_pos_time_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ms); // Added with API 1 + + static int kodi_addon_inputstream_read_stream_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + uint8_t* buffer, + unsigned int bufferSize); // Added with API 1 + + static int64_t kodi_addon_inputstream_seek_stream_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int64_t position, + int whence); // Added with API 1 + + static int64_t kodi_addon_inputstream_position_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static int64_t kodi_addon_inputstream_length_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static bool kodi_addon_inputstream_is_real_time_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static int kodi_addon_inputstream_get_chapter_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static int kodi_addon_inputstream_get_chapter_count_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 + + static const char* kodi_addon_inputstream_get_chapter_name_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl, int ch); // Added with API 1 + + static int64_t kodi_addon_inputstream_get_chapter_pos_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); // Added with API 1 + + static bool kodi_addon_inputstream_seek_chapter_v1(void* thisClassHdl, + const KODI_ADDON_INPUTSTREAM_HDL hdl, + int ch); // Added with API 1 + + static int kodi_addon_inputstream_block_size_stream_v1( + void* thisClassHdl, const KODI_ADDON_INPUTSTREAM_HDL hdl); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.cpp new file mode 100644 index 0000000000000..4b484512d1f28 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.cpp @@ -0,0 +1,508 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "peripheral.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_peripheral_h::InitDirect( + directFuncToAddon_addoninstance_peripheral_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_peripheral_create_v1 = kodi_addon_peripheral_create_v1; + ifcToAddon->kodi_addon_peripheral_destroy_v1 = kodi_addon_peripheral_destroy_v1; + ifcToAddon->kodi_addon_peripheral_get_capabilities_v1 = kodi_addon_peripheral_get_capabilities_v1; + ifcToAddon->kodi_addon_peripheral_perform_device_scan_v1 = + kodi_addon_peripheral_perform_device_scan_v1; + ifcToAddon->kodi_addon_peripheral_free_scan_results_v1 = + kodi_addon_peripheral_free_scan_results_v1; + ifcToAddon->kodi_addon_peripheral_get_events_v1 = kodi_addon_peripheral_get_events_v1; + ifcToAddon->kodi_addon_peripheral_free_events_v1 = kodi_addon_peripheral_free_events_v1; + ifcToAddon->kodi_addon_peripheral_send_event_v1 = kodi_addon_peripheral_send_event_v1; + ifcToAddon->kodi_addon_peripheral_get_joystick_info_v1 = + kodi_addon_peripheral_get_joystick_info_v1; + ifcToAddon->kodi_addon_peripheral_free_joystick_info_v1 = + kodi_addon_peripheral_free_joystick_info_v1; + ifcToAddon->kodi_addon_peripheral_get_features_v1 = kodi_addon_peripheral_get_features_v1; + ifcToAddon->kodi_addon_peripheral_free_features_v1 = kodi_addon_peripheral_free_features_v1; + ifcToAddon->kodi_addon_peripheral_map_features_v1 = kodi_addon_peripheral_map_features_v1; + ifcToAddon->kodi_addon_peripheral_get_ignored_primitives_v1 = + kodi_addon_peripheral_get_ignored_primitives_v1; + ifcToAddon->kodi_addon_peripheral_free_primitives_v1 = kodi_addon_peripheral_free_primitives_v1; + ifcToAddon->kodi_addon_peripheral_set_ignored_primitives_v1 = + kodi_addon_peripheral_set_ignored_primitives_v1; + ifcToAddon->kodi_addon_peripheral_save_button_map_v1 = kodi_addon_peripheral_save_button_map_v1; + ifcToAddon->kodi_addon_peripheral_revert_button_map_v1 = + kodi_addon_peripheral_revert_button_map_v1; + ifcToAddon->kodi_addon_peripheral_reset_button_map_v1 = kodi_addon_peripheral_reset_button_map_v1; + ifcToAddon->kodi_addon_peripheral_power_off_joystick_v1 = + kodi_addon_peripheral_power_off_joystick_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_peripheral_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_peripheral_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_PERIPHERAL_HDL CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_PERIPHERAL_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_peripheral.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_destroy_v1( + void* thisClassHdl, KODI_ADDON_PERIPHERAL_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.destroy) + { + union_data->types.kodi_addon_peripheral.v1.destroy(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_capabilities_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_CAPABILITIES* capabilities) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.get_capabilities) + { + union_data->types.kodi_addon_peripheral.v1.get_capabilities(union_data->hdl, capabilities); + } +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_perform_device_scan_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO** scan_results, + size_t* peripheral_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.perform_device_scan) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.perform_device_scan( + union_data->hdl, scan_results, peripheral_count); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_scan_results_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO* scan_results, + size_t peripheral_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.free_scan_results) + { + union_data->types.kodi_addon_peripheral.v1.free_scan_results(union_data->hdl, scan_results, + peripheral_count); + } +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_events_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT** events, + size_t* event_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.get_events) + { + auto_gen_ret = + union_data->types.kodi_addon_peripheral.v1.get_events(union_data->hdl, events, event_count); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_events_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT* events, + size_t event_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.free_events) + { + union_data->types.kodi_addon_peripheral.v1.free_events(union_data->hdl, events, event_count); + } +} + +bool CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_send_event_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct PERIPHERAL_EVENT* event) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_peripheral.v1.send_event) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.send_event(union_data->hdl, event); + } + return auto_gen_ret; +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_get_joystick_info_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index, + struct JOYSTICK_INFO* info) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.get_joystick_info) + { + auto_gen_ret = + union_data->types.kodi_addon_peripheral.v1.get_joystick_info(union_data->hdl, index, info); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_joystick_info_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_INFO* info) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.free_joystick_info) + { + union_data->types.kodi_addon_peripheral.v1.free_joystick_info(union_data->hdl, info); + } +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_get_features_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + struct JOYSTICK_FEATURE** features, + size_t* feature_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.get_features) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.get_features( + union_data->hdl, joystick, controller_id, features, feature_count); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_features_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_FEATURE* features, + size_t feature_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.free_features) + { + union_data->types.kodi_addon_peripheral.v1.free_features(union_data->hdl, features, + feature_count); + } +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_map_features_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + const struct JOYSTICK_FEATURE* features, + size_t feature_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.map_features) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.map_features( + union_data->hdl, joystick, controller_id, features, feature_count); + } + return auto_gen_ret; +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_get_ignored_primitives_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + struct JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.get_ignored_primitives) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.get_ignored_primitives( + union_data->hdl, joystick, primitives, primitive_count); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_free_primitives_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.free_primitives) + { + union_data->types.kodi_addon_peripheral.v1.free_primitives(union_data->hdl, primitives, + primitive_count); + } +} + +enum PERIPHERAL_ERROR CHdl_kodi_addoninstance_peripheral_h:: + kodi_addon_peripheral_set_ignored_primitives_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PERIPHERAL_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PERIPHERAL_ERROR auto_gen_ret = PERIPHERAL_NO_ERROR; + if (union_data->types.kodi_addon_peripheral.v1.set_ignored_primitives) + { + auto_gen_ret = union_data->types.kodi_addon_peripheral.v1.set_ignored_primitives( + union_data->hdl, joystick, primitives, primitive_count); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_save_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.save_button_map) + { + union_data->types.kodi_addon_peripheral.v1.save_button_map(union_data->hdl, joystick); + } +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_revert_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.revert_button_map) + { + union_data->types.kodi_addon_peripheral.v1.revert_button_map(union_data->hdl, joystick); + } +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_reset_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.reset_button_map) + { + union_data->types.kodi_addon_peripheral.v1.reset_button_map(union_data->hdl, joystick, + controller_id); + } +} + +void CHdl_kodi_addoninstance_peripheral_h::kodi_addon_peripheral_power_off_joystick_v1( + void* thisClassHdl, KODI_ADDON_PERIPHERAL_HDL hdl, unsigned int index) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_peripheral.v1.power_off_joystick) + { + union_data->types.kodi_addon_peripheral.v1.power_off_joystick(union_data->hdl, index); + } +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_peripheral_trigger_scan(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_peripheral_trigger_scan(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_peripheral_h; + auto_gen_group.kodi_addon_peripheral_trigger_scan_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_peripheral_refresh_button_maps(KODI_OWN_HDL hdl, + const char* device_name, + const char* controller_id) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_peripheral_refresh_button_maps(KODI_OWN_HDL hdl, const char* device_name, const char* controller_id) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || device_name == nullptr || controller_id == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_peripheral_h; + auto_gen_group.kodi_addon_peripheral_refresh_button_maps_v1(auto_gen_group.thisClassHdl, hdl, + device_name, controller_id); +} + +ATTR_DLL_EXPORT unsigned int kodi_addon_peripheral_feature_count(KODI_OWN_HDL hdl, + const char* controller_id, + enum JOYSTICK_FEATURE_TYPE type) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_addon_peripheral_feature_count(KODI_OWN_HDL hdl, const char* controller_id, enum JOYSTICK_FEATURE_TYPE type) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || controller_id == nullptr) + return 0; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_peripheral_h; + return auto_gen_group.kodi_addon_peripheral_feature_count_v1(auto_gen_group.thisClassHdl, hdl, + controller_id, type); +} + +ATTR_DLL_EXPORT enum JOYSTICK_FEATURE_TYPE kodi_addon_peripheral_feature_type( + KODI_OWN_HDL hdl, const char* controller_id, const char* feature_name) +{ + // Original API call: ATTR_DLL_EXPORT enum JOYSTICK_FEATURE_TYPE kodi_addon_peripheral_feature_type( KODI_OWN_HDL hdl, const char* controller_id, const char* feature_name) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || controller_id == nullptr || feature_name == nullptr) + return JOYSTICK_FEATURE_TYPE_UNKNOWN; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_peripheral_h; + return auto_gen_group.kodi_addon_peripheral_feature_type_v1(auto_gen_group.thisClassHdl, hdl, + controller_id, feature_name); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.h new file mode 100644 index 0000000000000..86e05758f191d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.h @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/peripheral.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_peripheral_h; +struct directFuncToKodi_addoninstance_peripheral_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_peripheral_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_peripheral_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_peripheral_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_PERIPHERAL_HDL kodi_addon_peripheral_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_peripheral_destroy_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl); // Added with API 1 + + static void kodi_addon_peripheral_get_capabilities_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_CAPABILITIES* capabilities); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_perform_device_scan_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO** scan_results, + size_t* peripheral_count); // Added with API 1 + + static void kodi_addon_peripheral_free_scan_results_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_INFO* scan_results, + size_t peripheral_count); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_get_events_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT** events, + size_t* event_count); // Added with API 1 + + static void kodi_addon_peripheral_free_events_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct PERIPHERAL_EVENT* events, + size_t event_count); // Added with API 1 + + static bool kodi_addon_peripheral_send_event_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct PERIPHERAL_EVENT* event); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_get_joystick_info_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index, + struct JOYSTICK_INFO* info); // Added with API 1 + + static void kodi_addon_peripheral_free_joystick_info_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_INFO* info); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_get_features_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + struct JOYSTICK_FEATURE** features, + size_t* feature_count); // Added with API 1 + + static void kodi_addon_peripheral_free_features_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_FEATURE* features, + size_t feature_count); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_map_features_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id, + const struct JOYSTICK_FEATURE* features, + size_t feature_count); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_get_ignored_primitives_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + struct JOYSTICK_DRIVER_PRIMITIVE** primitives, + size_t* primitive_count); // Added with API 1 + + static void kodi_addon_peripheral_free_primitives_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); // Added with API 1 + + static enum PERIPHERAL_ERROR kodi_addon_peripheral_set_ignored_primitives_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const struct JOYSTICK_DRIVER_PRIMITIVE* primitives, + size_t primitive_count); // Added with API 1 + + static void kodi_addon_peripheral_save_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick); // Added with API 1 + + static void kodi_addon_peripheral_revert_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick); // Added with API 1 + + static void kodi_addon_peripheral_reset_button_map_v1( + void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + const struct JOYSTICK_INFO* joystick, + const char* controller_id); // Added with API 1 + + static void kodi_addon_peripheral_power_off_joystick_v1(void* thisClassHdl, + KODI_ADDON_PERIPHERAL_HDL hdl, + unsigned int index); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.cpp new file mode 100644 index 0000000000000..68abe2bdce1ed --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.cpp @@ -0,0 +1,2651 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "pvr.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_pvr_h::InitDirect(directFuncToAddon_addoninstance_pvr_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_pvr_get_capabilities_v1 = kodi_addon_pvr_get_capabilities_v1; + ifcToAddon->kodi_addon_pvr_get_backend_name_v1 = kodi_addon_pvr_get_backend_name_v1; + ifcToAddon->kodi_addon_pvr_get_backend_version_v1 = kodi_addon_pvr_get_backend_version_v1; + ifcToAddon->kodi_addon_pvr_get_backend_hostname_v1 = kodi_addon_pvr_get_backend_hostname_v1; + ifcToAddon->kodi_addon_pvr_get_connection_string_v1 = kodi_addon_pvr_get_connection_string_v1; + ifcToAddon->kodi_addon_pvr_get_drive_space_v1 = kodi_addon_pvr_get_drive_space_v1; + ifcToAddon->kodi_addon_pvr_call_settings_menu_hook_v1 = kodi_addon_pvr_call_settings_menu_hook_v1; + ifcToAddon->kodi_addon_pvr_get_channels_amount_v1 = kodi_addon_pvr_get_channels_amount_v1; + ifcToAddon->kodi_addon_pvr_get_channels_v1 = kodi_addon_pvr_get_channels_v1; + ifcToAddon->kodi_addon_pvr_get_channel_stream_properties_v1 = + kodi_addon_pvr_get_channel_stream_properties_v1; + ifcToAddon->kodi_addon_pvr_get_signal_status_v1 = kodi_addon_pvr_get_signal_status_v1; + ifcToAddon->kodi_addon_pvr_get_descramble_info_v1 = kodi_addon_pvr_get_descramble_info_v1; + ifcToAddon->kodi_addon_pvr_get_providers_amount_v1 = kodi_addon_pvr_get_providers_amount_v1; + ifcToAddon->kodi_addon_pvr_get_providers_v1 = kodi_addon_pvr_get_providers_v1; + ifcToAddon->kodi_addon_pvr_get_channel_groups_amount_v1 = + kodi_addon_pvr_get_channel_groups_amount_v1; + ifcToAddon->kodi_addon_pvr_get_channel_groups_v1 = kodi_addon_pvr_get_channel_groups_v1; + ifcToAddon->kodi_addon_pvr_get_channel_group_members_v1 = + kodi_addon_pvr_get_channel_group_members_v1; + ifcToAddon->kodi_addon_pvr_delete_channel_v1 = kodi_addon_pvr_delete_channel_v1; + ifcToAddon->kodi_addon_pvr_rename_channel_v1 = kodi_addon_pvr_rename_channel_v1; + ifcToAddon->kodi_addon_pvr_open_dialog_channel_settings_v1 = + kodi_addon_pvr_open_dialog_channel_settings_v1; + ifcToAddon->kodi_addon_pvr_open_dialog_channel_add_v1 = kodi_addon_pvr_open_dialog_channel_add_v1; + ifcToAddon->kodi_addon_pvr_open_dialog_channel_scan_v1 = + kodi_addon_pvr_open_dialog_channel_scan_v1; + ifcToAddon->kodi_addon_pvr_call_channel_menu_hook_v1 = kodi_addon_pvr_call_channel_menu_hook_v1; + ifcToAddon->kodi_addon_pvr_get_epg_for_channel_v1 = kodi_addon_pvr_get_epg_for_channel_v1; + ifcToAddon->kodi_addon_pvr_is_epg_tag_recordable_v1 = kodi_addon_pvr_is_epg_tag_recordable_v1; + ifcToAddon->kodi_addon_pvr_is_epg_tag_playable_v1 = kodi_addon_pvr_is_epg_tag_playable_v1; + ifcToAddon->kodi_addon_pvr_get_epg_tag_edl_v1 = kodi_addon_pvr_get_epg_tag_edl_v1; + ifcToAddon->kodi_addon_pvr_get_epg_tag_stream_properties_v1 = + kodi_addon_pvr_get_epg_tag_stream_properties_v1; + ifcToAddon->kodi_addon_pvr_set_epg_max_past_days_v1 = kodi_addon_pvr_set_epg_max_past_days_v1; + ifcToAddon->kodi_addon_pvr_set_epg_max_future_days_v1 = kodi_addon_pvr_set_epg_max_future_days_v1; + ifcToAddon->kodi_addon_pvr_call_epg_menu_hook_v1 = kodi_addon_pvr_call_epg_menu_hook_v1; + ifcToAddon->kodi_addon_pvr_get_recordings_amount_v1 = kodi_addon_pvr_get_recordings_amount_v1; + ifcToAddon->kodi_addon_pvr_get_recordings_v1 = kodi_addon_pvr_get_recordings_v1; + ifcToAddon->kodi_addon_pvr_delete_recording_v1 = kodi_addon_pvr_delete_recording_v1; + ifcToAddon->kodi_addon_pvr_undelete_recording_v1 = kodi_addon_pvr_undelete_recording_v1; + ifcToAddon->kodi_addon_pvr_delete_all_recordings_from_trash_v1 = + kodi_addon_pvr_delete_all_recordings_from_trash_v1; + ifcToAddon->kodi_addon_pvr_rename_recording_v1 = kodi_addon_pvr_rename_recording_v1; + ifcToAddon->kodi_addon_pvr_set_recording_lifetime_v1 = kodi_addon_pvr_set_recording_lifetime_v1; + ifcToAddon->kodi_addon_pvr_set_recording_play_count_v1 = + kodi_addon_pvr_set_recording_play_count_v1; + ifcToAddon->kodi_addon_pvr_set_recording_last_played_position_v1 = + kodi_addon_pvr_set_recording_last_played_position_v1; + ifcToAddon->kodi_addon_pvr_get_recording_last_played_position_v1 = + kodi_addon_pvr_get_recording_last_played_position_v1; + ifcToAddon->kodi_addon_pvr_get_recording_edl_v1 = kodi_addon_pvr_get_recording_edl_v1; + ifcToAddon->kodi_addon_pvr_get_recording_size_v1 = kodi_addon_pvr_get_recording_size_v1; + ifcToAddon->kodi_addon_pvr_get_recording_stream_properties_v1 = + kodi_addon_pvr_get_recording_stream_properties_v1; + ifcToAddon->kodi_addon_pvr_call_recording_menu_hook_v1 = + kodi_addon_pvr_call_recording_menu_hook_v1; + ifcToAddon->kodi_addon_pvr_get_timer_types_v1 = kodi_addon_pvr_get_timer_types_v1; + ifcToAddon->kodi_addon_pvr_get_timers_amount_v1 = kodi_addon_pvr_get_timers_amount_v1; + ifcToAddon->kodi_addon_pvr_get_timers_v1 = kodi_addon_pvr_get_timers_v1; + ifcToAddon->kodi_addon_pvr_add_timer_v1 = kodi_addon_pvr_add_timer_v1; + ifcToAddon->kodi_addon_pvr_delete_timer_v1 = kodi_addon_pvr_delete_timer_v1; + ifcToAddon->kodi_addon_pvr_update_timer_v1 = kodi_addon_pvr_update_timer_v1; + ifcToAddon->kodi_addon_pvr_call_timer_menu_hook_v1 = kodi_addon_pvr_call_timer_menu_hook_v1; + ifcToAddon->kodi_addon_pvr_on_system_sleep_v1 = kodi_addon_pvr_on_system_sleep_v1; + ifcToAddon->kodi_addon_pvr_on_system_wake_v1 = kodi_addon_pvr_on_system_wake_v1; + ifcToAddon->kodi_addon_pvr_on_power_saving_activated_v1 = + kodi_addon_pvr_on_power_saving_activated_v1; + ifcToAddon->kodi_addon_pvr_on_power_saving_deactivated_v1 = + kodi_addon_pvr_on_power_saving_deactivated_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_pvr_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_pvr_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_pvr_get_capabilities_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_capabilities_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + struct PVR_ADDON_CAPABILITIES capabilities; + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_capabilities_v1(this, auto_gen_hdl, &capabilities); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_capabilities_v1(auto_gen_ret, &capabilities)); + return true; + } + case funcChild_kodi_addon_pvr_get_backend_name_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_backend_name_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + std::string str; + size_t mem_size = std::get<1>(t); + str.reserve(mem_size); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_backend_name_v1(this, auto_gen_hdl, &str[0], mem_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_backend_name_v1(auto_gen_ret, str)); + return true; + } + case funcChild_kodi_addon_pvr_get_backend_version_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_backend_version_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + std::string str; + size_t mem_size = std::get<1>(t); + str.reserve(mem_size); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_backend_version_v1(this, auto_gen_hdl, &str[0], mem_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_backend_version_v1(auto_gen_ret, str)); + return true; + } + case funcChild_kodi_addon_pvr_get_backend_hostname_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_backend_hostname_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + std::string str; + size_t mem_size = std::get<1>(t); + str.reserve(mem_size); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_backend_hostname_v1(this, auto_gen_hdl, &str[0], mem_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_backend_hostname_v1(auto_gen_ret, str)); + return true; + } + case funcChild_kodi_addon_pvr_get_connection_string_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_connection_string_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + std::string str; + size_t mem_size = std::get<1>(t); + str.reserve(mem_size); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_connection_string_v1(this, auto_gen_hdl, &str[0], mem_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_connection_string_v1(auto_gen_ret, str)); + return true; + } + case funcChild_kodi_addon_pvr_get_drive_space_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1)( KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_drive_space_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + uint64_t total = std::get<1>(t); + uint64_t used = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_drive_space_v1(this, auto_gen_hdl, &total, &used); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_drive_space_v1(auto_gen_ret, total, used)); + return true; + } + case funcChild_kodi_addon_pvr_call_settings_menu_hook_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_call_settings_menu_hook_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_MENUHOOK menuhook; + std::get<1>(t).SetCStructure(&menuhook); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_call_settings_menu_hook_v1(this, auto_gen_hdl, &menuhook); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_call_settings_menu_hook_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_channels_amount_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channels_amount_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int amount = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_channels_amount_v1(this, auto_gen_hdl, &amount); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_channels_amount_v1(auto_gen_ret, amount)); + return true; + } + case funcChild_kodi_addon_pvr_get_channels_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channels_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + bool radio = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_channels_v1(this, auto_gen_hdl, handle, radio); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_channels_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_channel_stream_properties_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channel_stream_properties_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&channel); + struct PVR_NAMED_VALUE properties; + size_t properties_count = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_channel_stream_properties_v1( + this, auto_gen_hdl, &channel, &properties, &properties_count); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_channel_stream_properties_v1( + auto_gen_ret, &properties, properties_count)); + return true; + } + case funcChild_kodi_addon_pvr_get_signal_status_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_SIGNAL_STATUS* signal_status); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_signal_status_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int channel_uid = std::get<1>(t); + struct PVR_SIGNAL_STATUS signal_status; + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_signal_status_v1(this, auto_gen_hdl, channel_uid, &signal_status); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_signal_status_v1(auto_gen_ret, &signal_status)); + return true; + } + case funcChild_kodi_addon_pvr_get_descramble_info_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_DESCRAMBLE_INFO* descramble_info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_descramble_info_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int channel_uid = std::get<1>(t); + struct PVR_DESCRAMBLE_INFO descramble_info; + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_descramble_info_v1(this, auto_gen_hdl, channel_uid, &descramble_info); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_pvr_get_descramble_info_v1(auto_gen_ret, &descramble_info)); + return true; + } + case funcChild_kodi_addon_pvr_get_providers_amount_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_providers_amount_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int amount = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_providers_amount_v1(this, auto_gen_hdl, &amount); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_providers_amount_v1(auto_gen_ret, amount)); + return true; + } + case funcChild_kodi_addon_pvr_get_providers_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_providers_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_providers_v1(this, auto_gen_hdl, handle); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_providers_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_channel_groups_amount_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channel_groups_amount_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int amount = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_channel_groups_amount_v1(this, auto_gen_hdl, &amount); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_channel_groups_amount_v1(auto_gen_ret, amount)); + return true; + } + case funcChild_kodi_addon_pvr_get_channel_groups_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channel_groups_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + bool radio = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_channel_groups_v1(this, auto_gen_hdl, handle, radio); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_channel_groups_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_channel_group_members_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_channel_group_members_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL_GROUP group; + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&group); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_channel_group_members_v1(this, auto_gen_hdl, handle, &group); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_channel_group_members_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_delete_channel_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_delete_channel_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&channel); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_delete_channel_v1(this, auto_gen_hdl, &channel); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_delete_channel_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_rename_channel_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_rename_channel_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&channel); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_rename_channel_v1(this, auto_gen_hdl, &channel); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_rename_channel_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_open_dialog_channel_settings_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_open_dialog_channel_settings_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&channel); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_open_dialog_channel_settings_v1(this, auto_gen_hdl, &channel); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_open_dialog_channel_settings_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_open_dialog_channel_add_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_open_dialog_channel_add_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&channel); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_open_dialog_channel_add_v1(this, auto_gen_hdl, &channel); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_open_dialog_channel_add_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_open_dialog_channel_scan_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_open_dialog_channel_scan_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_open_dialog_channel_scan_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_open_dialog_channel_scan_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_call_channel_menu_hook_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_CHANNEL* channel); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_call_channel_menu_hook_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_MENUHOOK menuhook; + PVR_CHANNEL channel; + std::get<1>(t).SetCStructure(&menuhook); + std::get<2>(t).SetCStructure(&channel); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_call_channel_menu_hook_v1(this, auto_gen_hdl, &menuhook, &channel); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_call_channel_menu_hook_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_epg_for_channel_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, int channel_uid, time_t start, time_t end); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_epg_for_channel_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + int channel_uid = std::get<2>(t); + time_t start = std::get<3>(t); + time_t end = std::get<4>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_epg_for_channel_v1( + this, auto_gen_hdl, handle, channel_uid, start, end); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_epg_for_channel_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_is_epg_tag_recordable_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_recordable); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_is_epg_tag_recordable_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + EPG_TAG tag; + std::get<1>(t).SetCStructure(&tag); + bool is_recordable = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_is_epg_tag_recordable_v1(this, auto_gen_hdl, &tag, &is_recordable); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_pvr_is_epg_tag_recordable_v1(auto_gen_ret, is_recordable)); + return true; + } + case funcChild_kodi_addon_pvr_is_epg_tag_playable_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_playable); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_is_epg_tag_playable_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + EPG_TAG tag; + std::get<1>(t).SetCStructure(&tag); + bool is_playable = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_is_epg_tag_playable_v1(this, auto_gen_hdl, &tag, &is_playable); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_is_epg_tag_playable_v1(auto_gen_ret, is_playable)); + return true; + } + case funcChild_kodi_addon_pvr_get_epg_tag_edl_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_EDL_ENTRY edl[], size_t* size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_epg_tag_edl_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + EPG_TAG tag; + std::get<1>(t).SetCStructure(&tag); + std::vector& ifc_edl = std::get<2>(t); + size_t size = std::get<3>(t); + std::vector edl(size); + for (size_t i = 0; i < size; ++i) + { + ifc_edl[i].SetCStructure(&edl[i]); + } + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_epg_tag_edl_v1(this, auto_gen_hdl, &tag, edl.data(), &size); + + for (size_t i = 0; i < size; ++i) + { + ifc_edl[i] = IFC_PVR_EDL_ENTRY(&edl[i]); + } + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_epg_tag_edl_v1(auto_gen_ret, ifc_edl, size)); + return true; + } + case funcChild_kodi_addon_pvr_get_epg_tag_stream_properties_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_epg_tag_stream_properties_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + EPG_TAG tag; + std::get<1>(t).SetCStructure(&tag); + struct PVR_NAMED_VALUE properties; + size_t properties_count = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_epg_tag_stream_properties_v1( + this, auto_gen_hdl, &tag, &properties, &properties_count); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_epg_tag_stream_properties_v1( + auto_gen_ret, &properties, properties_count)); + return true; + } + case funcChild_kodi_addon_pvr_set_epg_max_past_days_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int past_days); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_set_epg_max_past_days_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int past_days = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_set_epg_max_past_days_v1(this, auto_gen_hdl, past_days); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_set_epg_max_past_days_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_set_epg_max_future_days_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int future_days); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_set_epg_max_future_days_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int future_days = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_set_epg_max_future_days_v1(this, auto_gen_hdl, future_days); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_set_epg_max_future_days_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_call_epg_menu_hook_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct EPG_TAG* tag); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_call_epg_menu_hook_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_MENUHOOK menuhook; + EPG_TAG tag; + std::get<1>(t).SetCStructure(&menuhook); + std::get<2>(t).SetCStructure(&tag); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_call_epg_menu_hook_v1(this, auto_gen_hdl, &menuhook, &tag); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_call_epg_menu_hook_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_recordings_amount_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recordings_amount_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool deleted = std::get<1>(t); + int amount = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_recordings_amount_v1(this, auto_gen_hdl, deleted, &amount); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_recordings_amount_v1(auto_gen_ret, amount)); + return true; + } + case funcChild_kodi_addon_pvr_get_recordings_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool deleted); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recordings_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + bool deleted = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_recordings_v1(this, auto_gen_hdl, handle, deleted); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_recordings_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_delete_recording_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_delete_recording_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_delete_recording_v1(this, auto_gen_hdl, &recording); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_delete_recording_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_undelete_recording_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_undelete_recording_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_undelete_recording_v1(this, auto_gen_hdl, &recording); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_undelete_recording_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_delete_all_recordings_from_trash_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_delete_all_recordings_from_trash_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_delete_all_recordings_from_trash_v1(this, auto_gen_hdl); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_delete_all_recordings_from_trash_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_rename_recording_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_rename_recording_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_rename_recording_v1(this, auto_gen_hdl, &recording); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_rename_recording_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_set_recording_lifetime_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_set_recording_lifetime_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_set_recording_lifetime_v1(this, auto_gen_hdl, &recording); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_set_recording_lifetime_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_set_recording_play_count_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_set_recording_play_count_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + int count = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_set_recording_play_count_v1(this, auto_gen_hdl, &recording, count); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_set_recording_play_count_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_set_recording_last_played_position_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int last_played_position); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_set_recording_last_played_position_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + int last_played_position = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_set_recording_last_played_position_v1( + this, auto_gen_hdl, &recording, last_played_position); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_pvr_set_recording_last_played_position_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_recording_last_played_position_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int* last_played_position); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recording_last_played_position_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + int last_played_position = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_recording_last_played_position_v1( + this, auto_gen_hdl, &recording, &last_played_position); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_recording_last_played_position_v1( + auto_gen_ret, last_played_position)); + return true; + } + case funcChild_kodi_addon_pvr_get_recording_edl_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_EDL_ENTRY edl[], size_t* size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recording_edl_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + std::vector& ifc_edl = std::get<2>(t); + size_t size = std::get<3>(t); + std::vector edl(size); + for (size_t i = 0; i < size; ++i) + { + ifc_edl[i].SetCStructure(&edl[i]); + } + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_recording_edl_v1(this, auto_gen_hdl, &recording, edl.data(), &size); + + for (size_t i = 0; i < size; ++i) + { + ifc_edl[i] = IFC_PVR_EDL_ENTRY(&edl[i]); + } + msgpack::pack(out, + msgChild_OUT_kodi_addon_pvr_get_recording_edl_v1(auto_gen_ret, ifc_edl, size)); + return true; + } + case funcChild_kodi_addon_pvr_get_recording_size_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int64_t* size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recording_size_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + int64_t size = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_recording_size_v1(this, auto_gen_hdl, &recording, &size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_recording_size_v1(auto_gen_ret, size)); + return true; + } + case funcChild_kodi_addon_pvr_get_recording_stream_properties_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_NAMED_VALUE* properties, size_t* properties_count); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_recording_stream_properties_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&recording); + struct PVR_NAMED_VALUE properties; + size_t properties_count = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_recording_stream_properties_v1( + this, auto_gen_hdl, &recording, &properties, &properties_count); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_recording_stream_properties_v1( + auto_gen_ret, &properties, properties_count)); + return true; + } + case funcChild_kodi_addon_pvr_call_recording_menu_hook_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_RECORDING* recording); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_call_recording_menu_hook_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_MENUHOOK menuhook; + PVR_RECORDING recording; + std::get<1>(t).SetCStructure(&menuhook); + std::get<2>(t).SetCStructure(&recording); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_call_recording_menu_hook_v1(this, auto_gen_hdl, &menuhook, &recording); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_call_recording_menu_hook_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_get_timer_types_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_TIMER_TYPE types[], size_t* types_count); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_timer_types_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + std::vector& ifc_types = std::get<1>(t); + size_t types_count = std::get<2>(t); + std::vector types(types_count); + for (size_t i = 0; i < types_count; ++i) + { + ifc_types[i].SetCStructure(&types[i]); + } + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_timer_types_v1(this, auto_gen_hdl, types.data(), &types_count); + + for (size_t i = 0; i < types_count; ++i) + { + ifc_types[i] = IFC_PVR_TIMER_TYPE(&types[i]); + } + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_timer_types_v1(auto_gen_ret, ifc_types, + types_count)); + return true; + } + case funcChild_kodi_addon_pvr_get_timers_amount_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_timers_amount_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int amount = std::get<1>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_get_timers_amount_v1(this, auto_gen_hdl, &amount); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_timers_amount_v1(auto_gen_ret, amount)); + return true; + } + case funcChild_kodi_addon_pvr_get_timers_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_get_timers_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_PVR_TRANSFER_HDL handle = + reinterpret_cast(std::get<1>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_get_timers_v1(this, auto_gen_hdl, handle); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_get_timers_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_add_timer_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ADD_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_add_timer_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_TIMER timer; + std::get<1>(t).SetCStructure(&timer); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_add_timer_v1(this, auto_gen_hdl, &timer); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_add_timer_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_delete_timer_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer, bool force_delete); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_delete_timer_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_TIMER timer; + std::get<1>(t).SetCStructure(&timer); + bool force_delete = std::get<2>(t); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_delete_timer_v1(this, auto_gen_hdl, &timer, force_delete); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_delete_timer_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_update_timer_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_update_timer_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_TIMER timer; + std::get<1>(t).SetCStructure(&timer); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_update_timer_v1(this, auto_gen_hdl, &timer); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_update_timer_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_call_timer_menu_hook_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_TIMER* timer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_call_timer_menu_hook_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + PVR_MENUHOOK menuhook; + PVR_TIMER timer; + std::get<1>(t).SetCStructure(&menuhook); + std::get<2>(t).SetCStructure(&timer); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_call_timer_menu_hook_v1(this, auto_gen_hdl, &menuhook, &timer); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_call_timer_menu_hook_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_on_system_sleep_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_on_system_sleep_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_on_system_sleep_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_on_system_sleep_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_on_system_wake_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_on_system_wake_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_on_system_wake_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_on_system_wake_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_on_power_saving_activated_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_on_power_saving_activated_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = kodi_addon_pvr_on_power_saving_activated_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_on_power_saving_activated_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_pvr_on_power_saving_deactivated_v1: + { + // Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_pvr_on_power_saving_deactivated_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + enum PVR_ERROR auto_gen_ret = + kodi_addon_pvr_on_power_saving_deactivated_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_pvr_on_power_saving_deactivated_v1(auto_gen_ret)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_capabilities_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + struct PVR_ADDON_CAPABILITIES* capabilities) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_capabilities) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_capabilities(union_data->hdl, capabilities); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_name_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_backend_name) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_backend_name(union_data->hdl, str, mem_size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_version_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_backend_version) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_backend_version(union_data->hdl, str, mem_size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_backend_hostname_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_backend_hostname) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_backend_hostname(union_data->hdl, str, mem_size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_connection_string_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_connection_string) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_connection_string(union_data->hdl, str, mem_size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_drive_space_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_drive_space) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_drive_space(union_data->hdl, total, used); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_settings_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.call_settings_menu_hook) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.call_settings_menu_hook(union_data->hdl, menuhook); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channels_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int* amount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channels_amount) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_channels_amount(union_data->hdl, amount); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channels_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channels) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_channels(union_data->hdl, handle, radio); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channel_stream_properties) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_channel_stream_properties( + union_data->hdl, channel, properties, properties_count); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_signal_status_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_SIGNAL_STATUS* signal_status) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_signal_status) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_signal_status( + union_data->hdl, channel_uid, signal_status); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_descramble_info_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_DESCRAMBLE_INFO* descramble_info) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_descramble_info) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_descramble_info( + union_data->hdl, channel_uid, descramble_info); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_providers_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int* amount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_providers_amount) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_providers_amount(union_data->hdl, amount); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_providers_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_providers) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_providers(union_data->hdl, handle); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_groups_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int* amount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channel_groups_amount) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_channel_groups_amount(union_data->hdl, amount); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_groups_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channel_groups) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_channel_groups(union_data->hdl, handle, radio); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_channel_group_members_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_channel_group_members) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_channel_group_members(union_data->hdl, + handle, group); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_channel_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.delete_channel) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.delete_channel(union_data->hdl, channel); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_rename_channel_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.rename_channel) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.rename_channel(union_data->hdl, channel); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_settings_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.open_dialog_channel_settings) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.open_dialog_channel_settings(union_data->hdl, channel); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_add_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.open_dialog_channel_add) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.open_dialog_channel_add(union_data->hdl, channel); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_open_dialog_channel_scan_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.open_dialog_channel_scan) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.open_dialog_channel_scan(union_data->hdl); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_channel_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_CHANNEL* channel) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.call_channel_menu_hook) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.call_channel_menu_hook(union_data->hdl, + menuhook, channel); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_for_channel_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + int channel_uid, + time_t start, + time_t end) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_epg_for_channel) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_epg_for_channel(union_data->hdl, handle, + channel_uid, start, end); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_is_epg_tag_recordable_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_recordable) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.is_epg_tag_recordable) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.is_epg_tag_recordable(union_data->hdl, tag, + is_recordable); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_is_epg_tag_playable_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_playable) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.is_epg_tag_playable) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.is_epg_tag_playable(union_data->hdl, tag, is_playable); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_tag_edl_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_EDL_ENTRY edl[], + size_t* size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_epg_tag_edl) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_epg_tag_edl(union_data->hdl, tag, edl, size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_epg_tag_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_epg_tag_stream_properties) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_epg_tag_stream_properties( + union_data->hdl, tag, properties, properties_count); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_epg_max_past_days_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int past_days) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.set_epg_max_past_days) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.set_epg_max_past_days(union_data->hdl, past_days); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_epg_max_future_days_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int future_days) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.set_epg_max_future_days) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.set_epg_max_future_days(union_data->hdl, future_days); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_epg_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct EPG_TAG* tag) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.call_epg_menu_hook) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.call_epg_menu_hook(union_data->hdl, menuhook, tag); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recordings_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recordings_amount) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_recordings_amount(union_data->hdl, deleted, amount); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recordings_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool deleted) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recordings) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_recordings(union_data->hdl, handle, deleted); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.delete_recording) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.delete_recording(union_data->hdl, recording); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_undelete_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.undelete_recording) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.undelete_recording(union_data->hdl, recording); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_all_recordings_from_trash_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.delete_all_recordings_from_trash) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.delete_all_recordings_from_trash(union_data->hdl); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_rename_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.rename_recording) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.rename_recording(union_data->hdl, recording); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_lifetime_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.set_recording_lifetime) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.set_recording_lifetime(union_data->hdl, recording); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_play_count_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.set_recording_play_count) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.set_recording_play_count(union_data->hdl, + recording, count); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_set_recording_last_played_position_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int last_played_position) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.set_recording_last_played_position) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.set_recording_last_played_position( + union_data->hdl, recording, last_played_position); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_last_played_position_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int* last_played_position) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recording_last_played_position) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_recording_last_played_position( + union_data->hdl, recording, last_played_position); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_edl_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_EDL_ENTRY edl[], + size_t* size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recording_edl) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_recording_edl(union_data->hdl, recording, + edl, size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_size_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int64_t* size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recording_size) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_recording_size(union_data->hdl, recording, size); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_recording_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_recording_stream_properties) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_recording_stream_properties( + union_data->hdl, recording, properties, properties_count); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_recording_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_RECORDING* recording) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.call_recording_menu_hook) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.call_recording_menu_hook( + union_data->hdl, menuhook, recording); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timer_types_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + struct PVR_TIMER_TYPE types[], + size_t* types_count) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_timer_types) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.get_timer_types(union_data->hdl, types, types_count); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timers_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int* amount) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_timers_amount) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_timers_amount(union_data->hdl, amount); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_get_timers_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.get_timers) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.get_timers(union_data->hdl, handle); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_add_timer_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.add_timer) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.add_timer(union_data->hdl, timer); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_delete_timer_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer, + bool force_delete) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.delete_timer) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.delete_timer(union_data->hdl, timer, force_delete); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_update_timer_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.update_timer) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.update_timer(union_data->hdl, timer); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_call_timer_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_TIMER* timer) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.call_timer_menu_hook) + { + auto_gen_ret = + union_data->types.kodi_addon_pvr.v1.call_timer_menu_hook(union_data->hdl, menuhook, timer); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_system_sleep_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.on_system_sleep) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.on_system_sleep(union_data->hdl); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_system_wake_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.on_system_wake) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.on_system_wake(union_data->hdl); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_power_saving_activated_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.on_power_saving_activated) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.on_power_saving_activated(union_data->hdl); + } + return auto_gen_ret; +} + +enum PVR_ERROR CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_on_power_saving_deactivated_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return PVR_ERROR_NO_ERROR; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum PVR_ERROR auto_gen_ret = PVR_ERROR_NO_ERROR; + if (union_data->types.kodi_addon_pvr.v1.on_power_saving_deactivated) + { + auto_gen_ret = union_data->types.kodi_addon_pvr.v1.on_power_saving_deactivated(union_data->hdl); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_get_epg_max_future_days_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_get_epg_max_future_days_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_pvr_get_epg_max_future_days_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + return auto_gen_group.kodi_addon_pvr_get_epg_max_future_days_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_get_epg_max_past_days_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_get_epg_max_past_days_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_pvr_get_epg_max_past_days_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + return auto_gen_group.kodi_addon_pvr_get_epg_max_past_days_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_OWN_HDL hdl, const struct PVR_MENUHOOK* hook) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_OWN_HDL hdl, const struct PVR_MENUHOOK* hook) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ + + if (hdl == nullptr || hook == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_add_menu_hook_v1(PtrValue(hdl), hook)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_add_menu_hook_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_add_menu_hook_v1(auto_gen_group.thisClassHdl, hdl, hook); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_OWN_HDL hdl, + const char* name, + const char* fileName, + bool on) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_OWN_HDL hdl, const char* name, const char* fileName, bool on) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ + + if (hdl == nullptr || name == nullptr || fileName == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_recording_notification_v1(PtrValue(hdl), name, + fileName, on)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_recording_notification_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_recording_notification_v1(auto_gen_group.thisClassHdl, hdl, name, + fileName, on); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_connection_state_change(KODI_OWN_HDL hdl, + const char* strConnectionString, + enum PVR_CONNECTION_STATE newState, + const char* strMessage) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_connection_state_change(KODI_OWN_HDL hdl, const char* strConnectionString, enum PVR_CONNECTION_STATE newState, const char* strMessage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ + + if (hdl == nullptr || strConnectionString == nullptr || strMessage == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_connection_state_change_v1( + PtrValue(hdl), strConnectionString, newState, strMessage)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_connection_state_change_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_connection_state_change_v1( + auto_gen_group.thisClassHdl, hdl, strConnectionString, newState, strMessage); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_epg_event_state_change(KODI_OWN_HDL hdl, + struct EPG_TAG* tag, + enum EPG_EVENT_STATE newState) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_epg_event_state_change(KODI_OWN_HDL hdl, struct EPG_TAG* tag, enum EPG_EVENT_STATE newState) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ + + if (hdl == nullptr || tag == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_addon_pvr_epg_event_state_change_v1(PtrValue(hdl), newState)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_epg_event_state_change_v1, in, + out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_pvr_epg_event_state_change_v1 t = ident.get().as(); + + std::get<0>(t).SetCStructure(tag); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_epg_event_state_change_v1(auto_gen_group.thisClassHdl, hdl, tag, + newState); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_entry(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL* chan) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL* chan) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || chan == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1( + PtrValue(hdl), PtrValue(handle), chan)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_channel_entry_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_channel_entry_v1(auto_gen_group.thisClassHdl, hdl, handle, + chan); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_provider_entry( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_PROVIDER* chanProvider) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_provider_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_PROVIDER* chanProvider) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || chanProvider == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1( + PtrValue(hdl), PtrValue(handle), chanProvider)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_provider_entry_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_provider_entry_v1(auto_gen_group.thisClassHdl, hdl, handle, + chanProvider); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || group == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1( + PtrValue(hdl), PtrValue(handle), group)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_channel_group_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_channel_group_v1(auto_gen_group.thisClassHdl, hdl, handle, + group); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group_member( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP_MEMBER* member) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group_member( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP_MEMBER* member) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || member == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1( + PtrValue(hdl), PtrValue(handle), member)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_channel_group_member_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_channel_group_member_v1(auto_gen_group.thisClassHdl, hdl, + handle, member); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_epg_entry(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct EPG_TAG* epgentry) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_epg_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct EPG_TAG* epgentry) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || epgentry == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1( + PtrValue(hdl), PtrValue(handle), epgentry)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_epg_entry_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_epg_entry_v1(auto_gen_group.thisClassHdl, hdl, handle, + epgentry); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_recording_entry( + KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_RECORDING* recording) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_recording_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_RECORDING* recording) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || recording == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1( + PtrValue(hdl), PtrValue(handle), recording)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_recording_entry_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_recording_entry_v1(auto_gen_group.thisClassHdl, hdl, + handle, recording); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_timer_entry(KODI_OWN_HDL hdl, + const KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_TIMER* timer) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_timer_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_TIMER* timer) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || timer == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1( + PtrValue(hdl), PtrValue(handle), timer)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_transfer_timer_entry_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_transfer_timer_entry_v1(auto_gen_group.thisClassHdl, hdl, handle, + timer); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_trigger_channel_update_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_channel_update_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_channel_update_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_trigger_providers_update_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_providers_update_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_providers_update_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_trigger_channel_groups_update_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_channel_groups_update_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_channel_groups_update_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_OWN_HDL hdl, unsigned int iChannelUid) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_OWN_HDL hdl, unsigned int iChannelUid) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_addon_pvr_trigger_epg_update_v1(PtrValue(hdl), iChannelUid)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_epg_update_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_epg_update_v1(auto_gen_group.thisClassHdl, hdl, + iChannelUid); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_trigger_recording_update_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_recording_update_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_recording_update_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_pvr_trigger_timer_update_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_pvr_h, funcParent_kodi_addon_pvr_trigger_timer_update_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_pvr_h; + auto_gen_group.kodi_addon_pvr_trigger_timer_update_v1(auto_gen_group.thisClassHdl, hdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.h new file mode 100644 index 0000000000000..e209eeff5b525 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.h @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/pvr.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_pvr_h; +struct directFuncToKodi_addoninstance_pvr_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_pvr_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_pvr_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_pvr_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static enum PVR_ERROR kodi_addon_pvr_get_capabilities_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + struct PVR_ADDON_CAPABILITIES* capabilities); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_backend_name_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_backend_version_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_backend_hostname_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + char* str, + size_t mem_size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_connection_string_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_drive_space_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + uint64_t* total, + uint64_t* used); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_call_settings_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channels_amount_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channels_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channel_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_signal_status_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_SIGNAL_STATUS* signal_status); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_descramble_info_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int channel_uid, + struct PVR_DESCRAMBLE_INFO* descramble_info); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_providers_amount_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_providers_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channel_groups_amount_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int* amount); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channel_groups_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool radio); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_channel_group_members_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + const struct PVR_CHANNEL_GROUP* group); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_delete_channel_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_rename_channel_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_settings_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_add_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_CHANNEL* channel); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_open_dialog_channel_scan_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_call_channel_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_CHANNEL* channel); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_epg_for_channel_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + int channel_uid, + time_t start, + time_t end); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_is_epg_tag_recordable_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_recordable); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_is_epg_tag_playable_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + bool* is_playable); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_epg_tag_edl_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_EDL_ENTRY edl[], + size_t* size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_epg_tag_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct EPG_TAG* tag, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_set_epg_max_past_days_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int past_days); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_set_epg_max_future_days_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl, int future_days); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_call_epg_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct EPG_TAG* tag); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recordings_amount_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + bool deleted, + int* amount); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recordings_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle, + bool deleted); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_delete_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_undelete_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_delete_all_recordings_from_trash_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_rename_recording_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_set_recording_lifetime_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_set_recording_play_count_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int count); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_set_recording_last_played_position_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int last_played_position); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recording_last_played_position_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int* last_played_position); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recording_edl_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_EDL_ENTRY edl[], + size_t* size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recording_size_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + int64_t* size); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_recording_stream_properties_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_RECORDING* recording, + struct PVR_NAMED_VALUE* properties, + size_t* properties_count); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_call_recording_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_RECORDING* recording); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_timer_types_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + struct PVR_TIMER_TYPE types[], + size_t* types_count); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_timers_amount_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + int* amount); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_get_timers_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + KODI_ADDON_PVR_TRANSFER_HDL handle); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_add_timer_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_delete_timer_v1(void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer, + bool force_delete); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_update_timer_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_TIMER* timer); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_call_timer_menu_hook_v1( + void* thisClassHdl, + KODI_ADDON_PVR_HDL hdl, + const struct PVR_MENUHOOK* menuhook, + const struct PVR_TIMER* timer); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_on_system_sleep_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_on_system_wake_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_on_power_saving_activated_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 + + static enum PVR_ERROR kodi_addon_pvr_on_power_saving_deactivated_v1( + void* thisClassHdl, KODI_ADDON_PVR_HDL hdl); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.cpp new file mode 100644 index 0000000000000..8d005ec7ef8e7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.cpp @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "screensaver.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_screensaver_h::InitDirect( + directFuncToAddon_addoninstance_screensaver_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_screensaver_create_v1 = kodi_addon_screensaver_create_v1; + ifcToAddon->kodi_addon_screensaver_destroy_v1 = kodi_addon_screensaver_destroy_v1; + ifcToAddon->kodi_addon_screensaver_start_v1 = kodi_addon_screensaver_start_v1; + ifcToAddon->kodi_addon_screensaver_stop_v1 = kodi_addon_screensaver_stop_v1; + ifcToAddon->kodi_addon_screensaver_render_v1 = kodi_addon_screensaver_render_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_screensaver_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_screensaver_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_screensaver_create_v1: + { + // Original API call: typedef KODI_ADDON_SCREENSAVER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_screensaver_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_SCREENSAVER_HDL auto_gen_ret = + kodi_addon_screensaver_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_screensaver_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_screensaver_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_screensaver_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_screensaver_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_screensaver_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_start_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_screensaver_start_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_screensaver_start_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_screensaver_start_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_screensaver_stop_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_stop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_stop_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_screensaver_stop_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_screensaver_stop_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_screensaver_render_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_screensaver_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_screensaver_render_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_screensaver_render_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_screensaver_render_v1(this, auto_gen_hdl); + + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_SCREENSAVER_HDL CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_SCREENSAVER_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_screensaver.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_screensaver.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_destroy_v1( + void* thisClassHdl, KODI_ADDON_SCREENSAVER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_screensaver.v1.destroy) + { + union_data->types.kodi_addon_screensaver.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_start_v1( + void* thisClassHdl, KODI_ADDON_SCREENSAVER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_screensaver.v1.start) + { + auto_gen_ret = union_data->types.kodi_addon_screensaver.v1.start(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_stop_v1( + void* thisClassHdl, KODI_ADDON_SCREENSAVER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_screensaver.v1.stop) + { + union_data->types.kodi_addon_screensaver.v1.stop(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_render_v1( + void* thisClassHdl, KODI_ADDON_SCREENSAVER_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_screensaver.v1.render) + { + union_data->types.kodi_addon_screensaver.v1.render(union_data->hdl); + } +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties(KODI_OWN_HDL hdl, + struct SCREENSAVER_PROPS* props) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties(KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ + + if (hdl == nullptr || props == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_screensaver_get_properties_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_screensaver_h, + funcParent_kodi_addon_screensaver_get_properties_v1, in, out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_screensaver_get_properties_v1 t = ident.get().as(); + + std::get<0>(t).SetCStructure(props); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_screensaver_h; + auto_gen_group.kodi_addon_screensaver_get_properties_v1(auto_gen_group.thisClassHdl, hdl, props); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.h new file mode 100644 index 0000000000000..997ac90aec741 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/screensaver.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_screensaver_h; +struct directFuncToKodi_addoninstance_screensaver_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_screensaver_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_screensaver_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_screensaver_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_SCREENSAVER_HDL kodi_addon_screensaver_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_screensaver_destroy_v1(void* thisClassHdl, + KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + static bool kodi_addon_screensaver_start_v1(void* thisClassHdl, + KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + static void kodi_addon_screensaver_stop_v1(void* thisClassHdl, + KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + static void kodi_addon_screensaver_render_v1(void* thisClassHdl, + KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.cpp new file mode 100644 index 0000000000000..bd8b94dbda838 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.cpp @@ -0,0 +1,1123 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "vfs.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_vfs_h::InitDirect(directFuncToAddon_addoninstance_vfs_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_vfs_create_v1 = kodi_addon_vfs_create_v1; + ifcToAddon->kodi_addon_vfs_destroy_v1 = kodi_addon_vfs_destroy_v1; + ifcToAddon->kodi_addon_vfs_file_open_v1 = kodi_addon_vfs_file_open_v1; + ifcToAddon->kodi_addon_vfs_file_open_for_write_v1 = kodi_addon_vfs_file_open_for_write_v1; + ifcToAddon->kodi_addon_vfs_file_close_v1 = kodi_addon_vfs_file_close_v1; + ifcToAddon->kodi_addon_vfs_file_read_v1 = kodi_addon_vfs_file_read_v1; + ifcToAddon->kodi_addon_vfs_file_write_v1 = kodi_addon_vfs_file_write_v1; + ifcToAddon->kodi_addon_vfs_file_seek_v1 = kodi_addon_vfs_file_seek_v1; + ifcToAddon->kodi_addon_vfs_file_truncate_v1 = kodi_addon_vfs_file_truncate_v1; + ifcToAddon->kodi_addon_vfs_file_get_length_v1 = kodi_addon_vfs_file_get_length_v1; + ifcToAddon->kodi_addon_vfs_file_get_position_v1 = kodi_addon_vfs_file_get_position_v1; + ifcToAddon->kodi_addon_vfs_file_get_chunk_size_v1 = kodi_addon_vfs_file_get_chunk_size_v1; + ifcToAddon->kodi_addon_vfs_file_io_control_get_seek_possible_v1 = + kodi_addon_vfs_file_io_control_get_seek_possible_v1; + ifcToAddon->kodi_addon_vfs_file_io_control_get_cache_status_v1 = + kodi_addon_vfs_file_io_control_get_cache_status_v1; + ifcToAddon->kodi_addon_vfs_file_io_control_set_cache_rate_v1 = + kodi_addon_vfs_file_io_control_set_cache_rate_v1; + ifcToAddon->kodi_addon_vfs_file_io_control_set_retry_v1 = + kodi_addon_vfs_file_io_control_set_retry_v1; + ifcToAddon->kodi_addon_vfs_stat_v1 = kodi_addon_vfs_stat_v1; + ifcToAddon->kodi_addon_vfs_exists_v1 = kodi_addon_vfs_exists_v1; + ifcToAddon->kodi_addon_vfs_clear_out_idle_v1 = kodi_addon_vfs_clear_out_idle_v1; + ifcToAddon->kodi_addon_vfs_disconnect_all_v1 = kodi_addon_vfs_disconnect_all_v1; + ifcToAddon->kodi_addon_vfs_delete_it_v1 = kodi_addon_vfs_delete_it_v1; + ifcToAddon->kodi_addon_vfs_rename_v1 = kodi_addon_vfs_rename_v1; + ifcToAddon->kodi_addon_vfs_directory_exists_v1 = kodi_addon_vfs_directory_exists_v1; + ifcToAddon->kodi_addon_vfs_directory_remove_v1 = kodi_addon_vfs_directory_remove_v1; + ifcToAddon->kodi_addon_vfs_directory_create_v1 = kodi_addon_vfs_directory_create_v1; + ifcToAddon->kodi_addon_vfs_directory_get_v1 = kodi_addon_vfs_directory_get_v1; + ifcToAddon->kodi_addon_vfs_directory_contains_files_v1 = + kodi_addon_vfs_directory_contains_files_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_vfs_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_vfs_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_vfs_create_v1: + { + // Original API call: typedef KODI_ADDON_VFS_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_VFS_HDL auto_gen_ret = kodi_addon_vfs_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_vfs_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DESTROY_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_vfs_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_vfs_file_open_v1: + { + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_open_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + KODI_VFS_FILE_HDL auto_gen_ret = kodi_addon_vfs_file_open_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_open_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_vfs_file_open_for_write_v1: + { + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, bool overwrite); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_open_for_write_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool overwrite = std::get<2>(t); + KODI_VFS_FILE_HDL auto_gen_ret = + kodi_addon_vfs_file_open_for_write_v1(this, auto_gen_hdl, &url, overwrite); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_vfs_file_open_for_write_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_vfs_file_close_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_close_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_close_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + bool auto_gen_ret = kodi_addon_vfs_file_close_v1(this, auto_gen_hdl, context); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_close_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_read_v1: + { + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_READ_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint8_t* buffer, size_t buf_size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_read_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgChild_OUT_kodi_addon_vfs_file_read_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_read_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + size_t buf_size = std::get<2>(t); + std::vector buffer(buf_size); + ssize_t auto_gen_ret = + kodi_addon_vfs_file_read_v1(this, auto_gen_hdl, context, buffer.data(), buf_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_read_v1(auto_gen_ret, buffer)); + return true; + } + case funcChild_kodi_addon_vfs_file_write_v1: + { + // Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_WRITE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, const uint8_t* buffer, size_t buf_size); + // Tuple in: typedef std::tuple, size_t> msgChild__IN_kodi_addon_vfs_file_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_write_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_write_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + const std::vector& buffer = std::get<2>(t); + size_t buf_size = std::get<3>(t); + ssize_t auto_gen_ret = + kodi_addon_vfs_file_write_v1(this, auto_gen_hdl, context, buffer.data(), buf_size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_write_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_seek_v1: + { + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_SEEK_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t position, int whence); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_seek_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + int64_t position = std::get<2>(t); + int whence = std::get<3>(t); + int64_t auto_gen_ret = + kodi_addon_vfs_file_seek_v1(this, auto_gen_hdl, context, position, whence); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_seek_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_truncate_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t size); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_truncate_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + int64_t size = std::get<2>(t); + int auto_gen_ret = kodi_addon_vfs_file_truncate_v1(this, auto_gen_hdl, context, size); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_truncate_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_get_length_v1: + { + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_get_length_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + int64_t auto_gen_ret = kodi_addon_vfs_file_get_length_v1(this, auto_gen_hdl, context); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_get_length_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_get_position_v1: + { + // Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_get_position_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + int64_t auto_gen_ret = kodi_addon_vfs_file_get_position_v1(this, auto_gen_hdl, context); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_get_position_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_get_chunk_size_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_get_chunk_size_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + int auto_gen_ret = kodi_addon_vfs_file_get_chunk_size_v1(this, auto_gen_hdl, context); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_get_chunk_size_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_io_control_get_seek_possible_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_io_control_get_seek_possible_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + bool auto_gen_ret = + kodi_addon_vfs_file_io_control_get_seek_possible_v1(this, auto_gen_hdl, context); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_vfs_file_io_control_get_seek_possible_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_io_control_get_cache_status_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, struct VFS_CACHE_STATUS* status); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_io_control_get_cache_status_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + struct VFS_CACHE_STATUS status; + bool auto_gen_ret = + kodi_addon_vfs_file_io_control_get_cache_status_v1(this, auto_gen_hdl, context, &status); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_io_control_get_cache_status_v1( + auto_gen_ret, &status)); + return true; + } + case funcChild_kodi_addon_vfs_file_io_control_set_cache_rate_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, unsigned int rate); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_io_control_set_cache_rate_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + unsigned int rate = std::get<2>(t); + bool auto_gen_ret = + kodi_addon_vfs_file_io_control_set_cache_rate_v1(this, auto_gen_hdl, context, rate); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_vfs_file_io_control_set_cache_rate_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_file_io_control_set_retry_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, bool retry); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_file_io_control_set_retry_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_VFS_FILE_HDL context = reinterpret_cast(std::get<1>(t)); + bool retry = std::get<2>(t); + bool auto_gen_ret = + kodi_addon_vfs_file_io_control_set_retry_v1(this, auto_gen_hdl, context, retry); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_file_io_control_set_retry_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_stat_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_STAT_STRUCTURE* buffer); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_stat_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_stat_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_stat_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + struct VFS_STAT_STRUCTURE buffer; + int auto_gen_ret = kodi_addon_vfs_stat_v1(this, auto_gen_hdl, &url, &buffer); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_stat_v1(auto_gen_ret, &buffer)); + return true; + } + case funcChild_kodi_addon_vfs_exists_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_exists_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_exists_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool auto_gen_ret = kodi_addon_vfs_exists_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_exists_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_clear_out_idle_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_clear_out_idle_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_vfs_clear_out_idle_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_vfs_disconnect_all_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(KODI_ADDON_VFS_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_disconnect_all_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_vfs_disconnect_all_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_vfs_delete_it_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_delete_it_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool auto_gen_ret = kodi_addon_vfs_delete_it_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_delete_it_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_rename_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, const struct VFS_URL* url2); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_rename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_rename_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_rename_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + VFS_URL url2; + std::get<1>(t).SetCStructure(&url); + std::get<2>(t).SetCStructure(&url2); + bool auto_gen_ret = kodi_addon_vfs_rename_v1(this, auto_gen_hdl, &url, &url2); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_rename_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_directory_exists_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_directory_exists_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool auto_gen_ret = kodi_addon_vfs_directory_exists_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_directory_exists_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_directory_remove_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_directory_remove_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool auto_gen_ret = kodi_addon_vfs_directory_remove_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_directory_remove_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_directory_create_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_directory_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + bool auto_gen_ret = kodi_addon_vfs_directory_create_v1(this, auto_gen_hdl, &url); + + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_directory_create_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_vfs_directory_get_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, KODI_CTX_CB_HDL ctx_cb_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_directory_get_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + struct VFS_DIR_ENTRY* entries = nullptr; + size_t num_entries = std::get<2>(t); + KODI_CTX_CB_HDL ctx_cb_hdl = reinterpret_cast(std::get<3>(t)); + bool auto_gen_ret = kodi_addon_vfs_directory_get_v1(this, auto_gen_hdl, &url, &entries, + &num_entries, ctx_cb_hdl); + + std::vector ifc_entries; + if (entries) + { + ifc_entries.reserve(num_entries); + for (size_t i = 0; i < num_entries; ++i) + { + ifc_entries.emplace_back(&entries[i]); + ifc_entries[i].CleanCStructure(&entries[i]); + } + free(entries); + } + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_directory_get_v1(auto_gen_ret, ifc_entries, + num_entries)); + return true; + } + case funcChild_kodi_addon_vfs_directory_contains_files_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, char** rootpath); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t, std::string> msgChild_OUT_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_vfs_directory_contains_files_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VFS_URL url; + std::get<1>(t).SetCStructure(&url); + struct VFS_DIR_ENTRY* entries = nullptr; + size_t num_entries = std::get<2>(t); + char* rootpath = nullptr; + bool auto_gen_ret = kodi_addon_vfs_directory_contains_files_v1( + this, auto_gen_hdl, &url, &entries, &num_entries, &rootpath); + + std::vector ifc_entries; + if (entries) + { + ifc_entries.reserve(num_entries); + for (size_t i = 0; i < num_entries; ++i) + { + ifc_entries.emplace_back(&entries[i]); + ifc_entries[i].CleanCStructure(&entries[i]); + } + free(entries); + } + msgpack::pack(out, msgChild_OUT_kodi_addon_vfs_directory_contains_files_v1( + auto_gen_ret, ifc_entries, num_entries, rootpath ? rootpath : "")); + if (rootpath) + free(rootpath); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_VFS_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_VFS_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_vfs.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_destroy_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_vfs.v1.destroy) + { + union_data->types.kodi_addon_vfs.v1.destroy(union_data->hdl); + } +} + +KODI_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + KODI_VFS_FILE_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_vfs.v1.file_open) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_open(union_data->hdl, url); + } + return auto_gen_ret; +} + +KODI_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_for_write_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + bool overwrite) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + KODI_VFS_FILE_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_vfs.v1.file_open_for_write) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_open_for_write(union_data->hdl, url, overwrite); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_close_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.file_close) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_close(union_data->hdl, context); + } + return auto_gen_ret; +} + +ssize_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_read_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t buf_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + ssize_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_read) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_read(union_data->hdl, context, buffer, buf_size); + } + return auto_gen_ret; +} + +ssize_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_write_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t buf_size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + ssize_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_write) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_write(union_data->hdl, context, buffer, buf_size); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_seek_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_seek) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_seek(union_data->hdl, context, position, whence); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_truncate_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_truncate) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_truncate(union_data->hdl, context, size); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_length_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_get_length) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_get_length(union_data->hdl, context); + } + return auto_gen_ret; +} + +int64_t CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_position_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int64_t auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_get_position) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_get_position(union_data->hdl, context); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_get_chunk_size_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.file_get_chunk_size) + { + auto_gen_ret = + union_data->types.kodi_addon_vfs.v1.file_get_chunk_size(union_data->hdl, context); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_get_seek_possible_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.file_io_control_get_seek_possible) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_io_control_get_seek_possible( + union_data->hdl, context); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_get_cache_status_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + struct VFS_CACHE_STATUS* status) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.file_io_control_get_cache_status) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_io_control_get_cache_status( + union_data->hdl, context, status); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_set_cache_rate_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + unsigned int rate) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.file_io_control_set_cache_rate) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_io_control_set_cache_rate( + union_data->hdl, context, rate); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_io_control_set_retry_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.file_io_control_set_retry) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.file_io_control_set_retry(union_data->hdl, + context, retry); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_stat_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_vfs.v1.stat) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.stat(union_data->hdl, url, buffer); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_exists_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.exists) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.exists(union_data->hdl, url); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_clear_out_idle_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_vfs.v1.clear_out_idle) + { + union_data->types.kodi_addon_vfs.v1.clear_out_idle(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_disconnect_all_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_vfs.v1.disconnect_all) + { + union_data->types.kodi_addon_vfs.v1.disconnect_all(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_delete_it_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.delete_it) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.delete_it(union_data->hdl, url); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_rename_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + const struct VFS_URL* url2) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.rename) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.rename(union_data->hdl, url, url2); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_exists_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.directory_exists) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.directory_exists(union_data->hdl, url); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_remove_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.directory_remove) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.directory_remove(union_data->hdl, url); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_create_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.directory_create) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.directory_create(union_data->hdl, url); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_get_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.directory_get) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.directory_get(union_data->hdl, url, entries, + num_entries, ctx_cb_hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_directory_contains_files_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_vfs.v1.directory_contains_files) + { + auto_gen_ret = union_data->types.kodi_addon_vfs.v1.directory_contains_files( + union_data->hdl, url, entries, num_entries, rootpath); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input(KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + char** input, + bool hidden_input) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, char** input, bool hidden_input) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ + + if (hdl == nullptr || ctx_cb_hdl == nullptr || heading == nullptr || input == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + PtrValue(hdl), PtrValue(ctx_cb_hdl), heading, hidden_input)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_vfs_h, + funcParent_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1 t = + ident.get().as(); + + *input = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_vfs_h; + return auto_gen_group.kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1( + auto_gen_group.thisClassHdl, hdl, ctx_cb_hdl, heading, input, hidden_input); +} + +ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__set_error_dialog(KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* heading, + const char* line1, + const char* line2, + const char* line3) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__set_error_dialog(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, const char* line1, const char* line2, const char* line3) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ + + if (hdl == nullptr || ctx_cb_hdl == nullptr || heading == nullptr || line1 == nullptr || + line2 == nullptr || line3 == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1( + PtrValue(hdl), PtrValue(ctx_cb_hdl), heading, line1, line2, line3)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_vfs_h, funcParent_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_vfs_h; + auto_gen_group.kodi_addon_vfs_get_dir_cb__set_error_dialog_v1( + auto_gen_group.thisClassHdl, hdl, ctx_cb_hdl, heading, line1, line2, line3); +} + +ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__require_authentication(KODI_OWN_HDL hdl, + KODI_CTX_CB_HDL ctx_cb_hdl, + const char* url) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__require_authentication(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ + + if (hdl == nullptr || ctx_cb_hdl == nullptr || url == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_vfs_get_dir_cb__require_authentication_v1( + PtrValue(hdl), PtrValue(ctx_cb_hdl), url)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_vfs_h, + funcParent_kodi_addon_vfs_get_dir_cb__require_authentication_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_vfs_h; + auto_gen_group.kodi_addon_vfs_get_dir_cb__require_authentication_v1(auto_gen_group.thisClassHdl, + hdl, ctx_cb_hdl, url); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.h new file mode 100644 index 0000000000000..6609c3a970389 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.h @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/vfs.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_vfs_h; +struct directFuncToKodi_addoninstance_vfs_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_vfs_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_vfs_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_vfs_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_VFS_HDL kodi_addon_vfs_create_v1(void* thisClassHdl, + KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_vfs_destroy_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + static KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); // Added with API 1 + + static KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_for_write_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + bool overwrite); // Added with API 1 + + static bool kodi_addon_vfs_file_close_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + static ssize_t kodi_addon_vfs_file_read_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t buf_size); // Added with API 1 + + static ssize_t kodi_addon_vfs_file_write_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t buf_size); // Added with API 1 + + static int64_t kodi_addon_vfs_file_seek_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence); // Added with API 1 + + static int kodi_addon_vfs_file_truncate_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size); // Added with API 1 + + static int64_t kodi_addon_vfs_file_get_length_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + static int64_t kodi_addon_vfs_file_get_position_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + static int kodi_addon_vfs_file_get_chunk_size_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + static bool kodi_addon_vfs_file_io_control_get_seek_possible_v1( + void* thisClassHdl, KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); // Added with API 1 + + static bool kodi_addon_vfs_file_io_control_get_cache_status_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + struct VFS_CACHE_STATUS* status); // Added with API 1 + + static bool kodi_addon_vfs_file_io_control_set_cache_rate_v1( + void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + unsigned int rate); // Added with API 1 + + static bool kodi_addon_vfs_file_io_control_set_retry_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry); // Added with API 1 + + static int kodi_addon_vfs_stat_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); // Added with API 1 + + static bool kodi_addon_vfs_exists_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + static void kodi_addon_vfs_clear_out_idle_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + static void kodi_addon_vfs_disconnect_all_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + static bool kodi_addon_vfs_delete_it_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_rename_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + const struct VFS_URL* url2); // Added with API 1 + + static bool kodi_addon_vfs_directory_exists_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_remove_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_create_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_get_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl); // Added with API 1 + + static bool kodi_addon_vfs_directory_contains_files_v1(void* thisClassHdl, + KODI_ADDON_VFS_HDL hdl, + const struct VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.cpp new file mode 100644 index 0000000000000..9dec6f3c13db9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.cpp @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "videocodec.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_videocodec_h::InitDirect( + directFuncToAddon_addoninstance_videocodec_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_videocodec_create_v1 = kodi_addon_videocodec_create_v1; + ifcToAddon->kodi_addon_videocodec_destroy_v1 = kodi_addon_videocodec_destroy_v1; + ifcToAddon->kodi_addon_videocodec_open_v1 = kodi_addon_videocodec_open_v1; + ifcToAddon->kodi_addon_videocodec_reconfigure_v1 = kodi_addon_videocodec_reconfigure_v1; + ifcToAddon->kodi_addon_videocodec_add_data_v1 = kodi_addon_videocodec_add_data_v1; + ifcToAddon->kodi_addon_videocodec_get_picture_v1 = kodi_addon_videocodec_get_picture_v1; + ifcToAddon->kodi_addon_videocodec_get_name_v1 = kodi_addon_videocodec_get_name_v1; + ifcToAddon->kodi_addon_videocodec_reset_v1 = kodi_addon_videocodec_reset_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_videocodec_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_videocodec_h) + return false; + + switch (func) + { + /* NOTE: Ignored as direct api only is set! */ + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_VIDEOCODEC_HDL CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_VIDEOCODEC_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_videocodec.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_videocodec.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_destroy_v1( + void* thisClassHdl, KODI_ADDON_VIDEOCODEC_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_videocodec.v1.destroy) + { + union_data->types.kodi_addon_videocodec.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_open_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_videocodec.v1.open) + { + auto_gen_ret = union_data->types.kodi_addon_videocodec.v1.open(union_data->hdl, initData); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_reconfigure_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_videocodec.v1.reconfigure) + { + auto_gen_ret = + union_data->types.kodi_addon_videocodec.v1.reconfigure(union_data->hdl, initData); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_add_data_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + const struct DEMUX_PACKET* packet) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_videocodec.v1.add_data) + { + auto_gen_ret = union_data->types.kodi_addon_videocodec.v1.add_data(union_data->hdl, packet); + } + return auto_gen_ret; +} + +enum VIDEOCODEC_RETVAL CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_get_picture_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return VC_NONE; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum VIDEOCODEC_RETVAL auto_gen_ret = VC_NONE; + if (union_data->types.kodi_addon_videocodec.v1.get_picture) + { + auto_gen_ret = union_data->types.kodi_addon_videocodec.v1.get_picture(union_data->hdl, picture); + } + return auto_gen_ret; +} + +const char* CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_get_name_v1( + void* thisClassHdl, KODI_ADDON_VIDEOCODEC_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + const char* auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_videocodec.v1.get_name) + { + auto_gen_ret = union_data->types.kodi_addon_videocodec.v1.get_name(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_videocodec_h::kodi_addon_videocodec_reset_v1( + void* thisClassHdl, KODI_ADDON_VIDEOCODEC_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_videocodec.v1.reset) + { + union_data->types.kodi_addon_videocodec.v1.reset(union_data->hdl); + } +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_addon_videocodec_get_frame_buffer(KODI_OWN_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_videocodec_get_frame_buffer( KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || picture == nullptr) + return false; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_videocodec_h; + return auto_gen_group.kodi_addon_videocodec_get_frame_buffer_v1(auto_gen_group.thisClassHdl, hdl, + picture); +} + +ATTR_DLL_EXPORT void kodi_addon_videocodec_release_frame_buffer(KODI_OWN_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_videocodec_release_frame_buffer( KODI_OWN_HDL hdl, struct VIDEOCODEC_PICTURE* picture) __INTRODUCED_IN_KODI(1); + if (hdl == nullptr || picture == nullptr) + return; + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_videocodec_h; + auto_gen_group.kodi_addon_videocodec_release_frame_buffer_v1(auto_gen_group.thisClassHdl, hdl, + picture); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.h new file mode 100644 index 0000000000000..ea9a82cede864 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/videocodec.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_videocodec_h; +struct directFuncToKodi_addoninstance_videocodec_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_videocodec_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_videocodec_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_videocodec_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_VIDEOCODEC_HDL kodi_addon_videocodec_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_videocodec_destroy_v1(void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 + + static bool kodi_addon_videocodec_open_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData); // Added with API 1 + + static bool kodi_addon_videocodec_reconfigure_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_INITDATA* initData); // Added with API 1 + + static bool kodi_addon_videocodec_add_data_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + const struct DEMUX_PACKET* packet); // Added with API 1 + + static enum VIDEOCODEC_RETVAL kodi_addon_videocodec_get_picture_v1( + void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl, + struct VIDEOCODEC_PICTURE* picture); // Added with API 1 + + static const char* kodi_addon_videocodec_get_name_v1( + void* thisClassHdl, KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 + + static void kodi_addon_videocodec_reset_v1(void* thisClassHdl, + KODI_ADDON_VIDEOCODEC_HDL hdl); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.cpp new file mode 100644 index 0000000000000..30200d6d9d374 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.cpp @@ -0,0 +1,749 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "visualization.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addoninstance_visualization_h::InitDirect( + directFuncToAddon_addoninstance_visualization_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_visualization_create_v1 = kodi_addon_visualization_create_v1; + ifcToAddon->kodi_addon_visualization_destroy_v1 = kodi_addon_visualization_destroy_v1; + ifcToAddon->kodi_addon_visualization_start_v1 = kodi_addon_visualization_start_v1; + ifcToAddon->kodi_addon_visualization_stop_v1 = kodi_addon_visualization_stop_v1; + ifcToAddon->kodi_addon_visualization_get_info_v1 = kodi_addon_visualization_get_info_v1; + ifcToAddon->kodi_addon_visualization_audio_data_v1 = kodi_addon_visualization_audio_data_v1; + ifcToAddon->kodi_addon_visualization_is_dirty_v1 = kodi_addon_visualization_is_dirty_v1; + ifcToAddon->kodi_addon_visualization_render_v1 = kodi_addon_visualization_render_v1; + ifcToAddon->kodi_addon_visualization_get_presets_v1 = kodi_addon_visualization_get_presets_v1; + ifcToAddon->kodi_addon_visualization_get_active_preset_v1 = + kodi_addon_visualization_get_active_preset_v1; + ifcToAddon->kodi_addon_visualization_prev_preset_v1 = kodi_addon_visualization_prev_preset_v1; + ifcToAddon->kodi_addon_visualization_next_preset_v1 = kodi_addon_visualization_next_preset_v1; + ifcToAddon->kodi_addon_visualization_load_preset_v1 = kodi_addon_visualization_load_preset_v1; + ifcToAddon->kodi_addon_visualization_random_preset_v1 = kodi_addon_visualization_random_preset_v1; + ifcToAddon->kodi_addon_visualization_lock_preset_v1 = kodi_addon_visualization_lock_preset_v1; + ifcToAddon->kodi_addon_visualization_rate_preset_v1 = kodi_addon_visualization_rate_preset_v1; + ifcToAddon->kodi_addon_visualization_is_locked_v1 = kodi_addon_visualization_is_locked_v1; + ifcToAddon->kodi_addon_visualization_update_albumart_v1 = + kodi_addon_visualization_update_albumart_v1; + ifcToAddon->kodi_addon_visualization_update_track_v1 = kodi_addon_visualization_update_track_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_visualization_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_visualization_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_visualization_create_v1: + { + // Original API call: typedef KODI_ADDON_VISUALIZATION_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CREATE_V1)(KODI_OWN_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_VISUALIZATION_HDL auto_gen_ret = + kodi_addon_visualization_create_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_visualization_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_visualization_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_visualization_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int channels, int samples_per_sec, int bits_per_sample, const char* song_name); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_start_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_start_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_start_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int channels = std::get<1>(t); + int samples_per_sec = std::get<2>(t); + int bits_per_sample = std::get<3>(t); + const std::string& song_name = std::get<4>(t); + bool auto_gen_ret = kodi_addon_visualization_start_v1( + this, auto_gen_hdl, channels, samples_per_sec, bits_per_sample, song_name.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_start_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_stop_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_stop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_stop_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_stop_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_visualization_stop_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_visualization_get_info_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_info_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_get_info_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + struct VIS_INFO info; + kodi_addon_visualization_get_info_v1(this, auto_gen_hdl, &info); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_get_info_v1(&info)); + return true; + } + case funcChild_kodi_addon_visualization_audio_data_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length, const float* freq_data, size_t freq_data_length); + // Tuple in: typedef std::tuple, size_t, std::vector, size_t> msgChild__IN_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_audio_data_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::vector& audio_data = std::get<1>(t); + size_t audio_data_length = std::get<2>(t); + const std::vector& freq_data = std::get<3>(t); + size_t freq_data_length = std::get<4>(t); + kodi_addon_visualization_audio_data_v1(this, auto_gen_hdl, audio_data.data(), + audio_data_length, freq_data.data(), freq_data_length); + + return true; + } + case funcChild_kodi_addon_visualization_is_dirty_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_is_dirty_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_is_dirty_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_is_dirty_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_render_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_render_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_render_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_visualization_render_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_visualization_get_presets_v1: + { + // Original API call: typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_get_presets_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + unsigned int auto_gen_ret = kodi_addon_visualization_get_presets_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_get_presets_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_get_active_preset_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_get_active_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int auto_gen_ret = kodi_addon_visualization_get_active_preset_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_get_active_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_prev_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_prev_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_prev_preset_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_prev_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_next_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_next_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_next_preset_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_next_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_load_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int select); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_load_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + int select = std::get<1>(t); + bool auto_gen_ret = kodi_addon_visualization_load_preset_v1(this, auto_gen_hdl, select); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_load_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_random_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_random_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_random_preset_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_random_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_lock_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_lock_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_lock_preset_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_lock_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_rate_preset_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_rate_preset_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool plus_minus = std::get<1>(t); + bool auto_gen_ret = kodi_addon_visualization_rate_preset_v1(this, auto_gen_hdl, plus_minus); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_rate_preset_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_is_locked_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_is_locked_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_visualization_is_locked_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_is_locked_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_update_albumart_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_update_albumart_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& albumart = std::get<1>(t); + bool auto_gen_ret = + kodi_addon_visualization_update_albumart_v1(this, auto_gen_hdl, albumart.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_update_albumart_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_update_track_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const struct VIS_TRACK* track); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_update_track_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_track_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_update_track_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + VIS_TRACK track; + std::get<1>(t).SetCStructure(&track); + bool auto_gen_ret = kodi_addon_visualization_update_track_v1(this, auto_gen_hdl, &track); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_update_track_v1(auto_gen_ret)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + + +KODI_ADDON_VISUALIZATION_HDL CHdl_kodi_addoninstance_visualization_h:: + kodi_addon_visualization_create_v1(void* thisClassHdl, + KODI_OWN_HDL kodi_hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + UnionAddonFunctions* union_data = reinterpret_cast(kodi_hdl); + KODI_ADDON_VISUALIZATION_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_visualization.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_destroy_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_visualization.v1.destroy) + { + union_data->types.kodi_addon_visualization.v1.destroy(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_start_v1( + void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + int channels, + int samples_per_sec, + int bits_per_sample, + const char* song_name) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.start) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.start( + union_data->hdl, channels, samples_per_sec, bits_per_sample, song_name); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_stop_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_visualization.v1.stop) + { + union_data->types.kodi_addon_visualization.v1.stop(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_info_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_visualization.v1.get_info) + { + union_data->types.kodi_addon_visualization.v1.get_info(union_data->hdl, info); + } +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_audio_data_v1( + void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length, + const float* freq_data, + size_t freq_data_length) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_visualization.v1.audio_data) + { + union_data->types.kodi_addon_visualization.v1.audio_data( + union_data->hdl, audio_data, audio_data_length, freq_data, freq_data_length); + } +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_dirty_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.is_dirty) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.is_dirty(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_render_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon_visualization.v1.render) + { + union_data->types.kodi_addon_visualization.v1.render(union_data->hdl); + } +} + +unsigned int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_presets_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return 0; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + unsigned int auto_gen_ret = 0; + if (union_data->types.kodi_addon_visualization.v1.get_presets) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.get_presets(union_data->hdl); + } + return auto_gen_ret; +} + +int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_active_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + int auto_gen_ret = -1; + if (union_data->types.kodi_addon_visualization.v1.get_active_preset) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.get_active_preset(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_prev_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.prev_preset) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.prev_preset(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_next_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.next_preset) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.next_preset(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_load_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl, int select) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.load_preset) + { + auto_gen_ret = + union_data->types.kodi_addon_visualization.v1.load_preset(union_data->hdl, select); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_random_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.random_preset) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.random_preset(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_lock_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.lock_preset) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.lock_preset(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_rate_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.rate_preset) + { + auto_gen_ret = + union_data->types.kodi_addon_visualization.v1.rate_preset(union_data->hdl, plus_minus); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_locked_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.is_locked) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.is_locked(union_data->hdl); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_update_albumart_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.update_albumart) + { + auto_gen_ret = + union_data->types.kodi_addon_visualization.v1.update_albumart(union_data->hdl, albumart); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_update_track_v1( + void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + const struct VIS_TRACK* track) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + bool auto_gen_ret = false; + if (union_data->types.kodi_addon_visualization.v1.update_track) + { + auto_gen_ret = + union_data->types.kodi_addon_visualization.v1.update_track(union_data->hdl, track); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(KODI_OWN_HDL hdl, + struct VIS_PROPS* props) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(KODI_OWN_HDL hdl, struct VIS_PROPS* props) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ + + if (hdl == nullptr || props == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_visualization_get_properties_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_visualization_h, + funcParent_kodi_addon_visualization_get_properties_v1, in, out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_visualization_get_properties_v1 t = ident.get().as(); + + std::get<0>(t).SetCStructure(props); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_visualization_h; + auto_gen_group.kodi_addon_visualization_get_properties_v1(auto_gen_group.thisClassHdl, hdl, + props); +} + +ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(KODI_OWN_HDL hdl, const char* preset) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(KODI_OWN_HDL hdl, const char* preset) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ + + if (hdl == nullptr || preset == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_addon_visualization_transfer_preset_v1(PtrValue(hdl), preset)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_visualization_h, + funcParent_kodi_addon_visualization_transfer_preset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_visualization_h; + auto_gen_group.kodi_addon_visualization_transfer_preset_v1(auto_gen_group.thisClassHdl, hdl, + preset); +} + +ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(KODI_OWN_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_visualization_clear_presets_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_visualization_h, + funcParent_kodi_addon_visualization_clear_presets_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_visualization_h; + auto_gen_group.kodi_addon_visualization_clear_presets_v1(auto_gen_group.thisClassHdl, hdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.h new file mode 100644 index 0000000000000..5d336f371ef5f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon-instance/visualization.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addoninstance_visualization_h; +struct directFuncToKodi_addoninstance_visualization_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_visualization_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_visualization_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_visualization_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static KODI_ADDON_VISUALIZATION_HDL kodi_addon_visualization_create_v1( + void* thisClassHdl, KODI_OWN_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_visualization_destroy_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_start_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + int channels, + int samples_per_sec, + int bits_per_sample, + const char* song_name); // Added with API 1 + + static void kodi_addon_visualization_stop_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static void kodi_addon_visualization_get_info_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + struct VIS_INFO* info); // Added with API 1 + + static void kodi_addon_visualization_audio_data_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length, + const float* freq_data, + size_t freq_data_length); // Added with API 1 + + static bool kodi_addon_visualization_is_dirty_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static void kodi_addon_visualization_render_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static unsigned int kodi_addon_visualization_get_presets_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static int kodi_addon_visualization_get_active_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_prev_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_next_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_load_preset_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + int select); // Added with API 1 + + static bool kodi_addon_visualization_random_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_lock_preset_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_rate_preset_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + bool plus_minus); // Added with API 1 + + static bool kodi_addon_visualization_is_locked_v1( + void* thisClassHdl, KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_update_albumart_v1(void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + const char* albumart); // Added with API 1 + + static bool kodi_addon_visualization_update_track_v1( + void* thisClassHdl, + KODI_ADDON_VISUALIZATION_HDL hdl, + const struct VIS_TRACK* track); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.cpp new file mode 100644 index 0000000000000..262aafbb50e0a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.cpp @@ -0,0 +1,1236 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "addon_base.h" + +#include "include/kodi/tools/StringUtils.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_addon_base_h::InitDirect(directFuncToAddon_addon_base_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_create_v1 = kodi_addon_create_v1; + ifcToAddon->kodi_addon_destroy_v1 = kodi_addon_destroy_v1; + ifcToAddon->kodi_addon_create_instance_v1 = kodi_addon_create_instance_v1; + ifcToAddon->kodi_addon_destroy_instance_v1 = kodi_addon_destroy_instance_v1; + ifcToAddon->kodi_addon_setting_change_string_v1 = kodi_addon_setting_change_string_v1; + ifcToAddon->kodi_addon_setting_change_boolean_v1 = kodi_addon_setting_change_boolean_v1; + ifcToAddon->kodi_addon_setting_change_integer_v1 = kodi_addon_setting_change_integer_v1; + ifcToAddon->kodi_addon_setting_change_float_v1 = kodi_addon_setting_change_float_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addon_base_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addon_base_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_create_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(KODI_HANDLE first_instance, KODI_ADDON_HDL* hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_create_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_create_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + + /*---AUTO_GEN_PARSE---*/ + + KODI_ADDON_HDL hdl = nullptr; + enum ADDON_STATUS auto_gen_ret = kodi_addon_create_v1(this, &hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_create_v1(auto_gen_ret, PtrValue(hdl))); + + /*---AUTO_GEN_PARSE---*/ + return true; + } + case funcChild_kodi_addon_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + kodi_addon_destroy_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_create_instance_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)(const KODI_ADDON_HDL hdl, enum ADDON_INSTANCE instanceType, const char* instanceID, struct KODI_INSTANCE_HDL* addonInstance, KODI_IFC_HDL parent); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_create_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_create_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + + /*---AUTO_GEN_PARSE---*/ + + msgChild__IN_kodi_addon_create_instance_v1 t = in.get().as(); + KODI_ADDON_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum ADDON_INSTANCE instanceType = std::get<1>(t); + const std::string& instanceID = std::get<2>(t); + KODI_OWN_HDL instance = reinterpret_cast(std::get<3>(t)); + KODI_HANDLE addonInstance = nullptr; + KODI_IFC_HDL parent = reinterpret_cast(std::get<4>(t)); + enum ADDON_STATUS auto_gen_ret = kodi_addon_create_instance_v1( + this, hdl, instanceType, instanceID, instance, &addonInstance, parent); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_create_instance_v1(auto_gen_ret, PtrValue(addonInstance))); + + /*---AUTO_GEN_PARSE---*/ + return true; + } + case funcChild_kodi_addon_destroy_instance_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)(const KODI_ADDON_HDL hdl, enum ADDON_INSTANCE instanceType, struct KODI_INSTANCE_HDL* instance); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_destroy_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_destroy_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ + + /*---AUTO_GEN_PARSE---*/ + + msgChild__IN_kodi_addon_destroy_instance_v1 t = in.get().as(); + KODI_ADDON_HDL hdl = reinterpret_cast(std::get<0>(t)); + enum ADDON_INSTANCE instanceType = std::get<1>(t); + KODI_HANDLE instance = reinterpret_cast(std::get<2>(t)); + kodi_addon_destroy_instance_v1(this, hdl, instanceType, instance); + + /*---AUTO_GEN_PARSE---*/ + return true; + } + case funcChild_kodi_addon_setting_change_string_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const char* name, const char* value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_string_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_setting_change_string_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& name = std::get<1>(t); + const std::string& value = std::get<2>(t); + enum ADDON_STATUS auto_gen_ret = + kodi_addon_setting_change_string_v1(this, auto_gen_hdl, name.c_str(), value.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_setting_change_string_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_setting_change_boolean_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const char* name, bool value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_setting_change_boolean_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& name = std::get<1>(t); + bool value = std::get<2>(t); + enum ADDON_STATUS auto_gen_ret = + kodi_addon_setting_change_boolean_v1(this, auto_gen_hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_setting_change_boolean_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_setting_change_integer_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const char* name, int value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_integer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_integer_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_setting_change_integer_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& name = std::get<1>(t); + int value = std::get<2>(t); + enum ADDON_STATUS auto_gen_ret = + kodi_addon_setting_change_integer_v1(this, auto_gen_hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_setting_change_integer_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_setting_change_float_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const char* name, float value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_setting_change_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_setting_change_float_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_setting_change_float_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& name = std::get<1>(t); + float value = std::get<2>(t); + enum ADDON_STATUS auto_gen_ret = + kodi_addon_setting_change_float_v1(this, auto_gen_hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_setting_change_float_v1(auto_gen_ret)); + return true; + } + default: + break; + } + return false; +} +#endif /* !KODI_INHIBIT_SHARED */ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ + +KODI::ADDONS::INTERFACE::DirectAddonIfc* kodi_check_direct_api(int argc, char* argv[]) +{ + static const char* value = "--direct-api="; + static std::string direct_api = "0"; + + for (int i = 1; i < argc; ++i) + { + if (argv[i] == nullptr) + break; + + std::string arg = argv[i]; + if (arg.rfind(value, 0) == 0) + { + direct_api = arg.substr(strlen(value)); + break; + } + else if ((arg == "-d") || (arg == "--direct-api")) + { + if (i + 1 < argc) // Make sure we aren't at the end of argv! + { + direct_api = argv[++i]; // Increment 'i' so we don't get the argument as the next argv[i]. + break; + } + } + } + + return reinterpret_cast(stoull(direct_api, 0, 16)); +} + +ATTR_DLL_EXPORT KODI_HANDLE kodi_check_for_first_instance(int argc, char* argv[]) +{ + // Original API call: ATTR_DLL_EXPORT KODI_HANDLE kodi_check_for_first_instance(int argc, char* argv[]) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_check_for_first_instance - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_check_for_first_instance - Override active to use inside dev-kit library only */ + + static const char* value = "--first-instance="; + static std::string first_instance = "0"; + + for (int i = 1; i < argc; ++i) + { + if (argv[i] == nullptr) + break; + + std::string arg = argv[i]; + if (arg.rfind(value, 0) == 0) + { + first_instance = arg.substr(strlen(value)); + break; + } + else if ((arg == "-i") || (arg == "--first-instance")) + { + if (i + 1 < argc) // Make sure we aren't at the end of argv! + { + first_instance = + argv[++i]; // Increment 'i' so we don't get the argument as the next argv[i]. + break; + } + } + } + + return reinterpret_cast(stoull(first_instance, 0, 16)); +} + +/*---AUTO_GEN_PARSE---*/ + + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_v1( + void* thisClassHdl, KODI_ADDON_HDL* hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + /*---AUTO_GEN_PARSE---*/ + + ADDON_STATUS status; + if (thisClass->m_ifc->functions.types.kodi_addon.v1.create) + { + status = thisClass->m_ifc->functions.types.kodi_addon.v1.create( + thisClass->m_ifc->kodiFirstInstance, hdl); + thisClass->m_ifc->functions.hdl = *hdl; + } + else + status = ADDON_STATUS_NOT_IMPLEMENTED; + *hdl = &thisClass->m_ifc->functions; + return status; + + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addon_base_h::kodi_addon_destroy_v1(void* thisClassHdl, + KODI_ADDON_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + if (union_data->types.kodi_addon.v1.destroy) + { + union_data->types.kodi_addon.v1.destroy(union_data->hdl); + } +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_instance_v1( + void* thisClassHdl, + KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_OWN_HDL instance, + KODI_HANDLE* addonInstance, + KODI_HANDLE parent) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + /*---AUTO_GEN_PARSE---*/ + // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes! + ADDON_STATUS status; + UnionAddonFunctions* data = reinterpret_cast(hdl); + if (data->types.kodi_addon.v1.create_instance) + { + UnionAddonFunctions* instanceStruct = new UnionAddonFunctions(); + instanceStruct->type = instanceType; + instanceStruct->kodi = instance; + + KODI_INSTANCE_HDL addonIntInstance = {}; + addonIntInstance.type = instanceType; + addonIntInstance.kodi = instance; + addonIntInstance.kodi_first_instance = instance == thisClass->m_ifc->kodiFirstInstance; + addonIntInstance.dummy = &instanceStruct->types.dummy; + + status = data->types.kodi_addon.v1.create_instance(data->hdl, instanceType, instanceID.c_str(), + &addonIntInstance, parent); + if ((!addonIntInstance.dummy || addonIntInstance.type != instanceType) && + status == ADDON_STATUS_OK) + { + status = ADDON_STATUS_PERMANENT_FAILURE; + } + else if (addonIntInstance.dummy) + { + instanceStruct->type = instanceType; + instanceStruct->addon_struct_ptr = addonIntInstance.dummy; + if (instanceType == ADDON_INSTANCE_AUDIODECODER) + { + if (&instanceStruct->types.kodi_addon_audiodecoder.v1 != + reinterpret_casttypes.kodi_addon_audiodecoder.v1)*>( + addonIntInstance.audiodecoder)) + instanceStruct->types.kodi_addon_audiodecoder.v1 = + *reinterpret_casttypes.kodi_addon_audiodecoder.v1)*>( + addonIntInstance.audiodecoder); + if (instanceStruct->types.kodi_addon_audiodecoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_audiodecoder.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_AUDIOENCODER) + { + if (&instanceStruct->types.kodi_addon_audioencoder.v1 != + reinterpret_casttypes.kodi_addon_audioencoder.v1)*>( + addonIntInstance.audioencoder)) + instanceStruct->types.kodi_addon_audioencoder.v1 = + *reinterpret_casttypes.kodi_addon_audioencoder.v1)*>( + addonIntInstance.audioencoder); + if (instanceStruct->types.kodi_addon_audioencoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_audioencoder.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_GAME) + { + if (&instanceStruct->types.kodi_addon_game.v1 != + reinterpret_casttypes.kodi_addon_game.v1)*>( + addonIntInstance.game)) + instanceStruct->types.kodi_addon_game.v1 = + *reinterpret_casttypes.kodi_addon_game.v1)*>( + addonIntInstance.game); + if (instanceStruct->types.kodi_addon_game.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_game.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_IMAGEDECODER) + { + if (&instanceStruct->types.kodi_addon_imagedecoder.v1 != + reinterpret_casttypes.kodi_addon_imagedecoder.v1)*>( + addonIntInstance.imagedecoder)) + instanceStruct->types.kodi_addon_imagedecoder.v1 = + *reinterpret_casttypes.kodi_addon_imagedecoder.v1)*>( + addonIntInstance.imagedecoder); + if (instanceStruct->types.kodi_addon_imagedecoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_imagedecoder.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_INPUTSTREAM) + { + if (&instanceStruct->types.kodi_addon_inputstream.v1 != + reinterpret_casttypes.kodi_addon_inputstream.v1)*>( + addonIntInstance.inputstream)) + instanceStruct->types.kodi_addon_inputstream.v1 = + *reinterpret_casttypes.kodi_addon_inputstream.v1)*>( + addonIntInstance.inputstream); + if (instanceStruct->types.kodi_addon_inputstream.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_inputstream.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_PERIPHERAL) + { + if (&instanceStruct->types.kodi_addon_peripheral.v1 != + reinterpret_casttypes.kodi_addon_peripheral.v1)*>( + addonIntInstance.peripheral)) + instanceStruct->types.kodi_addon_peripheral.v1 = + *reinterpret_casttypes.kodi_addon_peripheral.v1)*>( + addonIntInstance.peripheral); + if (instanceStruct->types.kodi_addon_peripheral.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_peripheral.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_SCREENSAVER) + { + if (&instanceStruct->types.kodi_addon_screensaver.v1 != + reinterpret_casttypes.kodi_addon_screensaver.v1)*>( + addonIntInstance.screensaver)) + instanceStruct->types.kodi_addon_screensaver.v1 = + *reinterpret_casttypes.kodi_addon_screensaver.v1)*>( + addonIntInstance.screensaver); + if (instanceStruct->types.kodi_addon_screensaver.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_screensaver.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_VFS) + { + if (&instanceStruct->types.kodi_addon_vfs.v1 != + reinterpret_casttypes.kodi_addon_vfs.v1)*>( + addonIntInstance.vfs)) + instanceStruct->types.kodi_addon_vfs.v1 = + *reinterpret_casttypes.kodi_addon_vfs.v1)*>( + addonIntInstance.vfs); + if (instanceStruct->types.kodi_addon_vfs.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_vfs.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_VIDEOCODEC) + { + if (&instanceStruct->types.kodi_addon_videocodec.v1 != + reinterpret_casttypes.kodi_addon_videocodec.v1)*>( + addonIntInstance.videocodec)) + instanceStruct->types.kodi_addon_videocodec.v1 = + *reinterpret_casttypes.kodi_addon_videocodec.v1)*>( + addonIntInstance.videocodec); + if (instanceStruct->types.kodi_addon_videocodec.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_videocodec.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + if (instanceType == ADDON_INSTANCE_VISUALIZATION) + { + if (&instanceStruct->types.kodi_addon_visualization.v1 != + reinterpret_casttypes.kodi_addon_visualization.v1)*>( + addonIntInstance.visualization)) + instanceStruct->types.kodi_addon_visualization.v1 = + *reinterpret_casttypes.kodi_addon_visualization.v1)*>( + addonIntInstance.visualization); + if (instanceStruct->types.kodi_addon_visualization.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_visualization.v1.create(instance); + else + instanceStruct->hdl = addonIntInstance.instance; + goto done; + } + done: + *addonInstance = instanceStruct; + return status; + } + + delete instanceStruct; + } + else + status = ADDON_STATUS_NOT_IMPLEMENTED; + + return status; + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addon_base_h::kodi_addon_destroy_instance_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + KODI_HANDLE instance) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes! + UnionAddonFunctions* data = reinterpret_cast(hdl); + UnionAddonFunctions* instanceStruct = reinterpret_cast(instance); + if (instanceStruct) + { + if (instanceType == ADDON_INSTANCE_AUDIODECODER) + { + if (instanceStruct->types.kodi_addon_audiodecoder.v1.destroy) + instanceStruct->types.kodi_addon_audiodecoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_AUDIOENCODER) + { + if (instanceStruct->types.kodi_addon_audioencoder.v1.destroy) + instanceStruct->types.kodi_addon_audioencoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_GAME) + { + if (instanceStruct->types.kodi_addon_game.v1.destroy) + instanceStruct->types.kodi_addon_game.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_IMAGEDECODER) + { + if (instanceStruct->types.kodi_addon_imagedecoder.v1.destroy) + instanceStruct->types.kodi_addon_imagedecoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_INPUTSTREAM) + { + if (instanceStruct->types.kodi_addon_inputstream.v1.destroy) + instanceStruct->types.kodi_addon_inputstream.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_PERIPHERAL) + { + if (instanceStruct->types.kodi_addon_peripheral.v1.destroy) + instanceStruct->types.kodi_addon_peripheral.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_SCREENSAVER) + { + if (instanceStruct->types.kodi_addon_screensaver.v1.destroy) + instanceStruct->types.kodi_addon_screensaver.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_VFS) + { + if (instanceStruct->types.kodi_addon_vfs.v1.destroy) + instanceStruct->types.kodi_addon_vfs.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_VIDEOCODEC) + { + if (instanceStruct->types.kodi_addon_videocodec.v1.destroy) + instanceStruct->types.kodi_addon_videocodec.v1.destroy(instanceStruct->hdl); + goto done; + } + if (instanceType == ADDON_INSTANCE_VISUALIZATION) + { + if (instanceStruct->types.kodi_addon_visualization.v1.destroy) + instanceStruct->types.kodi_addon_visualization.v1.destroy(instanceStruct->hdl); + goto done; + } + done: + if (data->types.kodi_addon.v1.destroy_instance) + { + KODI_INSTANCE_HDL addonInstance = {}; + addonInstance.kodi = instanceStruct->kodi; + addonInstance.type = instanceType; + addonInstance.instance = instanceStruct->hdl; + addonInstance.dummy = instanceStruct->addon_struct_ptr; + data->types.kodi_addon.v1.destroy_instance(data->hdl, instanceType, &addonInstance); + } + delete instanceStruct; + } + /*---AUTO_GEN_PARSE---*/ +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_string_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const char* name, + const char* value) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.setting_change_string) + { + auto_gen_ret = + union_data->types.kodi_addon.v1.setting_change_string(union_data->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_boolean_v1( + void* thisClassHdl, const KODI_ADDON_HDL hdl, const char* name, bool value) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.setting_change_boolean) + { + auto_gen_ret = + union_data->types.kodi_addon.v1.setting_change_boolean(union_data->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_integer_v1( + void* thisClassHdl, const KODI_ADDON_HDL hdl, const char* name, int value) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.setting_change_integer) + { + auto_gen_ret = + union_data->types.kodi_addon.v1.setting_change_integer(union_data->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_setting_change_float_v1( + void* thisClassHdl, const KODI_ADDON_HDL hdl, const char* name, float value) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.setting_change_float) + { + auto_gen_ret = + union_data->types.kodi_addon.v1.setting_change_float(union_data->hdl, name, value); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT const char* kodi_check_main_shared(int argc, char* argv[]) +{ + // Original API call: ATTR_DLL_EXPORT const char* kodi_check_main_shared(int argc, char* argv[]) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_check_main_shared - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_check_main_shared - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + static const char* value = "--main-shared="; + static std::string main_shared; + + for (int i = 1; i < argc; ++i) + { + if (argv[i] == nullptr) + break; + + std::string arg = argv[i]; + if (arg.rfind(value, 0) == 0) + { + main_shared = arg.substr(strlen(value)); + break; + } + else if ((arg == "-m") || (arg == "--main-shared")) + { + if (i + 1 < argc) // Make sure we aren't at the end of argv! + { + main_shared = argv[++i]; // Increment 'i' so we don't get the argument as the next argv[i]. + break; + } + } + } + + return main_shared.c_str(); + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT KODI_IFC_HDL kodi_init(unsigned int api, + int argc, + char* argv[], + struct KODI_ADDON_FUNC* func, + bool via_main, + bool no_receive) +{ + // Original API call: ATTR_DLL_EXPORT KODI_IFC_HDL kodi_init(unsigned int api, int argc, char* argv[], struct KODI_ADDON_FUNC* func, bool via_main, bool no_receive) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_init - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_init - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + if (AddonIfc::g_ifc) + { + fprintf(stderr, R"error( +FATAL: This class "CChildProcessor" should only be used one time in App. + Here becomes a second time called and child app becomes destroyed now. + Inform developer about this addon to fix it! + )error"); + exit(1); + } + + KODI_ADDON::INTERNAL::AddonIfc* ifc = new AddonIfc(); + ifc->api = api; + ifc->identifier = kodi_check_main_shared(argc, argv); + if (ifc->identifier.empty()) + { + fprintf(stderr, "FATAL: Started addon without valid identifier, Addon not usable!\n"); + exit(1); + } + + ifc->kodiFirstInstance = kodi_check_for_first_instance(argc, argv); + ifc->direct = kodi_check_direct_api(argc, argv); + if (ifc->direct) + ifc->direct_used = true; + + if (func) + ifc->functions.types.kodi_addon.v1 = + *reinterpret_castfunctions.types.kodi_addon.v1)*>(func); + ifc->viaMainThread = via_main; + ifc->noReceive = no_receive; + ifc->control = std::unique_ptr(new CAddonControl(ifc)); + if (!ifc->control->Create()) + { + fprintf(stderr, "FATAL: Started addon without valid identifier, Addon not usable!\n"); + delete ifc; + exit(1); + } + + AddonIfc::g_ifc = ifc; + return AddonIfc::g_ifc; + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT void kodi_deinit(KODI_IFC_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_deinit(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_deinit - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_deinit - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + if (!AddonIfc::g_ifc) + return; + + delete AddonIfc::g_ifc; + AddonIfc::g_ifc = nullptr; + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT bool kodi_process(KODI_IFC_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_process(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_process - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_process - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + if (!AddonIfc::g_ifc) + return false; + return AddonIfc::g_ifc->control->ProcessOutside(); + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_log_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_log_v1; /* Autogenerated */ + + if (format == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + va_list args; + va_start(args, format); + const std::string cpp_format = kodi::tools::StringUtils::FormatV(format, args); + va_end(args); + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_log_v1(loglevel, cpp_format)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_addon_base_h, + funcParent_kodi_log_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + auto_gen_group.kodi_log_v1(auto_gen_group.thisClassHdl, loglevel, format); +} + +ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_lib_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_lib_path_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_addon_base_h, funcParent_kodi_addon_get_lib_path_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_lib_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_lib_path_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT char* kodi_addon_get_share_path() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_share_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_share_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_share_path_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_addon_base_h, funcParent_kodi_addon_get_share_path_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_share_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_share_path_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT char* kodi_addon_get_user_path() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_user_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_user_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_user_path_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_addon_base_h, funcParent_kodi_addon_get_user_path_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_user_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_user_path_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_temp_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_temp_path_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_addon_base_h, funcParent_kodi_addon_get_temp_path_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_temp_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_temp_path_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_info_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_info_v1; /* Autogenerated */ + + if (id == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_get_info_v1(id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_get_info_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_info_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_info_v1(auto_gen_group.thisClassHdl, id); +} + +ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_addon_base_h, funcParent_kodi_addon_open_settings_dialog_v1, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_open_settings_dialog_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_open_settings_dialog_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ + + if (id == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_is_setting_using_default_v1(id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_is_setting_using_default_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_is_setting_using_default_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_is_setting_using_default_v1(auto_gen_group.thisClassHdl, id); +} + +ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_bool_v1; /* Autogenerated */ + + if (id == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_get_setting_bool_v1(id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_get_setting_bool_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_setting_bool_v1 t = ident.get().as(); + + *value = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_setting_bool_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_int_v1; /* Autogenerated */ + + if (id == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_get_setting_int_v1(id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_get_setting_int_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_setting_int_v1 t = ident.get().as(); + + *value = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_setting_int_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_float_v1; /* Autogenerated */ + + if (id == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_get_setting_float_v1(id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_get_setting_float_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_setting_float_v1 t = ident.get().as(); + + *value = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_setting_float_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_setting_string_v1; /* Autogenerated */ + + if (id == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_get_setting_string_v1(id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_get_setting_string_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_setting_string_v1 t = ident.get().as(); + + *value = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_get_setting_string_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_bool_v1; /* Autogenerated */ + + if (id == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_set_setting_bool_v1(id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_set_setting_bool_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_set_setting_bool_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_set_setting_bool_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_int_v1; /* Autogenerated */ + + if (id == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_set_setting_int_v1(id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_set_setting_int_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_set_setting_int_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_set_setting_int_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_float_v1; /* Autogenerated */ + + if (id == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_set_setting_float_v1(id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_set_setting_float_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_set_setting_float_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_set_setting_float_v1(auto_gen_group.thisClassHdl, id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_set_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_set_setting_string_v1; /* Autogenerated */ + + if (id == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_addon_set_setting_string_v1(id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_set_setting_string_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_set_setting_string_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addon_base_h; + return auto_gen_group.kodi_addon_set_setting_string_v1(auto_gen_group.thisClassHdl, id, value); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.h new file mode 100644 index 0000000000000..7cb90771574af --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/addon_base.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_addon_base_h; +struct directFuncToKodi_addon_base_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addon_base_h : public IMsgHdl +{ +public: + CHdl_kodi_addon_base_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_addon_base_h* ifcToAddon); + +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ + + // Calls from Kodi to addon + static enum ADDON_STATUS kodi_addon_create_v1(void* thisClassHdl, + KODI_ADDON_HDL* hdl); // Added with API 1 + + static void kodi_addon_destroy_v1(void* thisClassHdl, KODI_ADDON_HDL hdl); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_create_instance_v1(void* thisClassHdl, + KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + const std::string& instanceID, + KODI_OWN_HDL instance, + KODI_HANDLE* addonInstance, + KODI_HANDLE parent); // Added with API 1 + + static void kodi_addon_destroy_instance_v1(void* thisClassHdl, + const KODI_ADDON_HDL hdl, + ADDON_INSTANCE instanceType, + KODI_HANDLE instance); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_setting_change_string_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const char* name, + const char* value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_setting_change_boolean_v1(void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const char* name, + bool value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_setting_change_integer_v1(void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const char* name, + int value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_setting_change_float_v1(void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const char* name, + float value); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.cpp new file mode 100644 index 0000000000000..5a61c715c63f4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.cpp @@ -0,0 +1,798 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "audio_engine.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_audio_engine_h::InitDirect(directFuncToAddon_audio_engine_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_audioengine_get_current_sink_format(struct AUDIO_ENGINE_FMT* fmt) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_get_current_sink_format(struct AUDIO_ENGINE_FMT* fmt) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ + + if (fmt == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_get_current_sink_format_v1, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_get_current_sink_format_v1 t = ident.get().as(); + + std::get<1>(t).SetCStructure(fmt); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_get_current_sink_format_v1(auto_gen_group.thisClassHdl, + fmt); +} + +ATTR_DLL_EXPORT bool kodi_audioengine_is_planar_format(enum AudioEngineDataFormat format) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_is_planar_format(enum AudioEngineDataFormat format) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_is_planar_format_v1(format)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_is_planar_format_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_is_planar_format_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_is_planar_format_v1(auto_gen_group.thisClassHdl, format); +} + +ATTR_DLL_EXPORT KODI_AE_HDL kodi_audioengine_stream_make(const struct AUDIO_ENGINE_FMT* fmt, + unsigned int options) +{ + // Original API call: ATTR_DLL_EXPORT KODI_AE_HDL kodi_audioengine_stream_make(const struct AUDIO_ENGINE_FMT* fmt, unsigned int options) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_make_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_make_v1; /* Autogenerated */ + + if (fmt == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_make_v1(fmt, options)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_make_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_make_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_make_v1(auto_gen_group.thisClassHdl, fmt, options); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_free(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_free(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_free_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_free_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_free_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_free_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_free_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_space(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_space(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_space_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_space_v1, in, out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_space_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_space_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_add_data(KODI_AE_HDL hdl, + uint8_t* const* data, + size_t planes, + size_t data_size, + unsigned int offset, + unsigned int frames, + unsigned int frame_size, + double pts, + bool hasDownmix, + double centerMixLevel) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_add_data(KODI_AE_HDL hdl, uint8_t* const* data, size_t planes, size_t data_size, unsigned int offset, unsigned int frames, unsigned int frame_size, double pts, bool hasDownmix, double centerMixLevel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple>, size_t, size_t, unsigned int, unsigned int, unsigned int, double, bool, double> msgParent__IN_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ + + if (hdl == nullptr || data == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + std::vector> ifc_data; + ifc_data.resize(planes); + for (size_t i = 0; i < planes; ++i) + ifc_data[i] = std::vector(data[i], data[i] + data_size); + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_add_data_v1( + PtrValue(hdl), ifc_data, planes, data_size, offset, frames, frame_size, + pts, hasDownmix, centerMixLevel)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_add_data_v1, in, out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_add_data_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_add_data_v1( + auto_gen_group.thisClassHdl, hdl, data, planes, data_size, offset, frames, frame_size, pts, + hasDownmix, centerMixLevel); +} + +ATTR_DLL_EXPORT double kodi_audioengine_stream_get_delay(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_delay(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_delay_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_delay_v1, in, out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_delay_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_delay_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_buffering(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_buffering(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_is_buffering_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_is_buffering_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_is_buffering_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_is_buffering_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_time(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_time(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_cache_time_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_cache_time_v1, in, + out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_cache_time_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_cache_time_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_total(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_total(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_cache_total_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_cache_total_v1, in, + out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_cache_total_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_cache_total_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_pause(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_pause(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_pause_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_pause_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_pause_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_pause_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_pause_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_resume(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_resume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_resume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_resume_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_resume_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_resume_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_resume_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_drain(KODI_AE_HDL hdl, bool wait) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_drain(KODI_AE_HDL hdl, bool wait) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_drain_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_drain_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_drain_v1(PtrValue(hdl), wait)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_drain_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_drain_v1(auto_gen_group.thisClassHdl, hdl, wait); +} + +ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_draining(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_draining(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_is_draining_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_is_draining_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_is_draining_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_is_draining_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_drained(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_drained(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_is_drained_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_is_drained_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_is_drained_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_is_drained_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_flush(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_flush(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_flush_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_flush_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_flush_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_flush_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_flush_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT float kodi_audioengine_stream_get_volume(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_volume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_volume_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_volume_v1, in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_volume_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_volume_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_set_volume(KODI_AE_HDL hdl, float volume) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_volume(KODI_AE_HDL hdl, float volume) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_set_volume_v1(PtrValue(hdl), volume)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_set_volume_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_set_volume_v1(auto_gen_group.thisClassHdl, hdl, volume); +} + +ATTR_DLL_EXPORT float kodi_audioengine_stream_get_amplification(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_amplification(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_amplification_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_amplification_v1, in, + out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_amplification_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_amplification_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_set_amplification(KODI_AE_HDL hdl, float amplify) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_amplification(KODI_AE_HDL hdl, float amplify) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_audioengine_stream_set_amplification_v1(PtrValue(hdl), amplify)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_set_amplification_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_set_amplification_v1(auto_gen_group.thisClassHdl, hdl, + amplify); +} + +ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_frame_size(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_frame_size(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_frame_size_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_frame_size_v1, in, + out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_frame_size_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_frame_size_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_channel_count(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_channel_count(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_channel_count_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_channel_count_v1, in, + out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_channel_count_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_channel_count_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_sample_rate(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_sample_rate(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_sample_rate_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_sample_rate_v1, in, + out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_sample_rate_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_sample_rate_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format( KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ + + if (hdl == nullptr) + return AUDIOENGINE_FMT_INVALID; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_data_format_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_data_format_v1, in, + out)) + return AUDIOENGINE_FMT_INVALID; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_data_format_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_data_format_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT double kodi_audioengine_stream_get_resample_ratio(KODI_AE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_resample_ratio(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_audioengine_stream_get_resample_ratio_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_get_resample_ratio_v1, in, + out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_audioengine_stream_get_resample_ratio_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + return auto_gen_group.kodi_audioengine_stream_get_resample_ratio_v1(auto_gen_group.thisClassHdl, + hdl); +} + +ATTR_DLL_EXPORT void kodi_audioengine_stream_set_resample_ratio(KODI_AE_HDL hdl, double ratio) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_resample_ratio(KODI_AE_HDL hdl, double ratio) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_audioengine_stream_set_resample_ratio_v1(PtrValue(hdl), ratio)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_audio_engine_h, funcParent_kodi_audioengine_stream_set_resample_ratio_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.audio_engine_h; + auto_gen_group.kodi_audioengine_stream_set_resample_ratio_v1(auto_gen_group.thisClassHdl, hdl, + ratio); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.h b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.h new file mode 100644 index 0000000000000..c71929c89770f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/audio_engine.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_audio_engine_h; +struct directFuncToKodi_audio_engine_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_audio_engine_h : public IMsgHdl +{ +public: + CHdl_kodi_audio_engine_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_audio_engine_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/dl/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/dl/CMakeLists.txt new file mode 100644 index 0000000000000..42d26f54f98df --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/dl/CMakeLists.txt @@ -0,0 +1,13 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + kodi_api_1.c +) + +set(HEADERS +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api_dl) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_1.c b/xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_1.c new file mode 100644 index 0000000000000..480b3fe748269 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_1.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +/* API_HASH */ + +#include "../../../../include/kodi/c-api/dl/kodi_api_1.h" +#include "include/kodi/c-api/addon_base.h" +#include "include/kodi/c-api/audio_engine.h" +#include "include/kodi/c-api/filesystem.h" +#include "include/kodi/c-api/general.h" +#include "include/kodi/c-api/gui/dialogs/context_menu.h" +#include "include/kodi/c-api/gui/dialogs/filebrowser.h" +#include "include/kodi/c-api/gui/dialogs/keyboard.h" +#include "include/kodi/c-api/gui/dialogs/numeric.h" +#include "include/kodi/c-api/gui/dialogs/ok.h" +#include "include/kodi/c-api/gui/dialogs/select.h" +#include "include/kodi/c-api/gui/dialogs/text_viewer.h" +#include "include/kodi/c-api/gui/dialogs/yes_no.h" +#include "include/kodi/c-api/gui/general.h" +#include "include/kodi/c-api/monitor.h" +#include "include/kodi/c-api/network.h" + +ATTR_DL_DLL_EXPORT bool load_kodi_api_1(struct kodi_api_1* api) +{ + if (api == NULL) + { + return false; + } + + // addon_base.h + api->kodi_addon_get_info = &kodi_addon_get_info; + api->kodi_addon_get_lib_path = &kodi_addon_get_lib_path; + api->kodi_addon_get_setting_bool = &kodi_addon_get_setting_bool; + api->kodi_addon_get_setting_float = &kodi_addon_get_setting_float; + api->kodi_addon_get_setting_int = &kodi_addon_get_setting_int; + api->kodi_addon_get_setting_string = &kodi_addon_get_setting_string; + api->kodi_addon_get_share_path = &kodi_addon_get_share_path; + api->kodi_addon_get_temp_path = &kodi_addon_get_temp_path; + api->kodi_addon_get_user_path = &kodi_addon_get_user_path; + api->kodi_addon_is_setting_using_default = &kodi_addon_is_setting_using_default; + api->kodi_addon_open_settings_dialog = &kodi_addon_open_settings_dialog; + api->kodi_addon_set_setting_bool = &kodi_addon_set_setting_bool; + api->kodi_addon_set_setting_float = &kodi_addon_set_setting_float; + api->kodi_addon_set_setting_int = &kodi_addon_set_setting_int; + api->kodi_addon_set_setting_string = &kodi_addon_set_setting_string; + api->kodi_check_main_shared = &kodi_check_main_shared; + api->kodi_deinit = &kodi_deinit; + api->kodi_init = &kodi_init; + api->kodi_log = &kodi_log; + api->kodi_process = &kodi_process; + + // audio_engine.h + api->kodi_audioengine_get_current_sink_format = &kodi_audioengine_get_current_sink_format; + api->kodi_audioengine_is_planar_format = &kodi_audioengine_is_planar_format; + api->kodi_audioengine_stream_add_data = &kodi_audioengine_stream_add_data; + api->kodi_audioengine_stream_drain = &kodi_audioengine_stream_drain; + api->kodi_audioengine_stream_flush = &kodi_audioengine_stream_flush; + api->kodi_audioengine_stream_free = &kodi_audioengine_stream_free; + api->kodi_audioengine_stream_get_amplification = &kodi_audioengine_stream_get_amplification; + api->kodi_audioengine_stream_get_cache_time = &kodi_audioengine_stream_get_cache_time; + api->kodi_audioengine_stream_get_cache_total = &kodi_audioengine_stream_get_cache_total; + api->kodi_audioengine_stream_get_channel_count = &kodi_audioengine_stream_get_channel_count; + api->kodi_audioengine_stream_get_data_format = &kodi_audioengine_stream_get_data_format; + api->kodi_audioengine_stream_get_delay = &kodi_audioengine_stream_get_delay; + api->kodi_audioengine_stream_get_frame_size = &kodi_audioengine_stream_get_frame_size; + api->kodi_audioengine_stream_get_resample_ratio = &kodi_audioengine_stream_get_resample_ratio; + api->kodi_audioengine_stream_get_sample_rate = &kodi_audioengine_stream_get_sample_rate; + api->kodi_audioengine_stream_get_space = &kodi_audioengine_stream_get_space; + api->kodi_audioengine_stream_get_volume = &kodi_audioengine_stream_get_volume; + api->kodi_audioengine_stream_is_buffering = &kodi_audioengine_stream_is_buffering; + api->kodi_audioengine_stream_is_drained = &kodi_audioengine_stream_is_drained; + api->kodi_audioengine_stream_is_draining = &kodi_audioengine_stream_is_draining; + api->kodi_audioengine_stream_make = &kodi_audioengine_stream_make; + api->kodi_audioengine_stream_pause = &kodi_audioengine_stream_pause; + api->kodi_audioengine_stream_resume = &kodi_audioengine_stream_resume; + api->kodi_audioengine_stream_set_amplification = &kodi_audioengine_stream_set_amplification; + api->kodi_audioengine_stream_set_resample_ratio = &kodi_audioengine_stream_set_resample_ratio; + api->kodi_audioengine_stream_set_volume = &kodi_audioengine_stream_set_volume; + + // filesystem.h + api->kodi_vfs_can_open_directory = &kodi_vfs_can_open_directory; + api->kodi_vfs_copy_file = &kodi_vfs_copy_file; + api->kodi_vfs_create_directory = &kodi_vfs_create_directory; + api->kodi_vfs_delete_file = &kodi_vfs_delete_file; + api->kodi_vfs_directory_exists = &kodi_vfs_directory_exists; + api->kodi_vfs_file_at_end = &kodi_vfs_file_at_end; + api->kodi_vfs_file_close = &kodi_vfs_file_close; + api->kodi_vfs_file_curl_add_option = &kodi_vfs_file_curl_add_option; + api->kodi_vfs_file_curl_create = &kodi_vfs_file_curl_create; + api->kodi_vfs_file_curl_open = &kodi_vfs_file_curl_open; + api->kodi_vfs_file_exists = &kodi_vfs_file_exists; + api->kodi_vfs_file_flush = &kodi_vfs_file_flush; + api->kodi_vfs_file_get_chunk_size = &kodi_vfs_file_get_chunk_size; + api->kodi_vfs_file_get_download_speed = &kodi_vfs_file_get_download_speed; + api->kodi_vfs_file_get_length = &kodi_vfs_file_get_length; + api->kodi_vfs_file_get_position = &kodi_vfs_file_get_position; + api->kodi_vfs_file_get_property_value = &kodi_vfs_file_get_property_value; + api->kodi_vfs_file_get_property_values = &kodi_vfs_file_get_property_values; + api->kodi_vfs_file_io_ctl_get_cache_status = &kodi_vfs_file_io_ctl_get_cache_status; + api->kodi_vfs_file_io_ctl_get_seek_possible = &kodi_vfs_file_io_ctl_get_seek_possible; + api->kodi_vfs_file_io_ctl_set_cache_rate = &kodi_vfs_file_io_ctl_set_cache_rate; + api->kodi_vfs_file_io_ctl_set_retry = &kodi_vfs_file_io_ctl_set_retry; + api->kodi_vfs_file_open = &kodi_vfs_file_open; + api->kodi_vfs_file_open_for_write = &kodi_vfs_file_open_for_write; + api->kodi_vfs_file_read = &kodi_vfs_file_read; + api->kodi_vfs_file_read_line = &kodi_vfs_file_read_line; + api->kodi_vfs_file_seek = &kodi_vfs_file_seek; + api->kodi_vfs_file_truncate = &kodi_vfs_file_truncate; + api->kodi_vfs_file_write = &kodi_vfs_file_write; + api->kodi_vfs_free_directory = &kodi_vfs_free_directory; + api->kodi_vfs_get_cache_thumb_name = &kodi_vfs_get_cache_thumb_name; + api->kodi_vfs_get_content_type = &kodi_vfs_get_content_type; + api->kodi_vfs_get_cookies = &kodi_vfs_get_cookies; + api->kodi_vfs_get_directory = &kodi_vfs_get_directory; + api->kodi_vfs_get_disk_space = &kodi_vfs_get_disk_space; + api->kodi_vfs_get_file_md5 = &kodi_vfs_get_file_md5; + api->kodi_vfs_get_mime_type = &kodi_vfs_get_mime_type; + api->kodi_vfs_http_header_close = &kodi_vfs_http_header_close; + api->kodi_vfs_http_header_get_charset = &kodi_vfs_http_header_get_charset; + api->kodi_vfs_http_header_get_header = &kodi_vfs_http_header_get_header; + api->kodi_vfs_http_header_get_mime_type = &kodi_vfs_http_header_get_mime_type; + api->kodi_vfs_http_header_get_proto_line = &kodi_vfs_http_header_get_proto_line; + api->kodi_vfs_http_header_get_value = &kodi_vfs_http_header_get_value; + api->kodi_vfs_http_header_get_values = &kodi_vfs_http_header_get_values; + api->kodi_vfs_http_header_open = &kodi_vfs_http_header_open; + api->kodi_vfs_is_internet_stream = &kodi_vfs_is_internet_stream; + api->kodi_vfs_is_local = &kodi_vfs_is_local; + api->kodi_vfs_is_on_lan = &kodi_vfs_is_on_lan; + api->kodi_vfs_is_remote = &kodi_vfs_is_remote; + api->kodi_vfs_is_url = &kodi_vfs_is_url; + api->kodi_vfs_make_legal_filename = &kodi_vfs_make_legal_filename; + api->kodi_vfs_make_legal_path = &kodi_vfs_make_legal_path; + api->kodi_vfs_remove_directory = &kodi_vfs_remove_directory; + api->kodi_vfs_remove_directory_recursive = &kodi_vfs_remove_directory_recursive; + api->kodi_vfs_rename_file = &kodi_vfs_rename_file; + api->kodi_vfs_stat_file = &kodi_vfs_stat_file; + api->kodi_vfs_translate_special_protocol = &kodi_vfs_translate_special_protocol; + + // general.h + api->kodi_change_keyboard_layout = &kodi_change_keyboard_layout; + api->kodi_get_current_skin_id = &kodi_get_current_skin_id; + api->kodi_get_digest = &kodi_get_digest; + api->kodi_get_free_mem = &kodi_get_free_mem; + api->kodi_get_global_idle_time = &kodi_get_global_idle_time; + api->kodi_get_keyboard_layout = &kodi_get_keyboard_layout; + api->kodi_get_language = &kodi_get_language; + api->kodi_get_localized_string = &kodi_get_localized_string; + api->kodi_get_region = &kodi_get_region; + api->kodi_is_addon_avilable = &kodi_is_addon_avilable; + api->kodi_play_sfx = &kodi_play_sfx; + api->kodi_queue_notification = &kodi_queue_notification; + api->kodi_stop_sfx = &kodi_stop_sfx; + api->kodi_unknown_to_utf8 = &kodi_unknown_to_utf8; + api->kodi_version = &kodi_version; + + // monitor.h + api->kodi_monitor_abort_requested = &kodi_monitor_abort_requested; + api->kodi_monitor_wait_for_abort = &kodi_monitor_wait_for_abort; + + // network.h + api->kodi_network_dns_lookup = &kodi_network_dns_lookup; + api->kodi_network_get_hostname = &kodi_network_get_hostname; + api->kodi_network_get_ip_address = &kodi_network_get_ip_address; + api->kodi_network_get_user_agent = &kodi_network_get_user_agent; + api->kodi_network_is_host_on_lan = &kodi_network_is_host_on_lan; + api->kodi_network_is_local_host = &kodi_network_is_local_host; + api->kodi_network_url_encode = &kodi_network_url_encode; + api->kodi_network_wake_on_lan = &kodi_network_wake_on_lan; + + // addon-instance/audioencoder.h + api->kodi_addon_audioencoder_seek = &kodi_addon_audioencoder_seek; + api->kodi_addon_audioencoder_write = &kodi_addon_audioencoder_write; + + // addon-instance/game.h + api->kodi_addon_game_add_stream_data = &kodi_addon_game_add_stream_data; + api->kodi_addon_game_close = &kodi_addon_game_close; + api->kodi_addon_game_close_stream = &kodi_addon_game_close_stream; + api->kodi_addon_game_get_stream_buffer = &kodi_addon_game_get_stream_buffer; + api->kodi_addon_game_input_event = &kodi_addon_game_input_event; + api->kodi_addon_game_open_stream = &kodi_addon_game_open_stream; + api->kodi_addon_game_release_stream_buffer = &kodi_addon_game_release_stream_buffer; + api->kodi_addon_hw_get_proc_address = &kodi_addon_hw_get_proc_address; + + // addon-instance/imagedecoder.h + api->kodi_addon_imagedecoder_mimetype = &kodi_addon_imagedecoder_mimetype; + + // addon-instance/inputstream.h + api->kodi_addon_inputstream_allocate_demux_packet = &kodi_addon_inputstream_allocate_demux_packet; + api->kodi_addon_inputstream_allocate_encrypted_demux_packet = + &kodi_addon_inputstream_allocate_encrypted_demux_packet; + api->kodi_addon_inputstream_free_demux_packet = &kodi_addon_inputstream_free_demux_packet; + + // addon-instance/peripheral.h + api->kodi_addon_peripheral_feature_count = &kodi_addon_peripheral_feature_count; + api->kodi_addon_peripheral_feature_type = &kodi_addon_peripheral_feature_type; + api->kodi_addon_peripheral_refresh_button_maps = &kodi_addon_peripheral_refresh_button_maps; + api->kodi_addon_peripheral_trigger_scan = &kodi_addon_peripheral_trigger_scan; + + // addon-instance/pvr.h + api->kodi_addon_pvr_add_menu_hook = &kodi_addon_pvr_add_menu_hook; + api->kodi_addon_pvr_connection_state_change = &kodi_addon_pvr_connection_state_change; + api->kodi_addon_pvr_epg_event_state_change = &kodi_addon_pvr_epg_event_state_change; + api->kodi_addon_pvr_get_epg_max_future_days = &kodi_addon_pvr_get_epg_max_future_days; + api->kodi_addon_pvr_get_epg_max_past_days = &kodi_addon_pvr_get_epg_max_past_days; + api->kodi_addon_pvr_recording_notification = &kodi_addon_pvr_recording_notification; + api->kodi_addon_pvr_transfer_channel_entry = &kodi_addon_pvr_transfer_channel_entry; + api->kodi_addon_pvr_transfer_channel_group = &kodi_addon_pvr_transfer_channel_group; + api->kodi_addon_pvr_transfer_channel_group_member = &kodi_addon_pvr_transfer_channel_group_member; + api->kodi_addon_pvr_transfer_epg_entry = &kodi_addon_pvr_transfer_epg_entry; + api->kodi_addon_pvr_transfer_provider_entry = &kodi_addon_pvr_transfer_provider_entry; + api->kodi_addon_pvr_transfer_recording_entry = &kodi_addon_pvr_transfer_recording_entry; + api->kodi_addon_pvr_transfer_timer_entry = &kodi_addon_pvr_transfer_timer_entry; + api->kodi_addon_pvr_trigger_channel_groups_update = &kodi_addon_pvr_trigger_channel_groups_update; + api->kodi_addon_pvr_trigger_channel_update = &kodi_addon_pvr_trigger_channel_update; + api->kodi_addon_pvr_trigger_epg_update = &kodi_addon_pvr_trigger_epg_update; + api->kodi_addon_pvr_trigger_providers_update = &kodi_addon_pvr_trigger_providers_update; + api->kodi_addon_pvr_trigger_recording_update = &kodi_addon_pvr_trigger_recording_update; + api->kodi_addon_pvr_trigger_timer_update = &kodi_addon_pvr_trigger_timer_update; + + // addon-instance/screensaver.h + api->kodi_addon_screensaver_get_properties = &kodi_addon_screensaver_get_properties; + + // addon-instance/vfs.h + api->kodi_addon_vfs_get_dir_cb__get_keyboard_input = + &kodi_addon_vfs_get_dir_cb__get_keyboard_input; + api->kodi_addon_vfs_get_dir_cb__require_authentication = + &kodi_addon_vfs_get_dir_cb__require_authentication; + api->kodi_addon_vfs_get_dir_cb__set_error_dialog = &kodi_addon_vfs_get_dir_cb__set_error_dialog; + + // addon-instance/videocodec.h + api->kodi_addon_videocodec_get_frame_buffer = &kodi_addon_videocodec_get_frame_buffer; + api->kodi_addon_videocodec_release_frame_buffer = &kodi_addon_videocodec_release_frame_buffer; + + // addon-instance/visualization.h + api->kodi_addon_visualization_clear_presets = &kodi_addon_visualization_clear_presets; + api->kodi_addon_visualization_get_properties = &kodi_addon_visualization_get_properties; + api->kodi_addon_visualization_transfer_preset = &kodi_addon_visualization_transfer_preset; + + // gui/general.h + api->kodi_gui_get_current_window_dialog_id = &kodi_gui_get_current_window_dialog_id; + api->kodi_gui_get_current_window_id = &kodi_gui_get_current_window_id; + api->kodi_gui_get_hw_context = &kodi_gui_get_hw_context; + api->kodi_gui_get_screen_height = &kodi_gui_get_screen_height; + api->kodi_gui_get_screen_width = &kodi_gui_get_screen_width; + api->kodi_gui_get_video_resolution = &kodi_gui_get_video_resolution; + api->kodi_gui_lock = &kodi_gui_lock; + api->kodi_gui_unlock = &kodi_gui_unlock; + + // gui/list_item.h + api->kodi_gui_listitem_create = &kodi_gui_listitem_create; + api->kodi_gui_listitem_destroy = &kodi_gui_listitem_destroy; + api->kodi_gui_listitem_get_art = &kodi_gui_listitem_get_art; + api->kodi_gui_listitem_get_label = &kodi_gui_listitem_get_label; + api->kodi_gui_listitem_get_label2 = &kodi_gui_listitem_get_label2; + api->kodi_gui_listitem_get_path = &kodi_gui_listitem_get_path; + api->kodi_gui_listitem_get_property = &kodi_gui_listitem_get_property; + api->kodi_gui_listitem_is_selected = &kodi_gui_listitem_is_selected; + api->kodi_gui_listitem_select = &kodi_gui_listitem_select; + api->kodi_gui_listitem_set_art = &kodi_gui_listitem_set_art; + api->kodi_gui_listitem_set_label = &kodi_gui_listitem_set_label; + api->kodi_gui_listitem_set_label2 = &kodi_gui_listitem_set_label2; + api->kodi_gui_listitem_set_path = &kodi_gui_listitem_set_path; + api->kodi_gui_listitem_set_property = &kodi_gui_listitem_set_property; + + // gui/window.h + api->kodi_gui_window_add_list_item = &kodi_gui_window_add_list_item; + api->kodi_gui_window_clear_item_list = &kodi_gui_window_clear_item_list; + api->kodi_gui_window_clear_properties = &kodi_gui_window_clear_properties; + api->kodi_gui_window_clear_property = &kodi_gui_window_clear_property; + api->kodi_gui_window_close = &kodi_gui_window_close; + api->kodi_gui_window_create = &kodi_gui_window_create; + api->kodi_gui_window_destroy = &kodi_gui_window_destroy; + api->kodi_gui_window_do_modal = &kodi_gui_window_do_modal; + api->kodi_gui_window_get_control_button = &kodi_gui_window_get_control_button; + api->kodi_gui_window_get_control_edit = &kodi_gui_window_get_control_edit; + api->kodi_gui_window_get_control_fade_label = &kodi_gui_window_get_control_fade_label; + api->kodi_gui_window_get_control_image = &kodi_gui_window_get_control_image; + api->kodi_gui_window_get_control_label = &kodi_gui_window_get_control_label; + api->kodi_gui_window_get_control_progress = &kodi_gui_window_get_control_progress; + api->kodi_gui_window_get_control_radio_button = &kodi_gui_window_get_control_radio_button; + api->kodi_gui_window_get_control_render_addon = &kodi_gui_window_get_control_render_addon; + api->kodi_gui_window_get_control_settings_slider = &kodi_gui_window_get_control_settings_slider; + api->kodi_gui_window_get_control_slider = &kodi_gui_window_get_control_slider; + api->kodi_gui_window_get_control_spin = &kodi_gui_window_get_control_spin; + api->kodi_gui_window_get_control_text_box = &kodi_gui_window_get_control_text_box; + api->kodi_gui_window_get_current_container_id = &kodi_gui_window_get_current_container_id; + api->kodi_gui_window_get_current_list_position = &kodi_gui_window_get_current_list_position; + api->kodi_gui_window_get_focus_id = &kodi_gui_window_get_focus_id; + api->kodi_gui_window_get_list_item = &kodi_gui_window_get_list_item; + api->kodi_gui_window_get_list_size = &kodi_gui_window_get_list_size; + api->kodi_gui_window_get_property = &kodi_gui_window_get_property; + api->kodi_gui_window_get_property_bool = &kodi_gui_window_get_property_bool; + api->kodi_gui_window_get_property_double = &kodi_gui_window_get_property_double; + api->kodi_gui_window_get_property_int = &kodi_gui_window_get_property_int; + api->kodi_gui_window_mark_dirty_region = &kodi_gui_window_mark_dirty_region; + api->kodi_gui_window_remove_list_item = &kodi_gui_window_remove_list_item; + api->kodi_gui_window_remove_list_item_from_position = + &kodi_gui_window_remove_list_item_from_position; + api->kodi_gui_window_set_container_content = &kodi_gui_window_set_container_content; + api->kodi_gui_window_set_container_property = &kodi_gui_window_set_container_property; + api->kodi_gui_window_set_control_label = &kodi_gui_window_set_control_label; + api->kodi_gui_window_set_control_selected = &kodi_gui_window_set_control_selected; + api->kodi_gui_window_set_control_visible = &kodi_gui_window_set_control_visible; + api->kodi_gui_window_set_current_list_position = &kodi_gui_window_set_current_list_position; + api->kodi_gui_window_set_focus_id = &kodi_gui_window_set_focus_id; + api->kodi_gui_window_set_property = &kodi_gui_window_set_property; + api->kodi_gui_window_set_property_bool = &kodi_gui_window_set_property_bool; + api->kodi_gui_window_set_property_double = &kodi_gui_window_set_property_double; + api->kodi_gui_window_set_property_int = &kodi_gui_window_set_property_int; + api->kodi_gui_window_show = &kodi_gui_window_show; + + // gui/controls/button.h + api->kodi_gui_controls_button_get_label = &kodi_gui_controls_button_get_label; + api->kodi_gui_controls_button_get_label2 = &kodi_gui_controls_button_get_label2; + api->kodi_gui_controls_button_set_enabled = &kodi_gui_controls_button_set_enabled; + api->kodi_gui_controls_button_set_label = &kodi_gui_controls_button_set_label; + api->kodi_gui_controls_button_set_label2 = &kodi_gui_controls_button_set_label2; + api->kodi_gui_controls_button_set_visible = &kodi_gui_controls_button_set_visible; + + // gui/controls/edit.h + api->kodi_gui_controls_edit_get_cursor_position = &kodi_gui_controls_edit_get_cursor_position; + api->kodi_gui_controls_edit_get_label = &kodi_gui_controls_edit_get_label; + api->kodi_gui_controls_edit_get_text = &kodi_gui_controls_edit_get_text; + api->kodi_gui_controls_edit_set_cursor_position = &kodi_gui_controls_edit_set_cursor_position; + api->kodi_gui_controls_edit_set_enabled = &kodi_gui_controls_edit_set_enabled; + api->kodi_gui_controls_edit_set_input_type = &kodi_gui_controls_edit_set_input_type; + api->kodi_gui_controls_edit_set_label = &kodi_gui_controls_edit_set_label; + api->kodi_gui_controls_edit_set_text = &kodi_gui_controls_edit_set_text; + api->kodi_gui_controls_edit_set_visible = &kodi_gui_controls_edit_set_visible; + + // gui/controls/fade_label.h + api->kodi_gui_controls_fade_label_add_label = &kodi_gui_controls_fade_label_add_label; + api->kodi_gui_controls_fade_label_get_label = &kodi_gui_controls_fade_label_get_label; + api->kodi_gui_controls_fade_label_reset = &kodi_gui_controls_fade_label_reset; + api->kodi_gui_controls_fade_label_set_scrolling = &kodi_gui_controls_fade_label_set_scrolling; + api->kodi_gui_controls_fade_label_set_visible = &kodi_gui_controls_fade_label_set_visible; + + // gui/controls/image.h + api->kodi_gui_controls_image_set_color_diffuse = &kodi_gui_controls_image_set_color_diffuse; + api->kodi_gui_controls_image_set_filename = &kodi_gui_controls_image_set_filename; + api->kodi_gui_controls_image_set_visible = &kodi_gui_controls_image_set_visible; + + // gui/controls/label.h + api->kodi_gui_controls_label_get_label = &kodi_gui_controls_label_get_label; + api->kodi_gui_controls_label_set_label = &kodi_gui_controls_label_set_label; + api->kodi_gui_controls_label_set_visible = &kodi_gui_controls_label_set_visible; + + // gui/controls/progress.h + api->kodi_gui_controls_progress_get_percentage = &kodi_gui_controls_progress_get_percentage; + api->kodi_gui_controls_progress_set_percentage = &kodi_gui_controls_progress_set_percentage; + api->kodi_gui_controls_progress_set_visible = &kodi_gui_controls_progress_set_visible; + + // gui/controls/radio_button.h + api->kodi_gui_controls_radio_button_get_label = &kodi_gui_controls_radio_button_get_label; + api->kodi_gui_controls_radio_button_is_selected = &kodi_gui_controls_radio_button_is_selected; + api->kodi_gui_controls_radio_button_set_enabled = &kodi_gui_controls_radio_button_set_enabled; + api->kodi_gui_controls_radio_button_set_label = &kodi_gui_controls_radio_button_set_label; + api->kodi_gui_controls_radio_button_set_selected = &kodi_gui_controls_radio_button_set_selected; + api->kodi_gui_controls_radio_button_set_visible = &kodi_gui_controls_radio_button_set_visible; + + // gui/controls/rendering.h + api->kodi_gui_controls_radio_rendering_destroy = &kodi_gui_controls_radio_rendering_destroy; + + // gui/controls/settings_slider.h + api->kodi_gui_controls_settings_slider_get_float_value = + &kodi_gui_controls_settings_slider_get_float_value; + api->kodi_gui_controls_settings_slider_get_int_value = + &kodi_gui_controls_settings_slider_get_int_value; + api->kodi_gui_controls_settings_slider_get_percentage = + &kodi_gui_controls_settings_slider_get_percentage; + api->kodi_gui_controls_settings_slider_reset = &kodi_gui_controls_settings_slider_reset; + api->kodi_gui_controls_settings_slider_set_enabled = + &kodi_gui_controls_settings_slider_set_enabled; + api->kodi_gui_controls_settings_slider_set_float_interval = + &kodi_gui_controls_settings_slider_set_float_interval; + api->kodi_gui_controls_settings_slider_set_float_range = + &kodi_gui_controls_settings_slider_set_float_range; + api->kodi_gui_controls_settings_slider_set_float_value = + &kodi_gui_controls_settings_slider_set_float_value; + api->kodi_gui_controls_settings_slider_set_int_interval = + &kodi_gui_controls_settings_slider_set_int_interval; + api->kodi_gui_controls_settings_slider_set_int_range = + &kodi_gui_controls_settings_slider_set_int_range; + api->kodi_gui_controls_settings_slider_set_int_value = + &kodi_gui_controls_settings_slider_set_int_value; + api->kodi_gui_controls_settings_slider_set_percentage = + &kodi_gui_controls_settings_slider_set_percentage; + api->kodi_gui_controls_settings_slider_set_text = &kodi_gui_controls_settings_slider_set_text; + api->kodi_gui_controls_settings_slider_set_visible = + &kodi_gui_controls_settings_slider_set_visible; + + // gui/controls/slider.h + api->kodi_gui_controls_slider_get_description = &kodi_gui_controls_slider_get_description; + api->kodi_gui_controls_slider_get_float_value = &kodi_gui_controls_slider_get_float_value; + api->kodi_gui_controls_slider_get_int_value = &kodi_gui_controls_slider_get_int_value; + api->kodi_gui_controls_slider_get_percentage = &kodi_gui_controls_slider_get_percentage; + api->kodi_gui_controls_slider_reset = &kodi_gui_controls_slider_reset; + api->kodi_gui_controls_slider_set_enabled = &kodi_gui_controls_slider_set_enabled; + api->kodi_gui_controls_slider_set_float_interval = &kodi_gui_controls_slider_set_float_interval; + api->kodi_gui_controls_slider_set_float_range = &kodi_gui_controls_slider_set_float_range; + api->kodi_gui_controls_slider_set_float_value = &kodi_gui_controls_slider_set_float_value; + api->kodi_gui_controls_slider_set_int_interval = &kodi_gui_controls_slider_set_int_interval; + api->kodi_gui_controls_slider_set_int_range = &kodi_gui_controls_slider_set_int_range; + api->kodi_gui_controls_slider_set_int_value = &kodi_gui_controls_slider_set_int_value; + api->kodi_gui_controls_slider_set_percentage = &kodi_gui_controls_slider_set_percentage; + api->kodi_gui_controls_slider_set_visible = &kodi_gui_controls_slider_set_visible; + + // gui/controls/spin.h + api->kodi_gui_controls_spin_add_int_label = &kodi_gui_controls_spin_add_int_label; + api->kodi_gui_controls_spin_add_string_label = &kodi_gui_controls_spin_add_string_label; + api->kodi_gui_controls_spin_get_float_value = &kodi_gui_controls_spin_get_float_value; + api->kodi_gui_controls_spin_get_int_value = &kodi_gui_controls_spin_get_int_value; + api->kodi_gui_controls_spin_get_string_value = &kodi_gui_controls_spin_get_string_value; + api->kodi_gui_controls_spin_reset = &kodi_gui_controls_spin_reset; + api->kodi_gui_controls_spin_set_enabled = &kodi_gui_controls_spin_set_enabled; + api->kodi_gui_controls_spin_set_float_interval = &kodi_gui_controls_spin_set_float_interval; + api->kodi_gui_controls_spin_set_float_range = &kodi_gui_controls_spin_set_float_range; + api->kodi_gui_controls_spin_set_float_value = &kodi_gui_controls_spin_set_float_value; + api->kodi_gui_controls_spin_set_int_range = &kodi_gui_controls_spin_set_int_range; + api->kodi_gui_controls_spin_set_int_value = &kodi_gui_controls_spin_set_int_value; + api->kodi_gui_controls_spin_set_string_value = &kodi_gui_controls_spin_set_string_value; + api->kodi_gui_controls_spin_set_text = &kodi_gui_controls_spin_set_text; + api->kodi_gui_controls_spin_set_type = &kodi_gui_controls_spin_set_type; + api->kodi_gui_controls_spin_set_visible = &kodi_gui_controls_spin_set_visible; + + // gui/controls/text_box.h + api->kodi_gui_controls_text_box_get_text = &kodi_gui_controls_text_box_get_text; + api->kodi_gui_controls_text_box_reset = &kodi_gui_controls_text_box_reset; + api->kodi_gui_controls_text_box_scroll = &kodi_gui_controls_text_box_scroll; + api->kodi_gui_controls_text_box_set_auto_scrolling = + &kodi_gui_controls_text_box_set_auto_scrolling; + api->kodi_gui_controls_text_box_set_text = &kodi_gui_controls_text_box_set_text; + api->kodi_gui_controls_text_box_set_visible = &kodi_gui_controls_text_box_set_visible; + + // gui/dialogs/context_menu.h + api->kodi_gui_dialogs_context_menu_open = &kodi_gui_dialogs_context_menu_open; + + // gui/dialogs/extended_progress.h + api->kodi_gui_dialogs_extended_progress_delete_dialog = + &kodi_gui_dialogs_extended_progress_delete_dialog; + api->kodi_gui_dialogs_extended_progress_get_percentage = + &kodi_gui_dialogs_extended_progress_get_percentage; + api->kodi_gui_dialogs_extended_progress_get_text = &kodi_gui_dialogs_extended_progress_get_text; + api->kodi_gui_dialogs_extended_progress_get_title = &kodi_gui_dialogs_extended_progress_get_title; + api->kodi_gui_dialogs_extended_progress_is_finished = + &kodi_gui_dialogs_extended_progress_is_finished; + api->kodi_gui_dialogs_extended_progress_mark_finished = + &kodi_gui_dialogs_extended_progress_mark_finished; + api->kodi_gui_dialogs_extended_progress_new_dialog = + &kodi_gui_dialogs_extended_progress_new_dialog; + api->kodi_gui_dialogs_extended_progress_set_percentage = + &kodi_gui_dialogs_extended_progress_set_percentage; + api->kodi_gui_dialogs_extended_progress_set_progress = + &kodi_gui_dialogs_extended_progress_set_progress; + api->kodi_gui_dialogs_extended_progress_set_text = &kodi_gui_dialogs_extended_progress_set_text; + api->kodi_gui_dialogs_extended_progress_set_title = &kodi_gui_dialogs_extended_progress_set_title; + + // gui/dialogs/filebrowser.h + api->kodi_gui_dialogs_file_browser_clear_file_list = + &kodi_gui_dialogs_file_browser_clear_file_list; + api->kodi_gui_dialogs_file_browser_show_and_get_directory = + &kodi_gui_dialogs_file_browser_show_and_get_directory; + api->kodi_gui_dialogs_file_browser_show_and_get_file = + &kodi_gui_dialogs_file_browser_show_and_get_file; + api->kodi_gui_dialogs_file_browser_show_and_get_file_from_dir = + &kodi_gui_dialogs_file_browser_show_and_get_file_from_dir; + api->kodi_gui_dialogs_file_browser_show_and_get_file_list = + &kodi_gui_dialogs_file_browser_show_and_get_file_list; + api->kodi_gui_dialogs_file_browser_show_and_get_image = + &kodi_gui_dialogs_file_browser_show_and_get_image; + api->kodi_gui_dialogs_file_browser_show_and_get_image_list = + &kodi_gui_dialogs_file_browser_show_and_get_image_list; + api->kodi_gui_dialogs_file_browser_show_and_get_source = + &kodi_gui_dialogs_file_browser_show_and_get_source; + + // gui/dialogs/keyboard.h + api->kodi_gui_dialogs_keyboard_is_keyboard_activated = + &kodi_gui_dialogs_keyboard_is_keyboard_activated; + api->kodi_gui_dialogs_keyboard_send_text_to_active_keyboard = + &kodi_gui_dialogs_keyboard_send_text_to_active_keyboard; + api->kodi_gui_dialogs_keyboard_show_and_get_filter = + &kodi_gui_dialogs_keyboard_show_and_get_filter; + api->kodi_gui_dialogs_keyboard_show_and_get_input = &kodi_gui_dialogs_keyboard_show_and_get_input; + api->kodi_gui_dialogs_keyboard_show_and_get_input_with_head = + &kodi_gui_dialogs_keyboard_show_and_get_input_with_head; + api->kodi_gui_dialogs_keyboard_show_and_get_new_password = + &kodi_gui_dialogs_keyboard_show_and_get_new_password; + api->kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head = + &kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head; + api->kodi_gui_dialogs_keyboard_show_and_verify_new_password = + &kodi_gui_dialogs_keyboard_show_and_verify_new_password; + api->kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head = + &kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head; + api->kodi_gui_dialogs_keyboard_show_and_verify_password = + &kodi_gui_dialogs_keyboard_show_and_verify_password; + + // gui/dialogs/numeric.h + api->kodi_gui_dialogs_numeric_show_and_get_date = &kodi_gui_dialogs_numeric_show_and_get_date; + api->kodi_gui_dialogs_numeric_show_and_get_ip_address = + &kodi_gui_dialogs_numeric_show_and_get_ip_address; + api->kodi_gui_dialogs_numeric_show_and_get_number = &kodi_gui_dialogs_numeric_show_and_get_number; + api->kodi_gui_dialogs_numeric_show_and_get_seconds = + &kodi_gui_dialogs_numeric_show_and_get_seconds; + api->kodi_gui_dialogs_numeric_show_and_get_time = &kodi_gui_dialogs_numeric_show_and_get_time; + api->kodi_gui_dialogs_numeric_show_and_verify_input = + &kodi_gui_dialogs_numeric_show_and_verify_input; + api->kodi_gui_dialogs_numeric_show_and_verify_new_password = + &kodi_gui_dialogs_numeric_show_and_verify_new_password; + api->kodi_gui_dialogs_numeric_show_and_verify_password = + &kodi_gui_dialogs_numeric_show_and_verify_password; + + // gui/dialogs/ok.h + api->kodi_gui_dialogs_ok_show_and_get_input_line_text = + &kodi_gui_dialogs_ok_show_and_get_input_line_text; + api->kodi_gui_dialogs_ok_show_and_get_input_single_text = + &kodi_gui_dialogs_ok_show_and_get_input_single_text; + + // gui/dialogs/progress.h + api->kodi_gui_dialogs_progress_abort = &kodi_gui_dialogs_progress_abort; + api->kodi_gui_dialogs_progress_delete_dialog = &kodi_gui_dialogs_progress_delete_dialog; + api->kodi_gui_dialogs_progress_get_percentage = &kodi_gui_dialogs_progress_get_percentage; + api->kodi_gui_dialogs_progress_is_canceled = &kodi_gui_dialogs_progress_is_canceled; + api->kodi_gui_dialogs_progress_new_dialog = &kodi_gui_dialogs_progress_new_dialog; + api->kodi_gui_dialogs_progress_open = &kodi_gui_dialogs_progress_open; + api->kodi_gui_dialogs_progress_set_can_cancel = &kodi_gui_dialogs_progress_set_can_cancel; + api->kodi_gui_dialogs_progress_set_heading = &kodi_gui_dialogs_progress_set_heading; + api->kodi_gui_dialogs_progress_set_line = &kodi_gui_dialogs_progress_set_line; + api->kodi_gui_dialogs_progress_set_percentage = &kodi_gui_dialogs_progress_set_percentage; + api->kodi_gui_dialogs_progress_set_progress_advance = + &kodi_gui_dialogs_progress_set_progress_advance; + api->kodi_gui_dialogs_progress_set_progress_max = &kodi_gui_dialogs_progress_set_progress_max; + api->kodi_gui_dialogs_progress_show_progress_bar = &kodi_gui_dialogs_progress_show_progress_bar; + + // gui/dialogs/select.h + api->kodi_gui_dialogs_select_open = &kodi_gui_dialogs_select_open; + api->kodi_gui_dialogs_select_open_multi_select = &kodi_gui_dialogs_select_open_multi_select; + + // gui/dialogs/text_viewer.h + api->kodi_gui_dialogs_text_viewer_show = &kodi_gui_dialogs_text_viewer_show; + + // gui/dialogs/yes_no.h + api->kodi_gui_dialogs_yesno_show_and_get_input_line_button_text = + &kodi_gui_dialogs_yesno_show_and_get_input_line_button_text; + api->kodi_gui_dialogs_yesno_show_and_get_input_line_text = + &kodi_gui_dialogs_yesno_show_and_get_input_line_text; + api->kodi_gui_dialogs_yesno_show_and_get_input_single_text = + &kodi_gui_dialogs_yesno_show_and_get_input_single_text; + + return true; +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.cpp new file mode 100644 index 0000000000000..d13c715cf411e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.cpp @@ -0,0 +1,1762 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "filesystem.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_filesystem_h::InitDirect(directFuncToAddon_filesystem_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_vfs_can_open_directory(const char* url) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_can_open_directory(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_can_open_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_can_open_directory_v1; /* Autogenerated */ + + if (url == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_can_open_directory_v1(url)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_can_open_directory_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_can_open_directory_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_can_open_directory_v1(auto_gen_group.thisClassHdl, url); +} + +ATTR_DLL_EXPORT bool kodi_vfs_create_directory(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_create_directory(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_create_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_create_directory_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_create_directory_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_create_directory_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_create_directory_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_create_directory_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_remove_directory(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_remove_directory_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_remove_directory_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_remove_directory_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_remove_directory_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_remove_directory_recursive(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory_recursive(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_remove_directory_recursive_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_remove_directory_recursive_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_remove_directory_recursive_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_remove_directory_recursive_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_directory_exists(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_directory_exists(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_directory_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_directory_exists_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_directory_exists_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_directory_exists_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_directory_exists_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_directory_exists_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_get_directory(const char* path, + const char* mask, + struct VFS_DIR_ENTRY** items, + size_t* num_items) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_directory(const char* path, const char* mask, struct VFS_DIR_ENTRY** items, size_t* num_items) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_get_directory_v1; /* Autogenerated */ + + if (path == nullptr || mask == nullptr || items == nullptr || num_items == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_directory_v1(path, mask, *num_items)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_directory_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_directory_v1 t = ident.get().as(); + + std::vector& ifc_items = std::get<1>(t); + *num_items = std::get<2>(t); + *items = static_cast(malloc(sizeof(VFS_DIR_ENTRY) * ifc_items.size())); + for (size_t i = 0; i < ifc_items.size(); ++i) + ifc_items[i].SetCStructure(&(*items)[i]); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_directory_v1(auto_gen_group.thisClassHdl, path, mask, items, + num_items); +} + +ATTR_DLL_EXPORT void kodi_vfs_free_directory(struct VFS_DIR_ENTRY* items, size_t num_items) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_free_directory(struct VFS_DIR_ENTRY* items, size_t num_items) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_vfs_free_directory - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_vfs_free_directory - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + for (unsigned int i = 0; i < num_items; ++i) + { + if (items[i].label) + { + free(items[i].label); + items[i].label = nullptr; + } + if (items[i].title) + { + free(items[i].title); + items[i].title = nullptr; + } + if (items[i].path) + { + free(items[i].path); + items[i].path = nullptr; + } + if (items[i].properties) + { + free(items[i].properties); + items[i].properties = nullptr; + } + } + free(items); + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_exists(const char* filename, bool useCache) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_exists(const char* filename, bool useCache) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_exists_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_exists_v1; /* Autogenerated */ + + if (filename == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_exists_v1(filename, useCache)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_exists_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_exists_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_exists_v1(auto_gen_group.thisClassHdl, filename, useCache); +} + +ATTR_DLL_EXPORT bool kodi_vfs_stat_file(const char* filename, struct VFS_STAT_STRUCTURE* buffer) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_stat_file(const char* filename, struct VFS_STAT_STRUCTURE* buffer) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_stat_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_stat_file_v1; /* Autogenerated */ + + if (filename == nullptr || buffer == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_stat_file_v1(filename)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_stat_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_stat_file_v1 t = ident.get().as(); + + std::get<1>(t).SetCStructure(buffer); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_stat_file_v1(auto_gen_group.thisClassHdl, filename, buffer); +} + +ATTR_DLL_EXPORT bool kodi_vfs_delete_file(const char* filename) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_delete_file(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_delete_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_delete_file_v1; /* Autogenerated */ + + if (filename == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_delete_file_v1(filename)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_delete_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_delete_file_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_delete_file_v1(auto_gen_group.thisClassHdl, filename); +} + +ATTR_DLL_EXPORT bool kodi_vfs_rename_file(const char* filename, const char* newFileName) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_rename_file(const char* filename, const char* newFileName) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_rename_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_rename_file_v1; /* Autogenerated */ + + if (filename == nullptr || newFileName == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_rename_file_v1(filename, newFileName)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_rename_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_rename_file_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_rename_file_v1(auto_gen_group.thisClassHdl, filename, newFileName); +} + +ATTR_DLL_EXPORT bool kodi_vfs_copy_file(const char* filename, const char* dest) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_copy_file(const char* filename, const char* dest) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_copy_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_copy_file_v1; /* Autogenerated */ + + if (filename == nullptr || dest == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_copy_file_v1(filename, dest)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_copy_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_copy_file_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_copy_file_v1(auto_gen_group.thisClassHdl, filename, dest); +} + +ATTR_DLL_EXPORT char* kodi_vfs_get_file_md5(const char* filename) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_file_md5(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_file_md5_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_file_md5_v1; /* Autogenerated */ + + if (filename == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_file_md5_v1(filename)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_file_md5_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_file_md5_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_file_md5_v1(auto_gen_group.thisClassHdl, filename); +} + +ATTR_DLL_EXPORT char* kodi_vfs_get_cache_thumb_name(const char* filename) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_cache_thumb_name(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ + + if (filename == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_cache_thumb_name_v1(filename)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_cache_thumb_name_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_cache_thumb_name_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_cache_thumb_name_v1(auto_gen_group.thisClassHdl, filename); +} + +ATTR_DLL_EXPORT char* kodi_vfs_make_legal_filename(const char* filename) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_filename(const char* filename) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ + + if (filename == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_make_legal_filename_v1(filename)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_make_legal_filename_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_make_legal_filename_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_make_legal_filename_v1(auto_gen_group.thisClassHdl, filename); +} + +ATTR_DLL_EXPORT char* kodi_vfs_make_legal_path(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_path(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_make_legal_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_path_v1; /* Autogenerated */ + + if (path == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_make_legal_path_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_make_legal_path_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_make_legal_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_make_legal_path_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT char* kodi_vfs_translate_special_protocol(const char* strSource) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_translate_special_protocol(const char* strSource) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ + + if (strSource == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_translate_special_protocol_v1(strSource)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_translate_special_protocol_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_translate_special_protocol_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_translate_special_protocol_v1(auto_gen_group.thisClassHdl, + strSource); +} + +ATTR_DLL_EXPORT bool kodi_vfs_is_internet_stream(const char* path, bool strictCheck) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_internet_stream(const char* path, bool strictCheck) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_is_internet_stream_v1(path, strictCheck)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_is_internet_stream_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_is_internet_stream_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_is_internet_stream_v1(auto_gen_group.thisClassHdl, path, + strictCheck); +} + +ATTR_DLL_EXPORT bool kodi_vfs_is_on_lan(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_on_lan(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_on_lan_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_is_on_lan_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_is_on_lan_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_is_on_lan_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_is_on_lan_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_is_remote(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_remote(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_remote_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_remote_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_is_remote_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_is_remote_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_is_remote_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_is_remote_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_is_local(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_local(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_local_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_local_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_is_local_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_is_local_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_is_local_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_is_local_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_is_url(const char* path) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_url(const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_is_url_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_is_url_v1; /* Autogenerated */ + + if (path == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_is_url_v1(path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_is_url_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_is_url_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_is_url_v1(auto_gen_group.thisClassHdl, path); +} + +ATTR_DLL_EXPORT bool kodi_vfs_get_mime_type(const char* url, char** content, const char* useragent) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_mime_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_mime_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_mime_type_v1; /* Autogenerated */ + + if (url == nullptr || content == nullptr || useragent == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_mime_type_v1(url, useragent)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_mime_type_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_mime_type_v1 t = ident.get().as(); + + *content = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_mime_type_v1(auto_gen_group.thisClassHdl, url, content, + useragent); +} + +ATTR_DLL_EXPORT bool kodi_vfs_get_content_type(const char* url, + char** content, + const char* useragent) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_content_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_content_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_content_type_v1; /* Autogenerated */ + + if (url == nullptr || content == nullptr || useragent == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_content_type_v1(url, useragent)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_content_type_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_content_type_v1 t = ident.get().as(); + + *content = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_content_type_v1(auto_gen_group.thisClassHdl, url, content, + useragent); +} + +ATTR_DLL_EXPORT bool kodi_vfs_get_cookies(const char* url, char** cookies) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_cookies(const char* url, char** cookies) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_cookies_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_cookies_v1; /* Autogenerated */ + + if (url == nullptr || cookies == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_cookies_v1(url)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_cookies_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_cookies_v1 t = ident.get().as(); + + *cookies = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_cookies_v1(auto_gen_group.thisClassHdl, url, cookies); +} + +ATTR_DLL_EXPORT bool kodi_vfs_get_disk_space(const char* path, + uint64_t* capacity, + uint64_t* free, + uint64_t* available) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_disk_space(const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_get_disk_space_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_get_disk_space_v1; /* Autogenerated */ + + if (path == nullptr || capacity == nullptr || free == nullptr || available == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_get_disk_space_v1(path, *capacity, *free, *available)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_get_disk_space_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_get_disk_space_v1 t = ident.get().as(); + + *capacity = std::get<1>(t); + *free = std::get<2>(t); + *available = std::get<3>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_get_disk_space_v1(auto_gen_group.thisClassHdl, path, capacity, + free, available); +} + +ATTR_DLL_EXPORT KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open(const char* url) +{ + // Original API call: ATTR_DLL_EXPORT KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_open_v1; /* Autogenerated */ + + if (url == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_open_v1(url)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_open_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_open_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_open_v1(auto_gen_group.thisClassHdl, url); +} + +ATTR_DLL_EXPORT void kodi_vfs_http_header_close(KODI_HTTP_HEADER_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_http_header_close(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_close_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_close_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_close_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + auto_gen_group.kodi_vfs_http_header_close_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_value(KODI_HTTP_HEADER_HDL hdl, const char* param) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_value(KODI_HTTP_HEADER_HDL hdl, const char* param) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ + + if (hdl == nullptr || param == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_get_value_v1(PtrValue(hdl), param)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_value_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_value_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_value_v1(auto_gen_group.thisClassHdl, hdl, param); +} + +ATTR_DLL_EXPORT char** kodi_vfs_http_header_get_values(KODI_HTTP_HEADER_HDL hdl, + const char* param, + size_t* length) +{ + // Original API call: ATTR_DLL_EXPORT char** kodi_vfs_http_header_get_values(KODI_HTTP_HEADER_HDL hdl, const char* param, size_t* length) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ + + if (hdl == nullptr || param == nullptr || length == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_vfs_http_header_get_values_v1(PtrValue(hdl), param, *length)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_values_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_values_v1 t = ident.get().as(); + + *length = std::get<1>(t); + const std::vector& values = std::get<0>(t); + char** ret = static_cast(malloc(sizeof(char*) * values.size())); + for (size_t i = 0; i < *length; ++i) + { + ret[i] = strdup(values[i].c_str()); + } + return ret; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_values_v1(auto_gen_group.thisClassHdl, hdl, param, + length); +} + +ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_header(KODI_HTTP_HEADER_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_header(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ + + if (hdl == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_get_header_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_header_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_header_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_header_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_mime_type(KODI_HTTP_HEADER_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_mime_type(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ + + if (hdl == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_get_mime_type_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_mime_type_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_mime_type_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_mime_type_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_charset(KODI_HTTP_HEADER_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_charset(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ + + if (hdl == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_get_charset_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_charset_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_charset_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_charset_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_proto_line(KODI_HTTP_HEADER_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_proto_line(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ + + if (hdl == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_http_header_get_proto_line_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_http_header_get_proto_line_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_http_header_get_proto_line_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_http_header_get_proto_line_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open(const char* filename, unsigned int flags) +{ + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open(const char* filename, unsigned int flags) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_open_v1; /* Autogenerated */ + + if (filename == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_open_v1(filename, flags)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_open_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_open_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_open_v1(auto_gen_group.thisClassHdl, filename, flags); +} + +ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open_for_write(const char* filename, bool overwrite) +{ + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open_for_write(const char* filename, bool overwrite) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ + + if (filename == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_open_for_write_v1(filename, overwrite)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_open_for_write_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_open_for_write_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_open_for_write_v1(auto_gen_group.thisClassHdl, filename, + overwrite); +} + +ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_curl_create(const char* url) +{ + // Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_curl_create(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_create_v1; /* Autogenerated */ + + if (url == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_curl_create_v1(url)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_curl_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_curl_create_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_curl_create_v1(auto_gen_group.thisClassHdl, url); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_curl_add_option(KODI_FILE_HDL hdl, + enum CURLOptiontype type, + const char* name, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_add_option(KODI_FILE_HDL hdl, enum CURLOptiontype type, const char* name, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ + + if (hdl == nullptr || name == nullptr || value == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_vfs_file_curl_add_option_v1(PtrValue(hdl), type, name, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_curl_add_option_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_curl_add_option_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_curl_add_option_v1(auto_gen_group.thisClassHdl, hdl, type, + name, value); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_curl_open(KODI_FILE_HDL hdl, unsigned int flags) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_open(KODI_FILE_HDL hdl, unsigned int flags) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_curl_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_open_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_curl_open_v1(PtrValue(hdl), flags)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_curl_open_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_curl_open_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_curl_open_v1(auto_gen_group.thisClassHdl, hdl, flags); +} + +ATTR_DLL_EXPORT void kodi_vfs_file_close(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_close(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_close_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_close_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_filesystem_h, + funcParent_kodi_vfs_file_close_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + auto_gen_group.kodi_vfs_file_close_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT ssize_t kodi_vfs_file_read(KODI_FILE_HDL hdl, uint8_t* ptr, size_t size) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_read(KODI_FILE_HDL hdl, uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_read_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgParent_OUT_kodi_vfs_file_read_v1; /* Autogenerated */ + + if (hdl == nullptr || ptr == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_read_v1(PtrValue(hdl), size)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_read_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_read_v1 t = ident.get().as(); + + std::memcpy(ptr, std::get<1>(t).data(), sizeof(uint8_t) * size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_read_v1(auto_gen_group.thisClassHdl, hdl, ptr, size); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_read_line(KODI_FILE_HDL hdl, char* szLine, size_t lineLength) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_read_line(KODI_FILE_HDL hdl, char* szLine, size_t lineLength) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_read_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_read_line_v1; /* Autogenerated */ + + if (hdl == nullptr || szLine == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_read_line_v1(PtrValue(hdl), lineLength)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_read_line_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_read_line_v1 t = ident.get().as(); + + strncpy(szLine, std::get<1>(t).c_str(), lineLength); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_read_line_v1(auto_gen_group.thisClassHdl, hdl, szLine, + lineLength); +} + +ATTR_DLL_EXPORT ssize_t kodi_vfs_file_write(KODI_FILE_HDL hdl, const uint8_t* ptr, size_t size) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_write(KODI_FILE_HDL hdl, const uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_vfs_file_write_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_write_v1; /* Autogenerated */ + + if (hdl == nullptr || ptr == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_write_v1( + PtrValue(hdl), std::vector(ptr, ptr + size), size)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_write_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_write_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_write_v1(auto_gen_group.thisClassHdl, hdl, ptr, size); +} + +ATTR_DLL_EXPORT void kodi_vfs_file_flush(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_flush(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_flush_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_flush_v1; /* Autogenerated */ + + if (hdl == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_flush_v1(PtrValue(hdl))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_filesystem_h, + funcParent_kodi_vfs_file_flush_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + auto_gen_group.kodi_vfs_file_flush_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT int64_t kodi_vfs_file_seek(KODI_FILE_HDL hdl, int64_t position, int whence) +{ + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_seek(KODI_FILE_HDL hdl, int64_t position, int whence) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_seek_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_seek_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_seek_v1(PtrValue(hdl), position, whence)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_seek_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_seek_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_seek_v1(auto_gen_group.thisClassHdl, hdl, position, whence); +} + +ATTR_DLL_EXPORT int kodi_vfs_file_truncate(KODI_FILE_HDL hdl, int64_t size) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_truncate(KODI_FILE_HDL hdl, int64_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_truncate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_truncate_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_truncate_v1(PtrValue(hdl), size)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_truncate_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_truncate_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_truncate_v1(auto_gen_group.thisClassHdl, hdl, size); +} + +ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_position(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_position(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_position_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_get_position_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_position_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_position_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_position_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_length(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_length(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_length_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_length_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_get_length_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_length_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_length_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_length_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_at_end(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_at_end(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_at_end_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_at_end_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_at_end_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_at_end_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_at_end_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_at_end_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT double kodi_vfs_file_get_download_speed(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_vfs_file_get_download_speed(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ + + if (hdl == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_get_download_speed_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_download_speed_v1, in, out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_download_speed_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_download_speed_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT int kodi_vfs_file_get_chunk_size(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_get_chunk_size(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ + + if (hdl == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_get_chunk_size_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_chunk_size_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_chunk_size_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_chunk_size_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_seek_possible(KODI_FILE_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_seek_possible(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_io_ctl_get_seek_possible_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_io_ctl_get_seek_possible_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_io_ctl_get_seek_possible_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_io_ctl_get_seek_possible_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_cache_status(KODI_FILE_HDL hdl, + struct VFS_CACHE_STATUS* status) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_cache_status(KODI_FILE_HDL hdl, struct VFS_CACHE_STATUS* status) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ + + if (hdl == nullptr || status == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_io_ctl_get_cache_status_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_io_ctl_get_cache_status_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_io_ctl_get_cache_status_v1 t = ident.get().as(); + + std::get<1>(t).SetCStructure(status); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_io_ctl_get_cache_status_v1(auto_gen_group.thisClassHdl, hdl, + status); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, unsigned int rate) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, unsigned int rate) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_io_ctl_set_cache_rate_v1(PtrValue(hdl), rate)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_io_ctl_set_cache_rate_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_io_ctl_set_cache_rate_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_io_ctl_set_cache_rate_v1(auto_gen_group.thisClassHdl, hdl, + rate); +} + +ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_retry(KODI_FILE_HDL hdl, bool retry) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_retry(KODI_FILE_HDL hdl, bool retry) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ + + if (hdl == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_io_ctl_set_retry_v1(PtrValue(hdl), retry)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_io_ctl_set_retry_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_io_ctl_set_retry_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_io_ctl_set_retry_v1(auto_gen_group.thisClassHdl, hdl, retry); +} + +ATTR_DLL_EXPORT char* kodi_vfs_file_get_property_value(KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_vfs_file_get_property_value(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ + + if (hdl == nullptr || name == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_vfs_file_get_property_value_v1(PtrValue(hdl), type, name)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_property_value_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_property_value_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_property_value_v1(auto_gen_group.thisClassHdl, hdl, type, + name); +} + +ATTR_DLL_EXPORT char** kodi_vfs_file_get_property_values(KODI_FILE_HDL hdl, + enum FilePropertyTypes type, + const char* name, + size_t* length) +{ + // Original API call: ATTR_DLL_EXPORT char** kodi_vfs_file_get_property_values(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name, size_t* length) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ + + if (hdl == nullptr || name == nullptr || length == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_vfs_file_get_property_values_v1(PtrValue(hdl), type, name, *length)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_filesystem_h, funcParent_kodi_vfs_file_get_property_values_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_vfs_file_get_property_values_v1 t = ident.get().as(); + + *length = std::get<1>(t); + const std::vector& values = std::get<0>(t); + char** ret = static_cast(malloc(sizeof(char*) * values.size())); + for (size_t i = 0; i < *length; ++i) + { + ret[i] = strdup(values[i].c_str()); + } + return ret; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.filesystem_h; + return auto_gen_group.kodi_vfs_file_get_property_values_v1(auto_gen_group.thisClassHdl, hdl, type, + name, length); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.h b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.h new file mode 100644 index 0000000000000..a98f95602ef83 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/filesystem.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_filesystem_h; +struct directFuncToKodi_filesystem_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_filesystem_h : public IMsgHdl +{ +public: + CHdl_kodi_filesystem_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_filesystem_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/general.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/general.cpp new file mode 100644 index 0000000000000..748b23557a81d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/general.cpp @@ -0,0 +1,478 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "general.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_general_h::InitDirect(directFuncToAddon_general_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT char* kodi_get_localized_string(long label_id) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_get_localized_string(long label_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_localized_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_localized_string_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_localized_string_v1(label_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_localized_string_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_localized_string_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_localized_string_v1(auto_gen_group.thisClassHdl, label_id); +} + +ATTR_DLL_EXPORT void kodi_get_free_mem(long* free, long* total, bool as_bytes) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_get_free_mem(long* free, long* total, bool as_bytes) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_free_mem_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_free_mem_v1; /* Autogenerated */ + + if (free == nullptr || total == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_free_mem_v1(*free, *total, as_bytes)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_free_mem_v1, in, out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_free_mem_v1 t = ident.get().as(); + + *free = std::get<0>(t); + *total = std::get<1>(t); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + auto_gen_group.kodi_get_free_mem_v1(auto_gen_group.thisClassHdl, free, total, as_bytes); +} + +ATTR_DLL_EXPORT char* kodi_unknown_to_utf8(const char* source, bool* ret, bool failOnBadChar) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_unknown_to_utf8(const char* source, bool* ret, bool failOnBadChar) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_unknown_to_utf8_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_unknown_to_utf8_v1; /* Autogenerated */ + + if (source == nullptr || ret == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_unknown_to_utf8_v1(source, *ret, failOnBadChar)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_unknown_to_utf8_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_unknown_to_utf8_v1 t = ident.get().as(); + + *ret = std::get<1>(t); + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_unknown_to_utf8_v1(auto_gen_group.thisClassHdl, source, ret, + failOnBadChar); +} + +ATTR_DLL_EXPORT char* kodi_get_language(enum LangFormats format, bool region) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_get_language(enum LangFormats format, bool region) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_language_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_language_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_language_v1(format, region)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_language_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_language_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_language_v1(auto_gen_group.thisClassHdl, format, region); +} + +ATTR_DLL_EXPORT void kodi_queue_notification(enum QueueMsg type, + const char* header, + const char* message, + const char* imageFile, + unsigned int displayTime, + bool withSound, + unsigned int messageTime) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_queue_notification(enum QueueMsg type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_queue_notification_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_queue_notification_v1; /* Autogenerated */ + + if (header == nullptr || message == nullptr || imageFile == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_queue_notification_v1( + type, header, message, imageFile, displayTime, withSound, messageTime)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_queue_notification_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + auto_gen_group.kodi_queue_notification_v1(auto_gen_group.thisClassHdl, type, header, message, + imageFile, displayTime, withSound, messageTime); +} + +ATTR_DLL_EXPORT char* kodi_get_digest(enum DigestType type, const char* text) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_get_digest(enum DigestType type, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_digest_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_digest_v1; /* Autogenerated */ + + if (text == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_digest_v1(type, text)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_digest_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_digest_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_digest_v1(auto_gen_group.thisClassHdl, type, text); +} + +ATTR_DLL_EXPORT char* kodi_get_region(const char* id) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_get_region(const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_region_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_region_v1; /* Autogenerated */ + + if (id == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_region_v1(id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_region_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_region_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_region_v1(auto_gen_group.thisClassHdl, id); +} + +ATTR_DLL_EXPORT int kodi_get_global_idle_time() +{ + // Original API call: ATTR_DLL_EXPORT int kodi_get_global_idle_time() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_global_idle_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_global_idle_time_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_general_h, funcParent_kodi_get_global_idle_time_v1, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_global_idle_time_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_global_idle_time_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT bool kodi_is_addon_avilable(const char* id, char** version, bool* enabled) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_is_addon_avilable(const char* id, char** version, bool* enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_is_addon_avilable_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_is_addon_avilable_v1; /* Autogenerated */ + + if (id == nullptr || version == nullptr || enabled == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_is_addon_avilable_v1(id, *enabled)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_is_addon_avilable_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_is_addon_avilable_v1 t = ident.get().as(); + + *version = strdup(std::get<1>(t).c_str()); + *enabled = std::get<2>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_is_addon_avilable_v1(auto_gen_group.thisClassHdl, id, version, + enabled); +} + +ATTR_DLL_EXPORT void kodi_version( + char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_version( char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_version_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_version_v1; /* Autogenerated */ + + if (compile_name == nullptr || major == nullptr || minor == nullptr || revision == nullptr || + tag == nullptr || tagversion == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_version_v1(*major, *minor)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_general_h, + funcParent_kodi_version_v1, in, out)) + return; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_version_v1 t = ident.get().as(); + + *compile_name = strdup(std::get<0>(t).c_str()); + *major = std::get<1>(t); + *minor = std::get<2>(t); + *revision = strdup(std::get<3>(t).c_str()); + *tag = strdup(std::get<4>(t).c_str()); + *tagversion = strdup(std::get<5>(t).c_str()); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + auto_gen_group.kodi_version_v1(auto_gen_group.thisClassHdl, compile_name, major, minor, revision, + tag, tagversion); +} + +ATTR_DLL_EXPORT char* kodi_get_current_skin_id() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_get_current_skin_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_current_skin_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_current_skin_id_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_general_h, funcParent_kodi_get_current_skin_id_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_current_skin_id_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_current_skin_id_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT bool kodi_get_keyboard_layout(int modifier_key, + char** layout_name, + struct AddonKeyboardKeyTable* layout) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_get_keyboard_layout(int modifier_key, char** layout_name, struct AddonKeyboardKeyTable* layout) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_get_keyboard_layout_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_get_keyboard_layout_v1; /* Autogenerated */ + + if (layout_name == nullptr || layout == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_get_keyboard_layout_v1(modifier_key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_general_h, funcParent_kodi_get_keyboard_layout_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_get_keyboard_layout_v1 t = ident.get().as(); + + *layout_name = strdup(std::get<1>(t).c_str()); + std::get<2>(t).SetCStructure(layout); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_get_keyboard_layout_v1(auto_gen_group.thisClassHdl, modifier_key, + layout_name, layout); +} + +ATTR_DLL_EXPORT bool kodi_change_keyboard_layout(char** layout_name) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_change_keyboard_layout(char** layout_name) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_change_keyboard_layout_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_change_keyboard_layout_v1; /* Autogenerated */ + + if (layout_name == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_general_h, funcParent_kodi_change_keyboard_layout_v1, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_change_keyboard_layout_v1 t = ident.get().as(); + + *layout_name = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + return auto_gen_group.kodi_change_keyboard_layout_v1(auto_gen_group.thisClassHdl, layout_name); +} + +ATTR_DLL_EXPORT void kodi_play_sfx(const char* filename, bool use_cached) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_play_sfx(const char* filename, bool use_cached) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_play_sfx_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_play_sfx_v1; /* Autogenerated */ + + if (filename == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_play_sfx_v1(filename, use_cached)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_general_h, + funcParent_kodi_play_sfx_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + auto_gen_group.kodi_play_sfx_v1(auto_gen_group.thisClassHdl, filename, use_cached); +} + +ATTR_DLL_EXPORT void kodi_stop_sfx() +{ + // Original API call: ATTR_DLL_EXPORT void kodi_stop_sfx() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_stop_sfx_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_stop_sfx_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_general_h, + funcParent_kodi_stop_sfx_v1); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.general_h; + auto_gen_group.kodi_stop_sfx_v1(auto_gen_group.thisClassHdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/general.h b/xbmc/addons/kodi-dev-kit/src/addon/api/general.h new file mode 100644 index 0000000000000..9198f70515c7f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/general.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/general.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_general_h; +struct directFuncToKodi_general_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_general_h : public IMsgHdl +{ +public: + CHdl_kodi_general_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_general_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/CMakeLists.txt new file mode 100644 index 0000000000000..d8b03d03c33a5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/CMakeLists.txt @@ -0,0 +1,18 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + general.cpp + list_item.cpp + window.cpp +) + +set(HEADERS + general.h + list_item.h + window.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api_gui) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/CMakeLists.txt new file mode 100644 index 0000000000000..1a88a865432b6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/CMakeLists.txt @@ -0,0 +1,36 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + button.cpp + edit.cpp + fade_label.cpp + image.cpp + label.cpp + progress.cpp + radio_button.cpp + rendering.cpp + settings_slider.cpp + slider.cpp + spin.cpp + text_box.cpp +) + +set(HEADERS + button.h + edit.h + fade_label.h + image.h + label.h + progress.h + radio_button.h + rendering.h + settings_slider.h + slider.h + spin.h + text_box.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api_gui_controls) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.cpp new file mode 100644 index 0000000000000..6cc1b617b4ad9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "button.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_button_h::InitDirect( + directFuncToAddon_gui_controls_button_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_button_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + auto_gen_group.kodi_gui_controls_button_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_button_set_enabled_v1(PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + auto_gen_group.kodi_gui_controls_button_set_enabled_v1(auto_gen_group.thisClassHdl, handle, + enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_button_set_label_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_set_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + auto_gen_group.kodi_gui_controls_button_set_label_v1(auto_gen_group.thisClassHdl, handle, label); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_button_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_get_label_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_button_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + return auto_gen_group.kodi_gui_controls_button_get_label_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label2(KODI_GUI_CONTROL_HANDLE handle, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label2(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_button_set_label2_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_set_label2_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + auto_gen_group.kodi_gui_controls_button_set_label2_v1(auto_gen_group.thisClassHdl, handle, label); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label2(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label2(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_button_get_label2_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_button_h, funcParent_kodi_gui_controls_button_get_label2_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_button_get_label2_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_button_h; + return auto_gen_group.kodi_gui_controls_button_get_label2_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.h new file mode 100644 index 0000000000000..8e792f2f3f9cb --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/button.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_button_h; +struct directFuncToKodi_gui_controls_button_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_button_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_button_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_button_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.cpp new file mode 100644 index 0000000000000..8a6fc5f495dd6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.cpp @@ -0,0 +1,302 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "edit.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_edit_h::InitDirect(directFuncToAddon_gui_controls_edit_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_edit_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_edit_set_enabled_v1(PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_enabled_v1(auto_gen_group.thisClassHdl, handle, + enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_set_label_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_label_v1(auto_gen_group.thisClassHdl, handle, label); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_label(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_get_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_edit_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + return auto_gen_group.kodi_gui_controls_edit_get_label_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_set_text_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_text_v1(auto_gen_group.thisClassHdl, handle, text); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_text(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_get_text_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_get_text_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_edit_get_text_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + return auto_gen_group.kodi_gui_controls_edit_get_text_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_cursor_position(KODI_GUI_CONTROL_HANDLE handle, + unsigned int position) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_cursor_position(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_set_cursor_position_v1(PtrValue(handle), + position)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_cursor_position_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_cursor_position_v1(auto_gen_group.thisClassHdl, handle, + position); +} + +ATTR_DLL_EXPORT unsigned int kodi_gui_controls_edit_get_cursor_position( + KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT unsigned int kodi_gui_controls_edit_get_cursor_position( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_edit_get_cursor_position_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_get_cursor_position_v1, + in, out)) + return 0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_edit_get_cursor_position_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + return auto_gen_group.kodi_gui_controls_edit_get_cursor_position_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_input_type(KODI_GUI_CONTROL_HANDLE handle, + int type, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_input_type(KODI_GUI_CONTROL_HANDLE handle, int type, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ + + if (handle == nullptr || heading == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_edit_set_input_type_v1(PtrValue(handle), type, + heading)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_edit_h, funcParent_kodi_gui_controls_edit_set_input_type_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_edit_h; + auto_gen_group.kodi_gui_controls_edit_set_input_type_v1(auto_gen_group.thisClassHdl, handle, type, + heading); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.h new file mode 100644 index 0000000000000..f77c643a37b2b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/edit.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_edit_h; +struct directFuncToKodi_gui_controls_edit_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_edit_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_edit_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_edit_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.cpp new file mode 100644 index 0000000000000..ff9e52cf8f811 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.cpp @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "fade_label.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_fade_label_h::InitDirect( + directFuncToAddon_gui_controls_fade_label_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_fade_label_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_fade_label_h, funcParent_kodi_gui_controls_fade_label_set_visible_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_fade_label_h; + auto_gen_group.kodi_gui_controls_fade_label_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_add_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_add_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_fade_label_add_label_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_fade_label_h, funcParent_kodi_gui_controls_fade_label_add_label_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_fade_label_h; + auto_gen_group.kodi_gui_controls_fade_label_add_label_v1(auto_gen_group.thisClassHdl, handle, + text); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_fade_label_get_label(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_fade_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_fade_label_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_fade_label_h, + funcParent_kodi_gui_controls_fade_label_get_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_fade_label_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_fade_label_h; + return auto_gen_group.kodi_gui_controls_fade_label_get_label_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_scrolling(KODI_GUI_CONTROL_HANDLE handle, + bool scroll) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_scrolling(KODI_GUI_CONTROL_HANDLE handle, bool scroll) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_fade_label_set_scrolling_v1(PtrValue(handle), scroll)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_fade_label_h, + funcParent_kodi_gui_controls_fade_label_set_scrolling_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_fade_label_h; + auto_gen_group.kodi_gui_controls_fade_label_set_scrolling_v1(auto_gen_group.thisClassHdl, handle, + scroll); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_reset(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_fade_label_reset_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_fade_label_h, funcParent_kodi_gui_controls_fade_label_reset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_fade_label_h; + auto_gen_group.kodi_gui_controls_fade_label_reset_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.h new file mode 100644 index 0000000000000..a8d0e2a81e868 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/fade_label.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_fade_label_h; +struct directFuncToKodi_gui_controls_fade_label_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_fade_label_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_fade_label_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_fade_label_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.cpp new file mode 100644 index 0000000000000..c330c1ac9a4d8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "image.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_image_h::InitDirect(directFuncToAddon_gui_controls_image_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_image_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_image_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_image_h, funcParent_kodi_gui_controls_image_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_image_h; + auto_gen_group.kodi_gui_controls_image_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_image_set_filename(KODI_GUI_CONTROL_HANDLE handle, + const char* filename, + bool use_cache) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_filename(KODI_GUI_CONTROL_HANDLE handle, const char* filename, bool use_cache) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ + + if (handle == nullptr || filename == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_image_set_filename_v1(PtrValue(handle), + filename, use_cache)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_image_h, funcParent_kodi_gui_controls_image_set_filename_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_image_h; + auto_gen_group.kodi_gui_controls_image_set_filename_v1(auto_gen_group.thisClassHdl, handle, + filename, use_cache); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_image_set_color_diffuse(KODI_GUI_CONTROL_HANDLE handle, + uint32_t color_diffuse) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_color_diffuse(KODI_GUI_CONTROL_HANDLE handle, uint32_t color_diffuse) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_image_set_color_diffuse_v1(PtrValue(handle), + color_diffuse)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_image_h, funcParent_kodi_gui_controls_image_set_color_diffuse_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_image_h; + auto_gen_group.kodi_gui_controls_image_set_color_diffuse_v1(auto_gen_group.thisClassHdl, handle, + color_diffuse); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.h new file mode 100644 index 0000000000000..4606eeb4322ad --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/image.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_image_h; +struct directFuncToKodi_gui_controls_image_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_image_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_image_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_image_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.cpp new file mode 100644 index 0000000000000..6127c2d43c282 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "label.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_label_h::InitDirect(directFuncToAddon_gui_controls_label_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_label_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_label_h, funcParent_kodi_gui_controls_label_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_label_h; + auto_gen_group.kodi_gui_controls_label_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_label_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_label_set_label_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_label_h, funcParent_kodi_gui_controls_label_set_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_label_h; + auto_gen_group.kodi_gui_controls_label_set_label_v1(auto_gen_group.thisClassHdl, handle, text); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_label_get_label(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_label_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_label_h, funcParent_kodi_gui_controls_label_get_label_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_label_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_label_h; + return auto_gen_group.kodi_gui_controls_label_get_label_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.h new file mode 100644 index 0000000000000..ecb772f40c611 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/label.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_label_h; +struct directFuncToKodi_gui_controls_label_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_label_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_label_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_label_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.cpp new file mode 100644 index 0000000000000..a1ca756c0c154 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "progress.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_progress_h::InitDirect( + directFuncToAddon_gui_controls_progress_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_progress_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_progress_h, funcParent_kodi_gui_controls_progress_set_visible_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_progress_h; + auto_gen_group.kodi_gui_controls_progress_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_percentage(KODI_GUI_CONTROL_HANDLE handle, + float percent) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_progress_set_percentage_v1(PtrValue(handle), percent)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_progress_h, funcParent_kodi_gui_controls_progress_set_percentage_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_progress_h; + auto_gen_group.kodi_gui_controls_progress_set_percentage_v1(auto_gen_group.thisClassHdl, handle, + percent); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_progress_get_percentage(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_progress_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_progress_get_percentage_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_progress_h, + funcParent_kodi_gui_controls_progress_get_percentage_v1, in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_progress_get_percentage_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_progress_h; + return auto_gen_group.kodi_gui_controls_progress_get_percentage_v1(auto_gen_group.thisClassHdl, + handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.h new file mode 100644 index 0000000000000..bd1a6584a2b51 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_progress_h; +struct directFuncToKodi_gui_controls_progress_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_progress_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_progress_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.cpp new file mode 100644 index 0000000000000..0a518245dfdfa --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "radio_button.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_radio_button_h::InitDirect( + directFuncToAddon_gui_controls_radio_button_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_radio_button_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + auto_gen_group.kodi_gui_controls_radio_button_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_radio_button_set_enabled_v1(PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + auto_gen_group.kodi_gui_controls_radio_button_set_enabled_v1(auto_gen_group.thisClassHdl, handle, + enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_label(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_radio_button_set_label_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_set_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + auto_gen_group.kodi_gui_controls_radio_button_set_label_v1(auto_gen_group.thisClassHdl, handle, + text); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_radio_button_get_label(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_radio_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_radio_button_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_get_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_radio_button_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + return auto_gen_group.kodi_gui_controls_radio_button_get_label_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_selected(KODI_GUI_CONTROL_HANDLE handle, + bool selected) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_selected(KODI_GUI_CONTROL_HANDLE handle, bool selected) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_radio_button_set_selected_v1(PtrValue(handle), + selected)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_set_selected_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + auto_gen_group.kodi_gui_controls_radio_button_set_selected_v1(auto_gen_group.thisClassHdl, handle, + selected); +} + +ATTR_DLL_EXPORT bool kodi_gui_controls_radio_button_is_selected(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_controls_radio_button_is_selected(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_radio_button_is_selected_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_radio_button_h, + funcParent_kodi_gui_controls_radio_button_is_selected_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_radio_button_is_selected_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_radio_button_h; + return auto_gen_group.kodi_gui_controls_radio_button_is_selected_v1(auto_gen_group.thisClassHdl, + handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.h new file mode 100644 index 0000000000000..b3e73d3eba24a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/radio_button.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_radio_button_h; +struct directFuncToKodi_gui_controls_radio_button_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_radio_button_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_radio_button_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_radio_button_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.cpp new file mode 100644 index 0000000000000..556e22c4baee1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "rendering.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_rendering_h::InitDirect( + directFuncToAddon_gui_controls_rendering_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_destroy(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_destroy(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_radio_rendering_destroy_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_rendering_h, funcParent_kodi_gui_controls_radio_rendering_destroy_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_rendering_h; + auto_gen_group.kodi_gui_controls_radio_rendering_destroy_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.h new file mode 100644 index 0000000000000..1a1f8a91f0368 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/rendering.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_rendering_h; +struct directFuncToKodi_gui_controls_rendering_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_rendering_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_rendering_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_rendering_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.cpp new file mode 100644 index 0000000000000..2293b3dd96b39 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.cpp @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "settings_slider.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_settings_slider_h::InitDirect( + directFuncToAddon_gui_controls_settings_slider_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_visible_v1( + PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_visible_v1(auto_gen_group.thisClassHdl, + handle, visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_enabled_v1( + PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_enabled_v1(auto_gen_group.thisClassHdl, + handle, enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_settings_slider_set_text_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_text_v1(auto_gen_group.thisClassHdl, handle, + label); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_reset(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_reset_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_reset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_reset_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, + int start, + int end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_range( KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_int_range_v1( + PtrValue(handle), start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_int_range_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_int_range_v1(auto_gen_group.thisClassHdl, + handle, start, end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, + int value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_value( KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_int_value_v1( + PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_int_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_int_value_v1(auto_gen_group.thisClassHdl, + handle, value); +} + +ATTR_DLL_EXPORT int kodi_gui_controls_settings_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_settings_slider_get_int_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_settings_slider_get_int_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_get_int_value_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_settings_slider_get_int_value_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + return auto_gen_group.kodi_gui_controls_settings_slider_get_int_value_v1( + auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_interval( + KODI_GUI_CONTROL_HANDLE handle, int interval) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_interval( KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_int_interval_v1( + PtrValue(handle), interval)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_int_interval_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_int_interval_v1(auto_gen_group.thisClassHdl, + handle, interval); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_percentage( + KODI_GUI_CONTROL_HANDLE handle, float percent) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_percentage( KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_percentage_v1( + PtrValue(handle), percent)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_percentage_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_percentage_v1(auto_gen_group.thisClassHdl, + handle, percent); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_percentage( + KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_percentage( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_settings_slider_get_percentage_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_get_percentage_v1, in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_settings_slider_get_percentage_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + return auto_gen_group.kodi_gui_controls_settings_slider_get_percentage_v1( + auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_range( + KODI_GUI_CONTROL_HANDLE handle, float start, float end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_range( KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_float_range_v1( + PtrValue(handle), start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_float_range_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_float_range_v1(auto_gen_group.thisClassHdl, + handle, start, end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_value( + KODI_GUI_CONTROL_HANDLE handle, float value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_value( KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_float_value_v1( + PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_float_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_float_value_v1(auto_gen_group.thisClassHdl, + handle, value); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_float_value( + KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_float_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_settings_slider_get_float_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_get_float_value_v1, in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_settings_slider_get_float_value_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + return auto_gen_group.kodi_gui_controls_settings_slider_get_float_value_v1( + auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_interval( + KODI_GUI_CONTROL_HANDLE handle, float interval) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_interval( KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_settings_slider_set_float_interval_v1( + PtrValue(handle), interval)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_settings_slider_h, + funcParent_kodi_gui_controls_settings_slider_set_float_interval_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_settings_slider_h; + auto_gen_group.kodi_gui_controls_settings_slider_set_float_interval_v1( + auto_gen_group.thisClassHdl, handle, interval); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.h new file mode 100644 index 0000000000000..5c741f0c0b82c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/settings_slider.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_settings_slider_h; +struct directFuncToKodi_gui_controls_settings_slider_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_settings_slider_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_settings_slider_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_settings_slider_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.cpp new file mode 100644 index 0000000000000..08ad372be8cb9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.cpp @@ -0,0 +1,449 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "slider.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_slider_h::InitDirect( + directFuncToAddon_gui_controls_slider_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_slider_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_slider_set_enabled_v1(PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_enabled_v1(auto_gen_group.thisClassHdl, handle, + enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_reset(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_reset_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_reset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_reset_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_slider_get_description(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_slider_get_description(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_get_description_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_get_description_v1, + in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_slider_get_description_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + return auto_gen_group.kodi_gui_controls_slider_get_description_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, + int start, + int end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_slider_set_int_range_v1(PtrValue(handle), start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_int_range_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_int_range_v1(auto_gen_group.thisClassHdl, handle, + start, end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, + int value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_slider_set_int_value_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_int_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_int_value_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT int kodi_gui_controls_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_get_int_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_get_int_value_v1, + in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_slider_get_int_value_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + return auto_gen_group.kodi_gui_controls_slider_get_int_value_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_interval(KODI_GUI_CONTROL_HANDLE handle, + int interval) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_interval(KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_slider_set_int_interval_v1(PtrValue(handle), interval)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_int_interval_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_int_interval_v1(auto_gen_group.thisClassHdl, handle, + interval); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_percentage(KODI_GUI_CONTROL_HANDLE handle, + float percent) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_slider_set_percentage_v1(PtrValue(handle), percent)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_percentage_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_percentage_v1(auto_gen_group.thisClassHdl, handle, + percent); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_percentage(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_get_percentage_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_get_percentage_v1, + in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_slider_get_percentage_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + return auto_gen_group.kodi_gui_controls_slider_get_percentage_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_range(KODI_GUI_CONTROL_HANDLE handle, + float start, + float end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_set_float_range_v1(PtrValue(handle), + start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_float_range_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_float_range_v1(auto_gen_group.thisClassHdl, handle, + start, end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_value(KODI_GUI_CONTROL_HANDLE handle, + float value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_slider_set_float_value_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_float_value_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_float_value_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_float_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_get_float_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_get_float_value_v1, + in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_slider_get_float_value_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + return auto_gen_group.kodi_gui_controls_slider_get_float_value_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, + float interval) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_slider_set_float_interval_v1(PtrValue(handle), + interval)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_slider_h, funcParent_kodi_gui_controls_slider_set_float_interval_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_slider_h; + auto_gen_group.kodi_gui_controls_slider_set_float_interval_v1(auto_gen_group.thisClassHdl, handle, + interval); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.h new file mode 100644 index 0000000000000..614f32f5c0b9a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/slider.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_slider_h; +struct directFuncToKodi_gui_controls_slider_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_slider_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_slider_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_slider_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.cpp new file mode 100644 index 0000000000000..5c60ee03d1708 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.cpp @@ -0,0 +1,490 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "spin.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_spin_h::InitDirect(directFuncToAddon_gui_controls_spin_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_spin_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_enabled(KODI_GUI_CONTROL_HANDLE handle, + bool enabled) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_spin_set_enabled_v1(PtrValue(handle), enabled)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_enabled_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_enabled_v1(auto_gen_group.thisClassHdl, handle, + enabled); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_set_text_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_text_v1(auto_gen_group.thisClassHdl, handle, text); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_reset(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_reset_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_reset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_reset_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_type(KODI_GUI_CONTROL_HANDLE handle, int type) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_type(KODI_GUI_CONTROL_HANDLE handle, int type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_set_type_v1(PtrValue(handle), type)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_type_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_type_v1(auto_gen_group.thisClassHdl, handle, type); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_string_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_string_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_add_string_label_v1(PtrValue(handle), + label, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_add_string_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_add_string_label_v1(auto_gen_group.thisClassHdl, handle, + label, value); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_string_value(KODI_GUI_CONTROL_HANDLE handle, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_string_value(KODI_GUI_CONTROL_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ + + if (handle == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_spin_set_string_value_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_string_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_string_value_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_spin_get_string_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_spin_get_string_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_get_string_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_get_string_value_v1, + in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_spin_get_string_value_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + return auto_gen_group.kodi_gui_controls_spin_get_string_value_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_int_label(KODI_GUI_CONTROL_HANDLE handle, + const char* label, + int value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_int_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_spin_add_int_label_v1(PtrValue(handle), label, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_add_int_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_add_int_label_v1(auto_gen_group.thisClassHdl, handle, label, + value); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_range(KODI_GUI_CONTROL_HANDLE handle, + int start, + int end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_spin_set_int_range_v1(PtrValue(handle), start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_int_range_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_int_range_v1(auto_gen_group.thisClassHdl, handle, start, + end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_spin_set_int_value_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_int_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_int_value_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT int kodi_gui_controls_spin_get_int_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_spin_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_get_int_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_get_int_value_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_spin_get_int_value_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + return auto_gen_group.kodi_gui_controls_spin_get_int_value_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_range(KODI_GUI_CONTROL_HANDLE handle, + float start, + float end) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_spin_set_float_range_v1(PtrValue(handle), start, end)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_float_range_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_float_range_v1(auto_gen_group.thisClassHdl, handle, + start, end); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_value(KODI_GUI_CONTROL_HANDLE handle, + float value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_spin_set_float_value_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_float_value_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_float_value_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT float kodi_gui_controls_spin_get_float_value(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_spin_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_spin_get_float_value_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_get_float_value_v1, in, + out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_spin_get_float_value_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + return auto_gen_group.kodi_gui_controls_spin_get_float_value_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, + float interval) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_spin_set_float_interval_v1(PtrValue(handle), interval)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_spin_h, funcParent_kodi_gui_controls_spin_set_float_interval_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_spin_h; + auto_gen_group.kodi_gui_controls_spin_set_float_interval_v1(auto_gen_group.thisClassHdl, handle, + interval); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.h new file mode 100644 index 0000000000000..a0d85b3077557 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/spin.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_spin_h; +struct directFuncToKodi_gui_controls_spin_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_spin_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_spin_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_spin_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.cpp new file mode 100644 index 0000000000000..f803c64933a4f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "text_box.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_controls_text_box_h::InitDirect( + directFuncToAddon_gui_controls_text_box_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_visible(KODI_GUI_CONTROL_HANDLE handle, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_controls_text_box_set_visible_v1(PtrValue(handle), visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, funcParent_kodi_gui_controls_text_box_set_visible_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + auto_gen_group.kodi_gui_controls_text_box_set_visible_v1(auto_gen_group.thisClassHdl, handle, + visible); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_text_box_reset(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_text_box_reset_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, funcParent_kodi_gui_controls_text_box_reset_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + auto_gen_group.kodi_gui_controls_text_box_reset_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_text(KODI_GUI_CONTROL_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_text_box_set_text_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, funcParent_kodi_gui_controls_text_box_set_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + auto_gen_group.kodi_gui_controls_text_box_set_text_v1(auto_gen_group.thisClassHdl, handle, text); +} + +ATTR_DLL_EXPORT char* kodi_gui_controls_text_box_get_text(KODI_GUI_CONTROL_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_text_box_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_text_box_get_text_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, funcParent_kodi_gui_controls_text_box_get_text_v1, + in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_controls_text_box_get_text_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + return auto_gen_group.kodi_gui_controls_text_box_get_text_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_text_box_scroll(KODI_GUI_CONTROL_HANDLE handle, + unsigned int position) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_scroll(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_controls_text_box_scroll_v1(PtrValue(handle), position)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, funcParent_kodi_gui_controls_text_box_scroll_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + auto_gen_group.kodi_gui_controls_text_box_scroll_v1(auto_gen_group.thisClassHdl, handle, + position); +} + +ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_auto_scrolling(KODI_GUI_CONTROL_HANDLE handle, + int delay, + int time, + int repeat) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_auto_scrolling( KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_controls_text_box_set_auto_scrolling_v1( + PtrValue(handle), delay, time, repeat)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_controls_text_box_h, + funcParent_kodi_gui_controls_text_box_set_auto_scrolling_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_controls_text_box_h; + auto_gen_group.kodi_gui_controls_text_box_set_auto_scrolling_v1(auto_gen_group.thisClassHdl, + handle, delay, time, repeat); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.h new file mode 100644 index 0000000000000..a87f79a174e13 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/controls/text_box.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_controls_text_box_h; +struct directFuncToKodi_gui_controls_text_box_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_controls_text_box_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_controls_text_box_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_controls_text_box_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/CMakeLists.txt new file mode 100644 index 0000000000000..72a59708dbd6c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/CMakeLists.txt @@ -0,0 +1,32 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + context_menu.cpp + extended_progress.cpp + filebrowser.cpp + keyboard.cpp + numeric.cpp + ok.cpp + progress.cpp + select.cpp + text_viewer.cpp + yes_no.cpp +) + +set(HEADERS + context_menu.h + extended_progress.h + filebrowser.h + keyboard.h + numeric.h + ok.h + progress.h + select.h + text_viewer.h + yes_no.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_api_gui_dialogs) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.cpp new file mode 100644 index 0000000000000..37490994612f4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "context_menu.h" + +#include +#include + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_context_menu_h::InitDirect( + directFuncToAddon_gui_dialogs_context_menu_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT int kodi_gui_dialogs_context_menu_open(const char* heading, + const char* entries[], + size_t size) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_context_menu_open(const char* heading, const char* entries[], size_t size) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t> msgParent__IN_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ + + if (heading == nullptr || entries == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + std::vector cpp_entries; + cpp_entries.reserve(size); + for (size_t i = 0; i < size; ++i) + { + cpp_entries.emplace_back(entries[i] != nullptr ? entries[i] : ""); + } + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_context_menu_open_v1(heading, cpp_entries, size)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_context_menu_h, funcParent_kodi_gui_dialogs_context_menu_open_v1, + in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_context_menu_open_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_context_menu_h; + return auto_gen_group.kodi_gui_dialogs_context_menu_open_v1(auto_gen_group.thisClassHdl, heading, + entries, size); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.h new file mode 100644 index 0000000000000..1cfabf1ed895e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/context_menu.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_context_menu_h; +struct directFuncToKodi_gui_dialogs_context_menu_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_context_menu_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_context_menu_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_context_menu_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.cpp new file mode 100644 index 0000000000000..efe01e0b3552e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.cpp @@ -0,0 +1,381 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "extended_progress.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_extended_progress_h::InitDirect( + directFuncToAddon_gui_dialogs_extended_progress_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog(const char* title) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog(const char* title) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ + + if (title == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_extended_progress_new_dialog_v1(title)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_new_dialog_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_extended_progress_new_dialog_v1 t = + ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + return auto_gen_group.kodi_gui_dialogs_extended_progress_new_dialog_v1( + auto_gen_group.thisClassHdl, title); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_delete_dialog(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_delete_dialog_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_delete_dialog_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_delete_dialog_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_title(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_title(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_extended_progress_get_title_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_get_title_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_extended_progress_get_title_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + return auto_gen_group.kodi_gui_dialogs_extended_progress_get_title_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_title(KODI_GUI_HANDLE handle, + const char* title) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_title(KODI_GUI_HANDLE handle, const char* title) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ + + if (handle == nullptr || title == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_set_title_v1(PtrValue(handle), title)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_set_title_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_set_title_v1(auto_gen_group.thisClassHdl, + handle, title); +} + +ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_text(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_text(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_extended_progress_get_text_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_get_text_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_extended_progress_get_text_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + return auto_gen_group.kodi_gui_dialogs_extended_progress_get_text_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_text(KODI_GUI_HANDLE handle, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_text(KODI_GUI_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ + + if (handle == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_set_text_v1(PtrValue(handle), text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_set_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_set_text_v1(auto_gen_group.thisClassHdl, handle, + text); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_extended_progress_is_finished(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_extended_progress_is_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_is_finished_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_is_finished_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_extended_progress_is_finished_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + return auto_gen_group.kodi_gui_dialogs_extended_progress_is_finished_v1( + auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_mark_finished(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_mark_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_mark_finished_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_mark_finished_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_mark_finished_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT float kodi_gui_dialogs_extended_progress_get_percentage(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_dialogs_extended_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return 0.0f; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_extended_progress_get_percentage_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_get_percentage_v1, in, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_extended_progress_get_percentage_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + return auto_gen_group.kodi_gui_dialogs_extended_progress_get_percentage_v1( + auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_percentage(KODI_GUI_HANDLE handle, + float percentage) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_percentage(KODI_GUI_HANDLE handle, float percentage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_extended_progress_set_percentage_v1( + PtrValue(handle), percentage)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_set_percentage_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_set_percentage_v1(auto_gen_group.thisClassHdl, + handle, percentage); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_progress(KODI_GUI_HANDLE handle, + int currentItem, + int itemCount) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_progress(KODI_GUI_HANDLE handle, int currentItem, int itemCount) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_extended_progress_set_progress_v1( + PtrValue(handle), currentItem, itemCount)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_extended_progress_h, + funcParent_kodi_gui_dialogs_extended_progress_set_progress_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_extended_progress_h; + auto_gen_group.kodi_gui_dialogs_extended_progress_set_progress_v1(auto_gen_group.thisClassHdl, + handle, currentItem, itemCount); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.h new file mode 100644 index 0000000000000..7ef6fcbb9be87 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/extended_progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_extended_progress_h; +struct directFuncToKodi_gui_dialogs_extended_progress_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_extended_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_extended_progress_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect( + KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_extended_progress_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.cpp new file mode 100644 index 0000000000000..65bc31445c2dc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.cpp @@ -0,0 +1,372 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "filebrowser.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_filebrowser_h::InitDirect( + directFuncToAddon_gui_dialogs_filebrowser_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_directory( + const char* shares, const char* heading, const char* path_in, char** path_out, bool write_only) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_directory( const char* shares, const char* heading, const char* path_in, char** path_out, bool write_only) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ + + if (shares == nullptr || heading == nullptr || path_in == nullptr || path_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + shares, heading, path_in, write_only)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_directory_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_directory_v1 t = + ident.get().as(); + + *path_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_directory_v1( + auto_gen_group.thisClassHdl, shares, heading, path_in, path_out, write_only); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file(const char* shares, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file(const char* shares, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ + + if (shares == nullptr || mask == nullptr || heading == nullptr || path_in == nullptr || + path_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_v1( + shares, mask, heading, path_in, use_thumbs, use_file_directories)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_v1 t = + ident.get().as(); + + *path_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_file_v1( + auto_gen_group.thisClassHdl, shares, mask, heading, path_in, path_out, use_thumbs, + use_file_directories); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( + const char* directory, + const char* mask, + const char* heading, + const char* path_in, + char** path_out, + bool use_thumbs, + bool use_file_directories, + bool single_list) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( const char* directory, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories, bool single_list) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ + + if (directory == nullptr || mask == nullptr || heading == nullptr || path_in == nullptr || + path_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1( + directory, mask, heading, path_in, use_thumbs, use_file_directories, single_list)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1 t = + ident.get().as(); + + *path_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1( + auto_gen_group.thisClassHdl, directory, mask, heading, path_in, path_out, use_thumbs, + use_file_directories, single_list); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_list(const char* shares, + const char* mask, + const char* heading, + char*** file_list, + size_t* entries, + bool use_thumbs, + bool use_file_directories) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_list( const char* shares, const char* mask, const char* heading, char*** file_list, size_t* entries, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ + + if (shares == nullptr || mask == nullptr || heading == nullptr || file_list == nullptr || + entries == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + shares, mask, heading, *entries, use_thumbs, use_file_directories)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1 t = + ident.get().as(); + + const std::vector& cpp_file_list = std::get<1>(t); + *entries = std::get<2>(t); + assert(cpp_file_list.size() == *entries); + if (!cpp_file_list.empty()) + { + *file_list = static_cast(malloc(*entries * sizeof(char*))); + for (size_t i = 0; i < *entries; ++i) + (*file_list)[i] = strdup(cpp_file_list[i].c_str()); + } + else + { + *file_list = nullptr; + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_file_list_v1( + auto_gen_group.thisClassHdl, shares, mask, heading, file_list, entries, use_thumbs, + use_file_directories); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_source(const char* path_in, + char** path_out, + bool allow_network_shares, + const char* additional_share, + const char* type) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_source( const char* path_in, char** path_out, bool allow_network_shares, const char* additional_share, const char* type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ + + if (path_in == nullptr || path_out == nullptr || additional_share == nullptr || type == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_source_v1( + path_in, allow_network_shares, additional_share, type)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_source_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_source_v1 t = + ident.get().as(); + + *path_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_source_v1( + auto_gen_group.thisClassHdl, path_in, path_out, allow_network_shares, additional_share, type); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image(const char* shares, + const char* heading, + const char* path_in, + char** path_out) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image(const char* shares, const char* heading, const char* path_in, char** path_out) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ + + if (shares == nullptr || heading == nullptr || path_in == nullptr || path_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_v1( + shares, heading, path_in)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_v1 t = + ident.get().as(); + + *path_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_image_v1( + auto_gen_group.thisClassHdl, shares, heading, path_in, path_out); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image_list(const char* shares, + const char* heading, + char*** file_list, + size_t* entries) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image_list(const char* shares, const char* heading, char*** file_list, size_t* entries) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ + + if (shares == nullptr || heading == nullptr || file_list == nullptr || entries == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + shares, heading, *entries)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_filebrowser_h, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1 t = + ident.get().as(); + + const std::vector& cpp_file_list = std::get<1>(t); + *entries = std::get<2>(t); + assert(cpp_file_list.size() == *entries); + if (!cpp_file_list.empty()) + { + *file_list = static_cast(malloc(*entries * sizeof(char*))); + for (size_t i = 0; i < *entries; ++i) + (*file_list)[i] = strdup(cpp_file_list[i].c_str()); + } + else + { + *file_list = nullptr; + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_filebrowser_h; + return auto_gen_group.kodi_gui_dialogs_file_browser_show_and_get_image_list_v1( + auto_gen_group.thisClassHdl, shares, heading, file_list, entries); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_file_browser_clear_file_list(char*** file_list, + size_t entries) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_file_browser_clear_file_list(char*** file_list, size_t entries) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_gui_dialogs_file_browser_clear_file_list - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_gui_dialogs_file_browser_clear_file_list - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + if (*file_list) + { + for (size_t i = 0; i < entries; ++i) + free((*file_list)[i]); + free(*file_list); + *file_list = nullptr; + } + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.h new file mode 100644 index 0000000000000..cfb366ec99a33 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/filebrowser.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_filebrowser_h; +struct directFuncToKodi_gui_dialogs_filebrowser_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_filebrowser_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_filebrowser_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_filebrowser_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.cpp new file mode 100644 index 0000000000000..8e76c01de7b96 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.cpp @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "keyboard.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_keyboard_h::InitDirect( + directFuncToAddon_gui_dialogs_keyboard_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head( + const char* text_in, + char** text_out, + const char* heading, + bool allow_empty_result, + bool hidden_input, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head( const char* text_in, char** text_out, const char* heading, bool allow_empty_result, bool hidden_input, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ + + if (text_in == nullptr || text_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + text_in, heading, allow_empty_result, hidden_input, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1 t = + ident.get().as(); + + *text_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1( + auto_gen_group.thisClassHdl, text_in, text_out, heading, allow_empty_result, hidden_input, + auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input(const char* text_in, + char** text_out, + bool allow_empty_result, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input(const char* text_in, char** text_out, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ + + if (text_in == nullptr || text_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_v1( + text_in, allow_empty_result, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_v1 t = ident.get().as(); + + *text_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_get_input_v1( + auto_gen_group.thisClassHdl, text_in, text_out, allow_empty_result, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( + const char* password_in, + char** password_out, + const char* heading, + bool allow_empty_result, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( const char* password_in, char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ + + if (password_in == nullptr || password_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1( + password_in, heading, allow_empty_result, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1 t = + ident.get().as(); + + *password_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1( + auto_gen_group.thisClassHdl, password_in, password_out, heading, allow_empty_result, + auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password(const char* password_in, + char** password_out, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password( const char* password_in, char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ + + if (password_in == nullptr || password_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + password_in, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1 t = + ident.get().as(); + + *password_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_get_new_password_v1( + auto_gen_group.thisClassHdl, password_in, password_out, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( + char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ + + if (password_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1( + heading, allow_empty_result, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1 t = + ident.get().as(); + + *password_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1( + auto_gen_group.thisClassHdl, password_out, heading, allow_empty_result, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password( + char** password_out, unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password( char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ + + if (password_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1(auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1 t = + ident.get().as(); + + *password_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1( + auto_gen_group.thisClassHdl, password_out, auto_close_ms); +} + +ATTR_DLL_EXPORT int kodi_gui_dialogs_keyboard_show_and_verify_password(const char* password_in, + char** password_out, + const char* heading, + int retries, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_keyboard_show_and_verify_password(const char* password_in, char** password_out, const char* heading, int retries, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ + + if (password_in == nullptr || password_out == nullptr || heading == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + password_in, heading, retries, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_password_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_password_v1 t = + ident.get().as(); + + *password_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_verify_password_v1( + auto_gen_group.thisClassHdl, password_in, password_out, heading, retries, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_filter(const char* text_in, + char** text_out, + bool searching, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_filter(const char* text_in, char** text_out, bool searching, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ + + if (text_in == nullptr || text_out == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + text_in, searching, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_filter_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_filter_v1 t = + ident.get().as(); + + *text_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_show_and_get_filter_v1( + auto_gen_group.thisClassHdl, text_in, text_out, searching, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(const char* text, + bool close_keyboard) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(const char* text, bool close_keyboard) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ + + if (text == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + text, close_keyboard)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1( + auto_gen_group.thisClassHdl, text, close_keyboard); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_is_keyboard_activated() +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_is_keyboard_activated() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_dialogs_keyboard_h, + funcParent_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_keyboard_h; + return auto_gen_group.kodi_gui_dialogs_keyboard_is_keyboard_activated_v1( + auto_gen_group.thisClassHdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.h new file mode 100644 index 0000000000000..31487db45ca6d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/keyboard.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_keyboard_h; +struct directFuncToKodi_gui_dialogs_keyboard_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_keyboard_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_keyboard_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_keyboard_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.cpp new file mode 100644 index 0000000000000..365d9a47c27f1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.cpp @@ -0,0 +1,329 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "numeric.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_numeric_h::InitDirect( + directFuncToAddon_gui_dialogs_numeric_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_new_password(char** password) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_new_password(char** password) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ + + if (password == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1 t = + ident.get().as(); + + *password = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_verify_new_password_v1( + auto_gen_group.thisClassHdl, password); +} + +ATTR_DLL_EXPORT int kodi_gui_dialogs_numeric_show_and_verify_password(const char* password, + const char* heading, + int retries) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_numeric_show_and_verify_password(const char* password, const char* heading, int retries) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ + + if (password == nullptr || heading == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_password_v1( + password, heading, retries)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_verify_password_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_password_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_verify_password_v1( + auto_gen_group.thisClassHdl, password, heading, retries); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_input(const char* verify_in, + char** verify_out, + const char* heading, + bool verify_input) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_input(const char* verify_in, char** verify_out, const char* heading, bool verify_input) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ + + if (verify_in == nullptr || verify_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_input_v1( + verify_in, heading, verify_input)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_verify_input_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_input_v1 t = + ident.get().as(); + + *verify_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_verify_input_v1( + auto_gen_group.thisClassHdl, verify_in, verify_out, heading, verify_input); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_time(struct tm* time, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_time(struct tm* time, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ + + if (time == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1(time, heading)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_get_time_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_time_v1 t = ident.get().as(); + + std::get<1>(t).SetCStructure(time); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_get_time_v1(auto_gen_group.thisClassHdl, + time, heading); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_date(struct tm* date, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_date(struct tm* date, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ + + if (date == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1(date, heading)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_get_date_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_date_v1 t = ident.get().as(); + + std::get<1>(t).SetCStructure(date); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_get_date_v1(auto_gen_group.thisClassHdl, + date, heading); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_ip_address(const char* ip_address_in, + char** ip_address_out, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_ip_address(const char* ip_address_in, char** ip_address_out, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ + + if (ip_address_in == nullptr || ip_address_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + ip_address_in, heading)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1 t = + ident.get().as(); + + *ip_address_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_get_ip_address_v1( + auto_gen_group.thisClassHdl, ip_address_in, ip_address_out, heading); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_number(const char* number_in, + char** number_out, + const char* heading, + unsigned int auto_close_ms) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_number(const char* number_in, char** number_out, const char* heading, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ + + if (number_in == nullptr || number_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_number_v1( + number_in, heading, auto_close_ms)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_get_number_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_number_v1 t = ident.get().as(); + + *number_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_get_number_v1( + auto_gen_group.thisClassHdl, number_in, number_out, heading, auto_close_ms); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_seconds(const char* time_in, + char** time_out, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_seconds(const char* time_in, char** time_out, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ + + if (time_in == nullptr || time_out == nullptr || heading == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_seconds_v1(time_in, heading)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_numeric_h, + funcParent_kodi_gui_dialogs_numeric_show_and_get_seconds_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_seconds_v1 t = + ident.get().as(); + + *time_out = strdup(std::get<1>(t).c_str()); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_numeric_h; + return auto_gen_group.kodi_gui_dialogs_numeric_show_and_get_seconds_v1( + auto_gen_group.thisClassHdl, time_in, time_out, heading); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.h new file mode 100644 index 0000000000000..12d0269bde0e4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/numeric.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_numeric_h; +struct directFuncToKodi_gui_dialogs_numeric_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_numeric_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_numeric_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_numeric_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.cpp new file mode 100644 index 0000000000000..6423f9c34ffcf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "ok.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_ok_h::InitDirect(directFuncToAddon_gui_dialogs_ok_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_single_text(const char* heading, + const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_single_text(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ + + if (heading == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1(heading, text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_ok_h, + funcParent_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_ok_h; + auto_gen_group.kodi_gui_dialogs_ok_show_and_get_input_single_text_v1(auto_gen_group.thisClassHdl, + heading, text); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_line_text(const char* heading, + const char* line0, + const char* line1, + const char* line2) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ + + if (heading == nullptr || line0 == nullptr || line1 == nullptr || line2 == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1( + heading, line0, line1, line2)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_ok_h, funcParent_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_ok_h; + auto_gen_group.kodi_gui_dialogs_ok_show_and_get_input_line_text_v1(auto_gen_group.thisClassHdl, + heading, line0, line1, line2); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.h new file mode 100644 index 0000000000000..da0bb65f742bf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/ok.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_ok_h; +struct directFuncToKodi_gui_dialogs_ok_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_ok_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_ok_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_ok_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.cpp new file mode 100644 index 0000000000000..91dbdefeed838 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.cpp @@ -0,0 +1,412 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "progress.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_progress_h::InitDirect( + directFuncToAddon_gui_dialogs_progress_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog() +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_new_dialog_v1, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_progress_new_dialog_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + return auto_gen_group.kodi_gui_dialogs_progress_new_dialog_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_delete_dialog(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_delete_dialog_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_delete_dialog_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_delete_dialog_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_open(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_open(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_open_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_open_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_open_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_heading(KODI_GUI_HANDLE handle, + const char* heading) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_heading(KODI_GUI_HANDLE handle, const char* heading) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ + + if (handle == nullptr || heading == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_progress_set_heading_v1(PtrValue(handle), heading)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_set_heading_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_heading_v1(auto_gen_group.thisClassHdl, handle, + heading); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_line(KODI_GUI_HANDLE handle, + unsigned int line_no, + const char* line) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_line(KODI_GUI_HANDLE handle, unsigned int line_no, const char* line) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ + + if (handle == nullptr || line == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_progress_set_line_v1(PtrValue(handle), line_no, line)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_set_line_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_line_v1(auto_gen_group.thisClassHdl, handle, line_no, + line); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_can_cancel(KODI_GUI_HANDLE handle, + bool can_cancel) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_can_cancel(KODI_GUI_HANDLE handle, bool can_cancel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_set_can_cancel_v1(PtrValue(handle), + can_cancel)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_set_can_cancel_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_can_cancel_v1(auto_gen_group.thisClassHdl, handle, + can_cancel); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_is_canceled(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_is_canceled(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_is_canceled_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_is_canceled_v1, + in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_progress_is_canceled_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + return auto_gen_group.kodi_gui_dialogs_progress_is_canceled_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_percentage(KODI_GUI_HANDLE handle, + int percentage) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_percentage(KODI_GUI_HANDLE handle, int percentage) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_set_percentage_v1(PtrValue(handle), + percentage)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_set_percentage_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_percentage_v1(auto_gen_group.thisClassHdl, handle, + percentage); +} + +ATTR_DLL_EXPORT int kodi_gui_dialogs_progress_get_percentage(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_get_percentage_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, + funcParent_kodi_gui_dialogs_progress_get_percentage_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_progress_get_percentage_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + return auto_gen_group.kodi_gui_dialogs_progress_get_percentage_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_show_progress_bar(KODI_GUI_HANDLE handle, + bool on_off) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_show_progress_bar(KODI_GUI_HANDLE handle, bool on_off) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_progress_show_progress_bar_v1(PtrValue(handle), on_off)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_show_progress_bar_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_show_progress_bar_v1(auto_gen_group.thisClassHdl, handle, + on_off); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_max(KODI_GUI_HANDLE handle, int max) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_max(KODI_GUI_HANDLE handle, int max) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_dialogs_progress_set_progress_max_v1(PtrValue(handle), max)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_set_progress_max_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_progress_max_v1(auto_gen_group.thisClassHdl, handle, + max); +} + +ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_advance(KODI_GUI_HANDLE handle, + int n_steps) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_advance(KODI_GUI_HANDLE handle, int n_steps) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_set_progress_advance_v1( + PtrValue(handle), n_steps)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, + funcParent_kodi_gui_dialogs_progress_set_progress_advance_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + auto_gen_group.kodi_gui_dialogs_progress_set_progress_advance_v1(auto_gen_group.thisClassHdl, + handle, n_steps); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_abort(KODI_GUI_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_abort(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_progress_abort_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_progress_h, funcParent_kodi_gui_dialogs_progress_abort_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_progress_abort_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_progress_h; + return auto_gen_group.kodi_gui_dialogs_progress_abort_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.h new file mode 100644 index 0000000000000..a1657a37754da --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/progress.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_progress_h; +struct directFuncToKodi_gui_dialogs_progress_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_progress_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_progress_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_progress_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.cpp new file mode 100644 index 0000000000000..19d4eb11b7b0a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "select.h" + +#include +#include + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_select_h::InitDirect(directFuncToAddon_gui_dialogs_select_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT int kodi_gui_dialogs_select_open( + const char* heading, const char* entries[], size_t size, int selected, unsigned int autoclose) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_select_open(const char* heading, const char* entries[], size_t size, int selected, unsigned int autoclose) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, size_t, int, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ + + if (heading == nullptr || entries == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + std::vector cpp_entries; + cpp_entries.reserve(size); + for (size_t i = 0; i < size; ++i) + { + cpp_entries.emplace_back(entries[i] != nullptr ? entries[i] : ""); + } + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_select_open_v1(heading, cpp_entries, size, + selected, autoclose)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_select_h, funcParent_kodi_gui_dialogs_select_open_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_select_open_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_select_h; + return auto_gen_group.kodi_gui_dialogs_select_open_v1(auto_gen_group.thisClassHdl, heading, + entries, size, selected, autoclose); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_select_open_multi_select(const char* heading, + const char* entryIDs[], + const char* entryNames[], + uint8_t entriesSelected[], + size_t size, + unsigned int autoclose) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_select_open_multi_select(const char* heading, const char* entryIDs[], const char* entryNames[], uint8_t entriesSelected[], size_t size, unsigned int autoclose) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple, std::vector, std::vector, size_t, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple> msgParent_OUT_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ + + if (heading == nullptr || entryIDs == nullptr || entryNames == nullptr || + entriesSelected == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + std::vector cpp_entryIDs; + cpp_entryIDs.reserve(size); + for (size_t i = 0; i < size; ++i) + { + cpp_entryIDs.emplace_back(entryIDs[i] != nullptr ? entryIDs[i] : ""); + } + std::vector cpp_entryNames; + cpp_entryNames.reserve(size); + for (size_t i = 0; i < size; ++i) + { + cpp_entryNames.emplace_back(entryNames[i] != nullptr ? entryNames[i] : ""); + } + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_select_open_multi_select_v1( + heading, cpp_entryIDs, cpp_entryNames, + std::vector(entriesSelected, entriesSelected + size), size, + autoclose)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_select_h, funcParent_kodi_gui_dialogs_select_open_multi_select_v1, + in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_select_open_multi_select_v1 t = ident.get().as(); + + std::memcpy(entriesSelected, std::get<1>(t).data(), sizeof(uint8_t) * size); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_select_h; + return auto_gen_group.kodi_gui_dialogs_select_open_multi_select_v1( + auto_gen_group.thisClassHdl, heading, entryIDs, entryNames, entriesSelected, size, autoclose); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.h new file mode 100644 index 0000000000000..539d5fa596513 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/select.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_select_h; +struct directFuncToKodi_gui_dialogs_select_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_select_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_select_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_select_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.cpp new file mode 100644 index 0000000000000..798cb645b1b00 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "text_viewer.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_text_viewer_h::InitDirect( + directFuncToAddon_gui_dialogs_text_viewer_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_dialogs_text_viewer_show(const char* heading, const char* text) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_text_viewer_show(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ + + if (heading == nullptr || text == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_text_viewer_show_v1(heading, text)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_text_viewer_h, funcParent_kodi_gui_dialogs_text_viewer_show_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_text_viewer_h; + auto_gen_group.kodi_gui_dialogs_text_viewer_show_v1(auto_gen_group.thisClassHdl, heading, text); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.h new file mode 100644 index 0000000000000..e88dc29a868b2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/text_viewer.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_text_viewer_h; +struct directFuncToKodi_gui_dialogs_text_viewer_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_text_viewer_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_text_viewer_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_text_viewer_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.cpp new file mode 100644 index 0000000000000..d8ab54ee4e685 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "yes_no.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_dialogs_yes_no_h::InitDirect(directFuncToAddon_gui_dialogs_yes_no_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_single_text(const char* heading, + const char* text, + bool* canceled, + const char* noLabel, + const char* yesLabel) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_single_text(const char* heading, const char* text, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ + + if (heading == nullptr || text == nullptr || canceled == nullptr || noLabel == nullptr || + yesLabel == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + heading, text, *canceled, noLabel, yesLabel)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_yes_no_h, + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1 t = + ident.get().as(); + + *canceled = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_yes_no_h; + return auto_gen_group.kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1( + auto_gen_group.thisClassHdl, heading, text, canceled, noLabel, yesLabel); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_text(const char* heading, + const char* line0, + const char* line1, + const char* line2, + const char* noLabel, + const char* yesLabel) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ + + if (heading == nullptr || line0 == nullptr || line1 == nullptr || line2 == nullptr || + noLabel == nullptr || yesLabel == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1( + heading, line0, line1, line2, noLabel, yesLabel)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_yes_no_h, + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1 t = + ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_yes_no_h; + return auto_gen_group.kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1( + auto_gen_group.thisClassHdl, heading, line0, line1, line2, noLabel, yesLabel); +} + +ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( + const char* heading, + const char* line0, + const char* line1, + const char* line2, + bool* canceled, + const char* noLabel, + const char* yesLabel) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( const char* heading, const char* line0, const char* line1, const char* line2, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ + + if (heading == nullptr || line0 == nullptr || line1 == nullptr || line2 == nullptr || + canceled == nullptr || noLabel == nullptr || yesLabel == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + heading, line0, line1, line2, *canceled, noLabel, yesLabel)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_dialogs_yes_no_h, + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1 t = + ident.get().as(); + + *canceled = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_dialogs_yes_no_h; + return auto_gen_group.kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1( + auto_gen_group.thisClassHdl, heading, line0, line1, line2, canceled, noLabel, yesLabel); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.h new file mode 100644 index 0000000000000..56951d922f30f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/dialogs/yes_no.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_dialogs_yes_no_h; +struct directFuncToKodi_gui_dialogs_yes_no_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_dialogs_yes_no_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_dialogs_yes_no_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_dialogs_yes_no_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.cpp new file mode 100644 index 0000000000000..0821b1da15622 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "general.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_general_h::InitDirect(directFuncToAddon_gui_general_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_gui_lock() +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_lock() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_lock_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_lock_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_gui_general_h, + funcParent_kodi_gui_lock_v1); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + auto_gen_group.kodi_gui_lock_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT void kodi_gui_unlock() +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_unlock() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_unlock_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_unlock_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_gui_general_h, + funcParent_kodi_gui_unlock_v1); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + auto_gen_group.kodi_gui_unlock_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT int kodi_gui_get_screen_height() +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_height() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_screen_height_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_screen_height_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_screen_height_v1, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_screen_height_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_screen_height_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT int kodi_gui_get_screen_width() +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_width() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_screen_width_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_screen_width_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_screen_width_v1, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_screen_width_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_screen_width_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT float kodi_gui_get_video_resolution() +{ + // Original API call: ATTR_DLL_EXPORT float kodi_gui_get_video_resolution() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_video_resolution_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_video_resolution_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_video_resolution_v1, out)) + return 0.0f; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_video_resolution_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_video_resolution_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT int kodi_gui_get_current_window_dialog_id() +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_dialog_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_current_window_dialog_id_v1, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_current_window_dialog_id_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_current_window_dialog_id_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT int kodi_gui_get_current_window_id() +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_id() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_current_window_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_id_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_current_window_id_v1, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_current_window_id_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_current_window_id_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context() +{ + // Original API call: ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_get_hw_context_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_get_hw_context_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_gui_general_h, funcParent_kodi_gui_get_hw_context_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_get_hw_context_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_general_h; + return auto_gen_group.kodi_gui_get_hw_context_v1(auto_gen_group.thisClassHdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.h new file mode 100644 index 0000000000000..c426ef2a3bb0d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/general.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_general_h; +struct directFuncToKodi_gui_general_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_general_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_general_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_general_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.cpp new file mode 100644 index 0000000000000..7e46900ebd721 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.cpp @@ -0,0 +1,432 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "list_item.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_list_item_h::InitDirect(directFuncToAddon_gui_list_item_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create(const char* label, + const char* label2, + const char* path) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create(const char* label, const char* label2, const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_create_v1; /* Autogenerated */ + + if (label == nullptr || label2 == nullptr || path == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_create_v1(label, label2, path)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_create_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_create_v1(auto_gen_group.thisClassHdl, label, label2, + path); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_destroy(KODI_GUI_LISTITEM_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_destroy(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_destroy_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_destroy_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_destroy_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label(KODI_GUI_LISTITEM_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_get_label_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_get_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_get_label_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_get_label_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_set_label(KODI_GUI_LISTITEM_HANDLE handle, const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_set_label_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_set_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_set_label_v1(auto_gen_group.thisClassHdl, handle, label); +} + +ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label2(KODI_GUI_LISTITEM_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label2(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_get_label2_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_get_label2_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_get_label2_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_get_label2_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_set_label2(KODI_GUI_LISTITEM_HANDLE handle, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label2(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_set_label2_v1(PtrValue(handle), label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_set_label2_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_set_label2_v1(auto_gen_group.thisClassHdl, handle, label); +} + +ATTR_DLL_EXPORT char* kodi_gui_listitem_get_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_art_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_art_v1; /* Autogenerated */ + + if (handle == nullptr || type == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_get_art_v1(PtrValue(handle), type)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_get_art_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_get_art_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_get_art_v1(auto_gen_group.thisClassHdl, handle, type); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_set_art(KODI_GUI_LISTITEM_HANDLE handle, + const char* type, + const char* image) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type, const char* image) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_art_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_art_v1; /* Autogenerated */ + + if (handle == nullptr || type == nullptr || image == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_set_art_v1(PtrValue(handle), type, image)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_set_art_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_set_art_v1(auto_gen_group.thisClassHdl, handle, type, image); +} + +ATTR_DLL_EXPORT char* kodi_gui_listitem_get_path(KODI_GUI_LISTITEM_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_path(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_path_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_get_path_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_get_path_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_get_path_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_get_path_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_set_path(KODI_GUI_LISTITEM_HANDLE handle, const char* path) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_path(KODI_GUI_LISTITEM_HANDLE handle, const char* path) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_path_v1; /* Autogenerated */ + + if (handle == nullptr || path == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_set_path_v1(PtrValue(handle), path)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_set_path_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_set_path_v1(auto_gen_group.thisClassHdl, handle, path); +} + +ATTR_DLL_EXPORT char* kodi_gui_listitem_get_property(KODI_GUI_LISTITEM_HANDLE handle, + const char* key) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_get_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_get_property_v1(PtrValue(handle), key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_get_property_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_get_property_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_get_property_v1(auto_gen_group.thisClassHdl, handle, key); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_set_property(KODI_GUI_LISTITEM_HANDLE handle, + const char* key, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_set_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_listitem_set_property_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_set_property_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_set_property_v1(auto_gen_group.thisClassHdl, handle, key, value); +} + +ATTR_DLL_EXPORT void kodi_gui_listitem_select(KODI_GUI_LISTITEM_HANDLE handle, bool select) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_select(KODI_GUI_LISTITEM_HANDLE handle, bool select) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_select_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_select_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_select_v1(PtrValue(handle), select)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_select_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + auto_gen_group.kodi_gui_listitem_select_v1(auto_gen_group.thisClassHdl, handle, select); +} + +ATTR_DLL_EXPORT bool kodi_gui_listitem_is_selected(KODI_GUI_LISTITEM_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_listitem_is_selected(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_listitem_is_selected_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_list_item_h, funcParent_kodi_gui_listitem_is_selected_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_listitem_is_selected_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_list_item_h; + return auto_gen_group.kodi_gui_listitem_is_selected_v1(auto_gen_group.thisClassHdl, handle); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.h new file mode 100644 index 0000000000000..33bc6e7be7755 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/list_item.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_list_item_h; +struct directFuncToKodi_gui_list_item_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_list_item_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_list_item_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_list_item_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.cpp new file mode 100644 index 0000000000000..ca120e8f75f2a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.cpp @@ -0,0 +1,1340 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "window.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_gui_window_h::InitDirect(directFuncToAddon_gui_window_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT KODI_GUI_WINDOW_HANDLE kodi_gui_window_create(KODI_HANDLE kodiBase, + const char* xml_filename, + const char* default_skin, + bool as_dialog, + bool is_media) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_WINDOW_HANDLE kodi_gui_window_create(KODI_HANDLE kodiBase, const char* xml_filename, const char* default_skin, bool as_dialog, bool is_media) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_create_v1; /* Autogenerated */ + + if (kodiBase == nullptr || xml_filename == nullptr || default_skin == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_create_v1(PtrValue(kodiBase), xml_filename, + default_skin, as_dialog, is_media)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_create_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_create_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_create_v1(auto_gen_group.thisClassHdl, kodiBase, + xml_filename, default_skin, as_dialog, is_media); +} + +ATTR_DLL_EXPORT void kodi_gui_window_destroy(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_destroy(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_destroy_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_destroy_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_destroy_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT bool kodi_gui_window_show(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_show(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_show_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_show_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_show_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_show_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_show_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_show_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT bool kodi_gui_window_close(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_close(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_close_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_close_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_close_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_close_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_close_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_close_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT bool kodi_gui_window_do_modal(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_do_modal(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_do_modal_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_do_modal_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_do_modal_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_do_modal_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_do_modal_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_do_modal_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT bool kodi_gui_window_set_focus_id(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_set_focus_id(KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ + + if (handle == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_focus_id_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_focus_id_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_set_focus_id_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_set_focus_id_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT int kodi_gui_window_get_focus_id(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_focus_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_focus_id_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_focus_id_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_focus_id_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_focus_id_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_control_label(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + const char* label) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_label(KODI_GUI_WINDOW_HANDLE handle, int control_id, const char* label) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_label_v1; /* Autogenerated */ + + if (handle == nullptr || label == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_control_label_v1(PtrValue(handle), + control_id, label)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_control_label_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_control_label_v1(auto_gen_group.thisClassHdl, handle, + control_id, label); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_control_visible(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool visible) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_visible(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool visible) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_control_visible_v1(PtrValue(handle), + control_id, visible)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_control_visible_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_control_visible_v1(auto_gen_group.thisClassHdl, handle, + control_id, visible); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_control_selected(KODI_GUI_WINDOW_HANDLE handle, + int control_id, + bool selected) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_selected(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool selected) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_control_selected_v1(PtrValue(handle), + control_id, selected)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_control_selected_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_control_selected_v1(auto_gen_group.thisClassHdl, handle, + control_id, selected); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_property(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_property_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_property_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_property_v1(auto_gen_group.thisClassHdl, handle, key, value); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_property_int(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + int value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_int_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_set_property_int_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_property_int_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_property_int_v1(auto_gen_group.thisClassHdl, handle, key, + value); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_property_bool(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + bool value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_set_property_bool_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_property_bool_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_property_bool_v1(auto_gen_group.thisClassHdl, handle, key, + value); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_property_double(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + double value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key, double value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_property_double_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_double_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_set_property_double_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_property_double_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_property_double_v1(auto_gen_group.thisClassHdl, handle, key, + value); +} + +ATTR_DLL_EXPORT char* kodi_gui_window_get_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_gui_window_get_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_property_v1(PtrValue(handle), key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_property_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_property_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_property_v1(auto_gen_group.thisClassHdl, handle, key); +} + +ATTR_DLL_EXPORT int kodi_gui_window_get_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_int_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_property_int_v1(PtrValue(handle), key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_property_int_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_property_int_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_property_int_v1(auto_gen_group.thisClassHdl, handle, + key); +} + +ATTR_DLL_EXPORT bool kodi_gui_window_get_property_bool(KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_get_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_property_bool_v1(PtrValue(handle), key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_property_bool_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_property_bool_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_property_bool_v1(auto_gen_group.thisClassHdl, handle, + key); +} + +ATTR_DLL_EXPORT double kodi_gui_window_get_property_double(KODI_GUI_WINDOW_HANDLE handle, + const char* key) +{ + // Original API call: ATTR_DLL_EXPORT double kodi_gui_window_get_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_property_double_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_double_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return 0.0; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_property_double_v1(PtrValue(handle), key)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_property_double_v1, in, out)) + return 0.0; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_property_double_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_property_double_v1(auto_gen_group.thisClassHdl, handle, + key); +} + +ATTR_DLL_EXPORT void kodi_gui_window_clear_properties(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_properties(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_properties_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_properties_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_clear_properties_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_clear_properties_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_clear_properties_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_window_clear_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_clear_property_v1(PtrValue(handle), key)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_clear_property_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_clear_property_v1(auto_gen_group.thisClassHdl, handle, key); +} + +ATTR_DLL_EXPORT void kodi_gui_window_clear_item_list(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_item_list(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_clear_item_list_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_clear_item_list_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_clear_item_list_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_window_add_list_item(KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item, + int list_position) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_add_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_add_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_add_list_item_v1; /* Autogenerated */ + + if (handle == nullptr || item == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_add_list_item_v1( + PtrValue(handle), PtrValue(item), list_position)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_add_list_item_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_add_list_item_v1(auto_gen_group.thisClassHdl, handle, item, + list_position); +} + +ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item_from_position(KODI_GUI_WINDOW_HANDLE handle, + int list_position) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item_from_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_remove_list_item_from_position_v1( + PtrValue(handle), list_position)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_remove_list_item_from_position_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_remove_list_item_from_position_v1(auto_gen_group.thisClassHdl, + handle, list_position); +} + +ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item(KODI_GUI_WINDOW_HANDLE handle, + KODI_GUI_LISTITEM_HANDLE item) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ + + if (handle == nullptr || item == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_remove_list_item_v1(PtrValue(handle), PtrValue(item))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_remove_list_item_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_remove_list_item_v1(auto_gen_group.thisClassHdl, handle, item); +} + +ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE +kodi_gui_window_get_list_item(KODI_GUI_WINDOW_HANDLE handle, int list_position) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_window_get_list_item(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_list_item_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_item_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_get_list_item_v1(PtrValue(handle), list_position)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_list_item_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_list_item_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_list_item_v1(auto_gen_group.thisClassHdl, handle, + list_position); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_current_list_position(KODI_GUI_WINDOW_HANDLE handle, + int list_position) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_current_list_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_set_current_list_position_v1(PtrValue(handle), + list_position)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_current_list_position_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_current_list_position_v1(auto_gen_group.thisClassHdl, handle, + list_position); +} + +ATTR_DLL_EXPORT int kodi_gui_window_get_current_list_position(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_list_position(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_current_list_position_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_current_list_position_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_current_list_position_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_current_list_position_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT int kodi_gui_window_get_list_size(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_list_size(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_list_size_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_size_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_list_size_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_list_size_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_list_size_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_list_size_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_container_property(KODI_GUI_WINDOW_HANDLE handle, + const char* key, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_container_property_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_property_v1; /* Autogenerated */ + + if (handle == nullptr || key == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_set_container_property_v1(PtrValue(handle), key, value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_container_property_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_container_property_v1(auto_gen_group.thisClassHdl, handle, key, + value); +} + +ATTR_DLL_EXPORT void kodi_gui_window_set_container_content(KODI_GUI_WINDOW_HANDLE handle, + const char* value) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_content(KODI_GUI_WINDOW_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_set_container_content_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_content_v1; /* Autogenerated */ + + if (handle == nullptr || value == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_set_container_content_v1(PtrValue(handle), value)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_set_container_content_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_set_container_content_v1(auto_gen_group.thisClassHdl, handle, + value); +} + +ATTR_DLL_EXPORT int kodi_gui_window_get_current_container_id(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_container_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ + + if (handle == nullptr) + return -1; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_current_container_id_v1(PtrValue(handle))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_current_container_id_v1, in, + out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_current_container_id_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_current_container_id_v1(auto_gen_group.thisClassHdl, + handle); +} + +ATTR_DLL_EXPORT void kodi_gui_window_mark_dirty_region(KODI_GUI_WINDOW_HANDLE handle) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_gui_window_mark_dirty_region(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ + + if (handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_gui_window_mark_dirty_region_v1(PtrValue(handle))); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_mark_dirty_region_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + auto_gen_group.kodi_gui_window_mark_dirty_region_v1(auto_gen_group.thisClassHdl, handle); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_button(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_button_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_button_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_get_control_button_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_button_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_button_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_button_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_edit(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_edit( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_get_control_edit_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_edit_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_edit_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_edit_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_fade_label(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_fade_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_get_control_fade_label_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_fade_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_fade_label_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_fade_label_v1(auto_gen_group.thisClassHdl, + handle, control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_image(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_image( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_image_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_image_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_get_control_image_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_image_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_image_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_image_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_label(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_label_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_label_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_get_control_label_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_label_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_label_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_label_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_progress(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_progress( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_get_control_progress_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_progress_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_progress_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_progress_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_radio_button(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_radio_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_control_radio_button_v1(PtrValue(handle), + control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_radio_button_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_radio_button_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_radio_button_v1(auto_gen_group.thisClassHdl, + handle, control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_render_addon(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_render_addon( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_control_render_addon_v1(PtrValue(handle), + control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_render_addon_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_render_addon_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_render_addon_v1(auto_gen_group.thisClassHdl, + handle, control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_settings_slider(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_settings_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_gui_window_get_control_settings_slider_v1(PtrValue(handle), + control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_settings_slider_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_settings_slider_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_settings_slider_v1(auto_gen_group.thisClassHdl, + handle, control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_slider(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_get_control_slider_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_slider_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_slider_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_slider_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_spin(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_spin( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgParent__IN_kodi_gui_window_get_control_spin_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_spin_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_spin_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_spin_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE +kodi_gui_window_get_control_text_box(KODI_GUI_WINDOW_HANDLE handle, int control_id) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_text_box( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ + + if (handle == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack( + in, msgParent__IN_kodi_gui_window_get_control_text_box_v1(PtrValue(handle), control_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_gui_window_h, funcParent_kodi_gui_window_get_control_text_box_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_gui_window_get_control_text_box_v1 t = ident.get().as(); + + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.gui_window_h; + return auto_gen_group.kodi_gui_window_get_control_text_box_v1(auto_gen_group.thisClassHdl, handle, + control_id); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.h b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.h new file mode 100644 index 0000000000000..e65ddbb568bec --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/gui/window.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_gui_window_h; +struct directFuncToKodi_gui_window_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_gui_window_h : public IMsgHdl +{ +public: + CHdl_kodi_gui_window_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_gui_window_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.cpp new file mode 100644 index 0000000000000..bbb84e779ce27 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "monitor.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_monitor_h::InitDirect(directFuncToAddon_monitor_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_monitor_wait_for_abort(double timeout) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_monitor_wait_for_abort(double timeout) __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_monitor_wait_for_abort - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_monitor_wait_for_abort - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + std::mutex mtx; + std::unique_lock lck(mtx); + AddonIfc::g_ifc->m_cv.wait_for(lck, std::chrono::duration(timeout)); + return AddonIfc::g_ifc->killCalled; + + /*---AUTO_GEN_PARSE---*/ +} + +ATTR_DLL_EXPORT bool kodi_monitor_abort_requested() +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_monitor_abort_requested() __INTRODUCED_IN_KODI(1); + // Tuple in: /* NOTE: msgParent__IN_kodi_monitor_abort_requested - Override active to use inside dev-kit library only */ + // Tuple out: /* NOTE: msgParent_OUT_kodi_monitor_abort_requested - Override active to use inside dev-kit library only */ + + /*---AUTO_GEN_PARSE---*/ + + return AddonIfc::g_ifc->killCalled; + + /*---AUTO_GEN_PARSE---*/ +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.h b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.h new file mode 100644 index 0000000000000..7aa42bcbd6f84 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/monitor.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_monitor_h; +struct directFuncToKodi_monitor_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_monitor_h : public IMsgHdl +{ +public: + CHdl_kodi_monitor_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_monitor_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/network.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/network.cpp new file mode 100644 index 0000000000000..00b7d49a85090 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/network.cpp @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#include "network.h" + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +void CHdl_kodi_network_h::InitDirect(directFuncToAddon_network_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +/* NOTE: unused (no functions from Kodi to addon here) */ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT bool kodi_network_wake_on_lan(const char* mac) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_network_wake_on_lan(const char* mac) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_wake_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_wake_on_lan_v1; /* Autogenerated */ + + if (mac == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_network_wake_on_lan_v1(mac)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_network_h, funcParent_kodi_network_wake_on_lan_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_wake_on_lan_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_wake_on_lan_v1(auto_gen_group.thisClassHdl, mac); +} + +ATTR_DLL_EXPORT char* kodi_network_get_ip_address() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_ip_address() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_ip_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_ip_address_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_network_h, funcParent_kodi_network_get_ip_address_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_get_ip_address_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_get_ip_address_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT char* kodi_network_dns_lookup(const char* url, bool* ret) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_network_dns_lookup(const char* url, bool* ret) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_dns_lookup_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_dns_lookup_v1; /* Autogenerated */ + + if (url == nullptr || ret == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_network_dns_lookup_v1(url, *ret)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_network_h, funcParent_kodi_network_dns_lookup_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_dns_lookup_v1 t = ident.get().as(); + + *ret = std::get<1>(t); + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_dns_lookup_v1(auto_gen_group.thisClassHdl, url, ret); +} + +ATTR_DLL_EXPORT char* kodi_network_url_encode(const char* url) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_network_url_encode(const char* url) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_url_encode_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_url_encode_v1; /* Autogenerated */ + + if (url == nullptr) + return nullptr; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_network_url_encode_v1(url)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_network_h, funcParent_kodi_network_url_encode_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_url_encode_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_url_encode_v1(auto_gen_group.thisClassHdl, url); +} + +ATTR_DLL_EXPORT char* kodi_network_get_hostname() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_hostname() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_hostname_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_hostname_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_network_h, funcParent_kodi_network_get_hostname_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_get_hostname_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_get_hostname_v1(auto_gen_group.thisClassHdl); +} + +ATTR_DLL_EXPORT bool kodi_network_is_local_host(const char* hostname) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_network_is_local_host(const char* hostname) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_is_local_host_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_is_local_host_v1; /* Autogenerated */ + + if (hostname == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_network_is_local_host_v1(hostname)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_network_h, funcParent_kodi_network_is_local_host_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_is_local_host_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_is_local_host_v1(auto_gen_group.thisClassHdl, hostname); +} + +ATTR_DLL_EXPORT bool kodi_network_is_host_on_lan(const char* hostname, bool offLineCheck) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_network_is_host_on_lan(const char* hostname, bool offLineCheck) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_is_host_on_lan_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_is_host_on_lan_v1; /* Autogenerated */ + + if (hostname == nullptr) + return false; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_network_is_host_on_lan_v1(hostname, offLineCheck)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_network_h, funcParent_kodi_network_is_host_on_lan_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_is_host_on_lan_v1 t = ident.get().as(); + + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_is_host_on_lan_v1(auto_gen_group.thisClassHdl, hostname, + offLineCheck); +} + +ATTR_DLL_EXPORT char* kodi_network_get_user_agent() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_network_get_user_agent() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_network_get_user_agent_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_network_get_user_agent_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer out; + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn( + funcGroup_network_h, funcParent_kodi_network_get_user_agent_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_network_get_user_agent_v1 t = ident.get().as(); + + return strdup(std::get<0>(t).c_str()); + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.network_h; + return auto_gen_group.kodi_network_get_user_agent_v1(auto_gen_group.thisClassHdl); +} + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/network.h b/xbmc/addons/kodi-dev-kit/src/addon/api/network.h new file mode 100644 index 0000000000000..18359692ad358 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/network.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/network.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_network_h; +struct directFuncToKodi_network_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_network_h : public IMsgHdl +{ +public: + CHdl_kodi_network_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_network_h* ifcToAddon); + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ + /*---AUTO_GEN_PARSE---*/ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/core/CMakeLists.txt new file mode 100644 index 0000000000000..9412a79a2a529 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/CMakeLists.txt @@ -0,0 +1,17 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + addon_control.cpp + addon_thread_control.cpp +) + +set(HEADERS + IMsgHdl.h + addon_control.h + addon_thread_control.h +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_core) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/IMsgHdl.h b/xbmc/addons/kodi-dev-kit/src/addon/core/IMsgHdl.h new file mode 100644 index 0000000000000..1dd5429f7e32e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/IMsgHdl.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "../../../src/shared/SharedGroups.h" +#include "../../../src/shared/api/addon_base.h" + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +struct AddonIfc; + +class ATTR_DLL_LOCAL IMsgHdl +{ +public: + IMsgHdl(AddonIfc* ifc) + : m_ifc(ifc) + { + } + virtual ~IMsgHdl() = default; + + virtual bool HandleMessage(int funcGroup, int func, const msgpack::unpacked& in, msgpack::sbuffer& out) { return false; } + +protected: + AddonIfc* m_ifc; +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp new file mode 100644 index 0000000000000..c5dbcf33f27f6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "addon_control.h" + +#include "../../../include/kodi/tools/StringUtils.h" +#include "../../../src/shared/api/processor.h" + +/*---AUTO_GEN_PARSE---*/ +/* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */ +#include "api/addon_base.h" +#include "api/audio_engine.h" +#include "api/filesystem.h" +#include "api/general.h" +#include "api/monitor.h" +#include "api/network.h" +#include "api/addon-instance/audiodecoder.h" +#include "api/addon-instance/audioencoder.h" +#include "api/addon-instance/game.h" +#include "api/addon-instance/imagedecoder.h" +#include "api/addon-instance/inputstream.h" +#include "api/addon-instance/peripheral.h" +#include "api/addon-instance/pvr.h" +#include "api/addon-instance/screensaver.h" +#include "api/addon-instance/vfs.h" +#include "api/addon-instance/videocodec.h" +#include "api/addon-instance/visualization.h" +#include "api/gui/general.h" +#include "api/gui/list_item.h" +#include "api/gui/window.h" +#include "api/gui/controls/button.h" +#include "api/gui/controls/edit.h" +#include "api/gui/controls/fade_label.h" +#include "api/gui/controls/image.h" +#include "api/gui/controls/label.h" +#include "api/gui/controls/progress.h" +#include "api/gui/controls/radio_button.h" +#include "api/gui/controls/rendering.h" +#include "api/gui/controls/settings_slider.h" +#include "api/gui/controls/slider.h" +#include "api/gui/controls/spin.h" +#include "api/gui/controls/text_box.h" +#include "api/gui/dialogs/context_menu.h" +#include "api/gui/dialogs/extended_progress.h" +#include "api/gui/dialogs/filebrowser.h" +#include "api/gui/dialogs/keyboard.h" +#include "api/gui/dialogs/numeric.h" +#include "api/gui/dialogs/ok.h" +#include "api/gui/dialogs/progress.h" +#include "api/gui/dialogs/select.h" +#include "api/gui/dialogs/text_viewer.h" +#include "api/gui/dialogs/yes_no.h" +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using KODI_ADDON::INTERNAL::AddonIfc; +using KODI_ADDON::INTERNAL::CAddonControl; +using KODI_ADDON::INTERNAL::CAddonThreadIfc; +using kodi::tools::StringUtils; + +AddonIfc* AddonIfc::g_ifc = nullptr; + + +CAddonControl::CAddonControl(AddonIfc* ifc) + : m_ifc(ifc), + m_mainThreadId(std::this_thread::get_id()), + m_mainThread(std::make_shared(0, this, ifc->viaMainThread)) +{ + /*---AUTO_GEN_PARSE---*/ + /* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */ + CHdl_kodi_addon_base_h* addon_base_h = new CHdl_kodi_addon_base_h(m_ifc); + m_handlers[funcGroup_addon_base_h] = addon_base_h; + CHdl_kodi_addoninstance_audiodecoder_h* addoninstance_audiodecoder_h = new CHdl_kodi_addoninstance_audiodecoder_h(m_ifc); + m_handlers[funcGroup_addoninstance_audiodecoder_h] = addoninstance_audiodecoder_h; + CHdl_kodi_addoninstance_audioencoder_h* addoninstance_audioencoder_h = new CHdl_kodi_addoninstance_audioencoder_h(m_ifc); + m_handlers[funcGroup_addoninstance_audioencoder_h] = addoninstance_audioencoder_h; + CHdl_kodi_addoninstance_game_h* addoninstance_game_h = new CHdl_kodi_addoninstance_game_h(m_ifc); + m_handlers[funcGroup_addoninstance_game_h] = addoninstance_game_h; + CHdl_kodi_addoninstance_imagedecoder_h* addoninstance_imagedecoder_h = new CHdl_kodi_addoninstance_imagedecoder_h(m_ifc); + m_handlers[funcGroup_addoninstance_imagedecoder_h] = addoninstance_imagedecoder_h; + CHdl_kodi_addoninstance_inputstream_h* addoninstance_inputstream_h = new CHdl_kodi_addoninstance_inputstream_h(m_ifc); + m_handlers[funcGroup_addoninstance_inputstream_h] = addoninstance_inputstream_h; + CHdl_kodi_addoninstance_peripheral_h* addoninstance_peripheral_h = new CHdl_kodi_addoninstance_peripheral_h(m_ifc); + m_handlers[funcGroup_addoninstance_peripheral_h] = addoninstance_peripheral_h; + CHdl_kodi_addoninstance_pvr_h* addoninstance_pvr_h = new CHdl_kodi_addoninstance_pvr_h(m_ifc); + m_handlers[funcGroup_addoninstance_pvr_h] = addoninstance_pvr_h; + CHdl_kodi_addoninstance_screensaver_h* addoninstance_screensaver_h = new CHdl_kodi_addoninstance_screensaver_h(m_ifc); + m_handlers[funcGroup_addoninstance_screensaver_h] = addoninstance_screensaver_h; + CHdl_kodi_addoninstance_vfs_h* addoninstance_vfs_h = new CHdl_kodi_addoninstance_vfs_h(m_ifc); + m_handlers[funcGroup_addoninstance_vfs_h] = addoninstance_vfs_h; + CHdl_kodi_addoninstance_videocodec_h* addoninstance_videocodec_h = new CHdl_kodi_addoninstance_videocodec_h(m_ifc); + m_handlers[funcGroup_addoninstance_videocodec_h] = addoninstance_videocodec_h; + CHdl_kodi_addoninstance_visualization_h* addoninstance_visualization_h = new CHdl_kodi_addoninstance_visualization_h(m_ifc); + m_handlers[funcGroup_addoninstance_visualization_h] = addoninstance_visualization_h; + CHdl_kodi_gui_window_h* gui_window_h = new CHdl_kodi_gui_window_h(m_ifc); + m_handlers[funcGroup_gui_window_h] = gui_window_h; + + if (m_ifc->direct != nullptr) + { + addon_base_h->InitDirect(&m_ifc->direct->to_addon.addon_base_h); + addoninstance_audiodecoder_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_audiodecoder_h); + addoninstance_audioencoder_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_audioencoder_h); + addoninstance_game_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_game_h); + addoninstance_imagedecoder_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_imagedecoder_h); + addoninstance_inputstream_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_inputstream_h); + addoninstance_peripheral_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_peripheral_h); + addoninstance_pvr_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_pvr_h); + addoninstance_screensaver_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_screensaver_h); + addoninstance_vfs_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_vfs_h); + addoninstance_videocodec_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_videocodec_h); + addoninstance_visualization_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_visualization_h); + gui_window_h->InitDirect(&m_ifc->direct->to_addon.gui_window_h); + } + /*---AUTO_GEN_PARSE---*/ + + if (m_ifc->direct != nullptr) + { + m_ifc->direct->to_addon.processor_h.thisClassHdl = this; + m_ifc->direct->to_addon.processor_h.kodi_kill_child = kodi_kill_child; + } +} + +CAddonControl::~CAddonControl() +{ + for (auto& handler : m_handlers) + { + delete handler; + } +} + +bool CAddonControl::Create() +{ + if (!m_mainThread->Create()) + return false; + + return true; +} + +std::shared_ptr CAddonControl::GetThreadIfc() +{ + const std::thread::id threadId = std::this_thread::get_id(); + + if (m_mainThreadId == threadId) + { + return m_mainThread; + } + + std::unique_lock lock(m_mutex); + + auto it = std::find_if(m_runningSubThreads.begin(), + m_runningSubThreads.end(), + [](std::shared_ptr entry){ return !entry->Active(); } + ); + if (it == m_runningSubThreads.end()) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgParent__IN_kodi_processor_CreateForNewThread(m_mainThread->GetID())); + m_mainThread->SendMessage(funcGroup_Main, kodi_processor_CreateForNewThread, in, out); + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_processor_CreateForNewThread t = ident.get().as(); + const std::string identifier = std::get<0>(t); + + auto newIfc = std::make_shared(std::get<1>(t), this, false); + if (!newIfc->Create()) + { + return nullptr; + } + m_runningSubThreads.emplace(newIfc); + return newIfc; + } + + return *it; +} + +bool CAddonControl::ProcessOutside() +{ + return GetThreadIfc()->ProcessOutside(); +} + +bool CAddonControl::FuncCall(int group, int func, const msgpack::unpacked& in, msgpack::sbuffer& out) +{ + if (group == funcGroup_Main) + { + switch (func) + { + case kodi_processor_KillChild: + { + msgChild__IN_kodi_processor_KillChild t = in.get().as(); + if (m_ifc->identifier != std::get<0>(t)) + { + fprintf(stderr, "FATAL: Addon called with invalid identifier to kill!\n"); + } + + m_ifc->killCalled = true; + m_ifc->m_cv.notify_all(); + // False return here stops the related thread process. + return false; + } + default: + break; + } + + return false; + } + + if (m_handlers[group]) + return m_handlers[group]->HandleMessage(group, func, in, out); + + fprintf(stderr, "FATAL: Addon called with invalid group %i!\n", group); + return false; +} + +void CAddonControl::kodi_kill_child(void* thisClassHdl, const char* uuid) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + if (thisClass->m_ifc->identifier != uuid) + { + fprintf(stderr, "FATAL: Addon called with invalid identifier to kill!\n"); + } + + thisClass->m_ifc->killCalled = true; + thisClass->m_ifc->m_cv.notify_all(); + thisClass->m_mainThread->DestroyReceiver(); +} + diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.h new file mode 100644 index 0000000000000..1a0b57499a03f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "addon_thread_control.h" +#include "../../shared/DirectData.h" +#include "../../shared/Instances.h" +#include "../../../include/kodi/c-api/addon_base.h" + +#include "IMsgHdl.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class CAddonControl; + + +struct ATTR_DLL_LOCAL AddonIfc +{ + unsigned int api; + std::string identifier; + std::unique_ptr control{nullptr}; + bool viaMainThread{false}; + bool noReceive{false}; + bool killCalled{false}; + KODI::ADDONS::INTERFACE::UnionAddonFunctions functions{}; + std::condition_variable m_cv; + + // Data for case addon used without shared mem, not as independent app and direct to Kodi + KODI::ADDONS::INTERFACE::DirectAddonIfc* direct{nullptr}; + bool direct_used{false}; + + // Handle where contains first instance handle pointer in Kodi for addons where accessed + // by Kodi, e.g. PVR. + // This always set with first used instace pointer in Kodi, but only be used by C++ API and + // if CAddonBase and IAddonInstance in same child. + // On other addons where works itself, e.g. service or video addon, is it unused and 0. + KODI_HANDLE kodiFirstInstance{nullptr}; + + static AddonIfc* g_ifc; +}; + +class ATTR_DLL_LOCAL CAddonControl +{ +public: + CAddonControl(AddonIfc* ifc); + ~CAddonControl(); + + bool Create(); + std::shared_ptr GetThreadIfc(); + bool ProcessOutside(); + bool FuncCall(int group, int func, const msgpack::unpacked& in, msgpack::sbuffer& out); + + const std::string& GetUUID() const { return m_ifc->identifier; } + +private: + AddonIfc* const m_ifc; + + const std::thread::id m_mainThreadId; + const std::shared_ptr m_mainThread; + std::set> m_runningSubThreads; + std::set> m_unusedThreads; + std::array m_handlers{nullptr}; + + std::mutex m_mutex; + + static void kodi_kill_child(void* thisClassHdl, const char* uuid); +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.cpp b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.cpp new file mode 100644 index 0000000000000..2533f3dbd1919 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "addon_thread_control.h" +#include "addon_control.h" + +#include "../../../include/kodi/tools/StringUtils.h" + +#include "../../shared/ShareProcessReceiver.h" +#include "../../shared/ShareProcessTransmitter.h" + +using kodi::tools::StringUtils; +using namespace KODI::ADDONS::INTERFACE; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +CAddonThreadIfc::CAddonThreadIfc(int64_t identifier, CAddonControl* process, bool processOutside) + : m_mainThread(identifier == 0), + m_identifier(identifier), + m_id(StringUtils::Format("%s-ifc-%05i", process->GetUUID().c_str(), m_identifier)), + m_processOutside(processOutside), + m_process(process) +{ + m_shareProcessReceiver = new CShareProcessReceiver(m_id + "-srvchl", m_mainThread); + m_shareProcessTransmitter = new CShareProcessTransmitter(m_id + "-chlsrv", m_mainThread); + + fprintf(stderr, "DEBUG: Started thread class with id '%s'\n", m_id.c_str()); +} + +CAddonThreadIfc::~CAddonThreadIfc() +{ + Destroy(); + delete m_shareProcessReceiver; + delete m_shareProcessTransmitter; +} + +bool CAddonThreadIfc::Create() +{ + if (!m_shareProcessTransmitter->Create(false)) + { + fprintf(stderr, "FATAL: Failed to create shared process memory from addon to Kodi (id '%s') (Last error: %s)\n", m_id.c_str(), m_shareProcessTransmitter->GetLastErrorText().c_str()); + return false; + } + + if (!m_shareProcessReceiver->Create(false, !m_processOutside)) + { + fprintf(stderr, "FATAL: Failed to create shared process memory from Kodi to addon (id '%s') (Last error: %s)\n", m_id.c_str(), m_shareProcessReceiver->GetLastErrorText().c_str()); + return false; + } + + m_shareProcessReceiver->RegisterReceiver( + std::bind(&CAddonControl::FuncCall, m_process, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + + return true; +} + +void CAddonThreadIfc::Destroy() +{ + m_shareProcessTransmitter->Destroy(); + m_shareProcessReceiver->Destroy(); +} + +void CAddonThreadIfc::DestroyReceiver() +{ + m_shareProcessReceiver->Destroy(); +} + +bool CAddonThreadIfc::SendMessage(int group, int func) +{ + return m_shareProcessTransmitter->SendMessage(group, func); +} + +bool CAddonThreadIfc::SendMessage(int group, int func, const msgpack::sbuffer& in) +{ + return m_shareProcessTransmitter->SendMessage(group, func, in); +} + +bool CAddonThreadIfc::SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret) +{ + return m_shareProcessTransmitter->SendMessage(group, func, in, ret); +} + +bool CAddonThreadIfc::SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret) +{ + return m_shareProcessTransmitter->SendMessageOnlyGetReturn(group, func, ret); +} + +bool CAddonThreadIfc::ProcessOutside() +{ + if (!m_processOutside) + return false; + + return m_shareProcessReceiver->ProcessOutside(); +} + +bool CAddonThreadIfc::Active() const +{ + return m_shareProcessTransmitter->m_active || m_shareProcessReceiver->m_active; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.h new file mode 100644 index 0000000000000..fb2e1d264f1f2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "../../../include/kodi/c-api/addon_base.h" +#include "../../../src/shared/SharedData.h" + +#include +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CShareProcessReceiver; +class CShareProcessTransmitter; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class CAddonControl; + +class ATTR_DLL_LOCAL CAddonThreadIfc +{ +public: + CAddonThreadIfc(int64_t identifier, CAddonControl* process, bool processOutside); + ~CAddonThreadIfc(); + + bool Create(); + void Destroy(); + void DestroyReceiver(); + + bool SendMessage(int group, int func); + bool SendMessage(int group, int func, const msgpack::sbuffer& in); + bool SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret); + bool SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret); + + bool ProcessOutside(); + + bool Active() const; + const std::string& GetID() const { return m_id; } + +private: + const bool m_mainThread; + const int64_t m_identifier; + const std::string m_id; + const bool m_processOutside; + CAddonControl* const m_process; + + int64_t m_pid{-1}; + KODI::ADDONS::INTERFACE::CShareProcessReceiver* m_shareProcessReceiver{nullptr}; + KODI::ADDONS::INTERFACE::CShareProcessTransmitter* m_shareProcessTransmitter{nullptr}; +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon_base.h b/xbmc/addons/kodi-dev-kit/src/addon_base.h new file mode 100644 index 0000000000000..77df6897419a9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_base.h @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_ADDON_H +#define C_API_ADDON_H + +#if !defined(NOMINMAX) +#define NOMINMAX +#endif + +#include "version.h" + +#include +#include +#include + +#ifndef TARGET_WINDOWS +#ifndef __cdecl +#define __cdecl +#endif +#ifndef __declspec +#define __declspec(X) +#endif +#endif + +// Generic helper definitions for smallest possible alignment +//@{ +#undef ATTRIBUTE_PACKED +#undef PRAGMA_PACK_BEGIN +#undef PRAGMA_PACK_END + +#if defined(__GNUC__) +#define ATTRIBUTE_PACKED __attribute__((packed)) +#define PRAGMA_PACK 0 +#endif + +#if !defined(ATTRIBUTE_PACKED) +#define ATTRIBUTE_PACKED +#define PRAGMA_PACK 1 +#endif +//@} + +// Generic helper definitions for inline function support +//@{ +#ifdef _MSC_VER +#define ATTRIBUTE_FORCEINLINE __forceinline +#elif defined(__GNUC__) +#define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__)) +#elif defined(__CLANG__) +#if __has_attribute(__always_inline__) +#define ATTRIBUTE_FORCEINLINE inline __attribute__((__always_inline__)) +#else +#define ATTRIBUTE_FORCEINLINE inline +#endif +#else +#define ATTRIBUTE_FORCEINLINE inline +#endif +//@} + +// Generic helper definitions for shared library support +//@{ +#if defined _WIN32 || defined __CYGWIN__ +#define ATTR_DLL_IMPORT __declspec(dllimport) +#define ATTR_DLL_EXPORT __declspec(dllexport) +#define ATTR_DLL_LOCAL +#define ATTR_APIENTRY __stdcall +#else +#if __GNUC__ >= 4 +#define ATTR_DLL_IMPORT __attribute__((visibility("default"))) +#define ATTR_DLL_EXPORT __attribute__((visibility("default"))) +#define ATTR_DLL_LOCAL __attribute__((visibility("hidden"))) +#else +#define ATTR_DLL_IMPORT +#define ATTR_DLL_EXPORT +#define ATTR_DLL_LOCAL +#endif +#define ATTR_APIENTRY +#endif +#define ATTRIBUTE_HIDDEN ATTR_DLL_LOCAL // Fallback to old + +#ifndef ATTR_APIENTRYP +#define ATTR_APIENTRYP ATTR_APIENTRY* +#endif +//@} + +#ifdef _WIN32 // windows +#if !defined(_SSIZE_T_DEFINED) && !defined(HAVE_SSIZE_T) +typedef intptr_t ssize_t; +#define _SSIZE_T_DEFINED +#endif // !_SSIZE_T_DEFINED +#ifndef SSIZE_MAX +#define SSIZE_MAX INTPTR_MAX +#endif // !SSIZE_MAX +#else // Linux, Mac, FreeBSD +#include +#endif // TARGET_POSIX + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if __KODI_API__ >= 1 + + typedef void* KODI_HANDLE; + typedef void* KODI_IFC_HDL; + typedef void* KODI_DLL_HDL; + typedef void* KODI_OWN_HDL; + typedef void* KODI_ADDON_HDL; +// typedef void* KODI_INSTANCE_HDL; + + typedef void* ADDON_HARDWARE_CONTEXT2; + + typedef enum ADDON_STATUS + { + ADDON_STATUS_OK, + ADDON_STATUS_LOST_CONNECTION, + ADDON_STATUS_NEED_RESTART, + ADDON_STATUS_NEED_SETTINGS, + ADDON_STATUS_UNKNOWN, + ADDON_STATUS_PERMANENT_FAILURE, + ADDON_STATUS_NOT_IMPLEMENTED + } ADDON_STATUS; + + typedef enum ADDON_LOG + { + ADDON_LOG_DEBUG = 0, + ADDON_LOG_INFO = 1, + ADDON_LOG_WARNING = 2, + ADDON_LOG_ERROR = 3, + ADDON_LOG_FATAL = 4 + } ADDON_LOG; + + typedef enum ADDON_INSTANCE + { + ADDON_INSTANCE_UNKNOWN = 0, + ADDON_INSTANCE_AUDIODECODER, + ADDON_INSTANCE_AUDIOENCODER, + ADDON_INSTANCE_GAME, + ADDON_INSTANCE_INPUTSTREAM, + ADDON_INSTANCE_PERIPHERAL, + ADDON_INSTANCE_PVR, + ADDON_INSTANCE_SCREENSAVER, + ADDON_INSTANCE_VISUALIZATION, + ADDON_INSTANCE_VFS, + ADDON_INSTANCE_IMAGEDECODER, + ADDON_INSTANCE_VIDEOCODEC, + ADDON_INSTANCE_WEB, + } ADDON_INSTANCE; + + typedef struct KODI_INSTANCE_HDL + { + ADDON_INSTANCE type; + KODI_OWN_HDL kodi; + KODI_IFC_HDL instance; + bool kodi_first_instance; + union + { + KODI_HANDLE dummy; + struct KODI_ADDON_AUDIODECODER_FUNC* audiodecoder; + struct KODI_ADDON_AUDIOENCODER_FUNC* audioencoder; + struct KODI_ADDON_IMAGEDECODER_FUNC* imagedecoder; + struct KODI_ADDON_GAME_FUNC* game; + struct KODI_ADDON_INPUTSTREAM_FUNC* inputstream; + struct KODI_ADDON_PERIPHERAL_FUNC* peripheral; + struct KODI_ADDON_SCREENSAVER_FUNC* screensaver; + struct KODI_ADDON_VFS_FUNC* vfs; + struct KODI_ADDON_VIDEOCODEC_FUNC* videocodec; + struct KODI_ADDON_VISUALIZATION_FUNC* visualization; + }; + } KODI_INSTANCE_HDL; + + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(KODI_HANDLE first_instance, KODI_ADDON_HDL* hdl); + /*---AUTO_GEN_PARSE---*/ + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)(const KODI_ADDON_HDL hdl, + enum ADDON_INSTANCE instanceType, + const char* instanceID, + struct KODI_INSTANCE_HDL* addonInstance, + KODI_IFC_HDL parent); + /*---AUTO_GEN_PARSE---*/ + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)(const KODI_ADDON_HDL hdl, + enum ADDON_INSTANCE instanceType, + struct KODI_INSTANCE_HDL* instance); + /*---AUTO_GEN_PARSE---*/ + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, + const char* name, + const char* value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, + const char* name, + bool value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, + const char* name, + int value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, + const char* name, + float value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT2_V2)(const KODI_ADDON_HDL hdl, + const char* name, + float value); + + typedef struct KODI_ADDON_FUNC + { + PFN_KODI_ADDON_CREATE_V1 create; + PFN_KODI_ADDON_DESTROY_V1 destroy; + PFN_KODI_ADDON_CREATE_INSTANCE_V1 create_instance; + PFN_KODI_ADDON_DESTROY_INSTANCE_V1 destroy_instance; + PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1 setting_change_string; + PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1 setting_change_boolean; + PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1 setting_change_integer; +#if __KODI_API__ >= 2 + PFN_KODI_ADDON_SETTING_CHANGE_FLOAT2_V2 setting_change_float2; +#endif /* !__KODI_API__ >= 2 */ + PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1 setting_change_float; + } KODI_ADDON_FUNC; + + ATTR_DLL_EXPORT const char* kodi_check_main_shared(int argc, char* argv[]) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT KODI_IFC_HDL kodi_init(unsigned int api, + int argc, char* argv[], struct KODI_ADDON_FUNC* func, bool via_main, bool no_receive) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT void kodi_deinit(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + ATTR_DLL_EXPORT bool kodi_process(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); + /*---AUTO_GEN_PARSE---*/ + + ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_share_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_user_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) __INTRODUCED_IN_KODI(1); + +#endif /* __KODI_API__ >= 1 */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !C_API_ADDON_H */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt new file mode 100644 index 0000000000000..48e23268ba01b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt @@ -0,0 +1,98 @@ +project(devkit_shared) + +include(../../cmake/Macros.cmake) + +#---AUTO_GEN_PARSE--- +# Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcessReceiver.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcessTransmitter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControl.cpp + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.cpp> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.cpp> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.cpp> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.cpp> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.cpp> +) +#---AUTO_GEN_PARSE--- + +#---AUTO_GEN_PARSE--- +# Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py +set(HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/DirectData.h + ${CMAKE_CURRENT_SOURCE_DIR}/Instances.h + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcess.h + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcessReceiver.h + ${CMAKE_CURRENT_SOURCE_DIR}/ShareProcessTransmitter.h + ${CMAKE_CURRENT_SOURCE_DIR}/SharedData.h + ${CMAKE_CURRENT_SOURCE_DIR}/SharedGroups.h + ${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControl.h + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.h> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.h> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.h> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.h> + $<$:${CMAKE_CURRENT_SOURCE_DIR}/SharedMemControlPosixMMAP.h> + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon_base.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/audio_engine.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/filesystem.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/general.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/monitor.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/network.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/processor.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/audiodecoder.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/audioencoder.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/game.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/imagedecoder.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/inputstream.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/peripheral.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/screensaver.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/vfs.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/videocodec.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/visualization.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_channel_groups.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_channels.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_defines.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_edl.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_epg.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_general.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_menu_hook.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_recordings.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/addon-instance/pvr/pvr_timers.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/general.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/list_item.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/window.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/button.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/edit.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/fade_label.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/image.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/label.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/progress.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/radio_button.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/rendering.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/settings_slider.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/slider.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/spin.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/controls/text_box.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/context_menu.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/extended_progress.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/filebrowser.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/keyboard.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/numeric.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/ok.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/progress.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/select.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/text_viewer.h + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/dialogs/yes_no.h +) +#---AUTO_GEN_PARSE--- + +# target_sources(devkit_shared INTERFACE ${SOURCES} +# ${HEADERS}) +add_library(devkit_shared OBJECT ${SOURCES} + ${HEADERS}) +set_target_properties(devkit_shared PROPERTIES C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON) diff --git a/xbmc/addons/kodi-dev-kit/src/shared/DirectData.h b/xbmc/addons/kodi-dev-kit/src/shared/DirectData.h new file mode 100644 index 0000000000000..d1c6f895a773e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/DirectData.h @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +/* + * This header is used to allow direct api interface between addon and Kodi. + * Becomes used in case the addon is loaded as dynamic lib and without use of + * shared memory. + * + * This can be in case if higher performance needed or OS not support + * independent apps (e.g. iOS/tvos) + * + * The structure defined here is only used between library and Kodi not used + * inside addon itself, with this are changes here not critical. + */ + +#pragma once + +#include "src/shared/api/addon-instance/audiodecoder.h" +#include "src/shared/api/addon-instance/audioencoder.h" +#include "src/shared/api/addon-instance/game.h" +#include "src/shared/api/addon-instance/imagedecoder.h" +#include "src/shared/api/addon-instance/inputstream.h" +#include "src/shared/api/addon-instance/peripheral.h" +#include "src/shared/api/addon-instance/pvr.h" +#include "src/shared/api/addon-instance/screensaver.h" +#include "src/shared/api/addon-instance/vfs.h" +#include "src/shared/api/addon-instance/videocodec.h" +#include "src/shared/api/addon-instance/visualization.h" +#include "src/shared/api/addon_base.h" +#include "src/shared/api/audio_engine.h" +#include "src/shared/api/filesystem.h" +#include "src/shared/api/general.h" +#include "src/shared/api/gui/controls/button.h" +#include "src/shared/api/gui/controls/edit.h" +#include "src/shared/api/gui/controls/fade_label.h" +#include "src/shared/api/gui/controls/image.h" +#include "src/shared/api/gui/controls/label.h" +#include "src/shared/api/gui/controls/progress.h" +#include "src/shared/api/gui/controls/radio_button.h" +#include "src/shared/api/gui/controls/rendering.h" +#include "src/shared/api/gui/controls/settings_slider.h" +#include "src/shared/api/gui/controls/slider.h" +#include "src/shared/api/gui/controls/spin.h" +#include "src/shared/api/gui/controls/text_box.h" +#include "src/shared/api/gui/dialogs/context_menu.h" +#include "src/shared/api/gui/dialogs/extended_progress.h" +#include "src/shared/api/gui/dialogs/filebrowser.h" +#include "src/shared/api/gui/dialogs/keyboard.h" +#include "src/shared/api/gui/dialogs/numeric.h" +#include "src/shared/api/gui/dialogs/ok.h" +#include "src/shared/api/gui/dialogs/progress.h" +#include "src/shared/api/gui/dialogs/select.h" +#include "src/shared/api/gui/dialogs/text_viewer.h" +#include "src/shared/api/gui/dialogs/yes_no.h" +#include "src/shared/api/gui/general.h" +#include "src/shared/api/gui/list_item.h" +#include "src/shared/api/gui/window.h" +#include "src/shared/api/monitor.h" +#include "src/shared/api/network.h" +#include "src/shared/api/processor.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct DirectAddonIfcToKodi +{ + directFuncToKodi_addon_base_h addon_base_h; + directFuncToKodi_audio_engine_h audio_engine_h; + directFuncToKodi_filesystem_h filesystem_h; + directFuncToKodi_general_h general_h; + directFuncToKodi_monitor_h monitor_h; + directFuncToKodi_network_h network_h; + directFuncToKodi_addoninstance_audiodecoder_h addoninstance_audiodecoder_h; + directFuncToKodi_addoninstance_audioencoder_h addoninstance_audioencoder_h; + directFuncToKodi_addoninstance_game_h addoninstance_game_h; + directFuncToKodi_addoninstance_imagedecoder_h addoninstance_imagedecoder_h; + directFuncToKodi_addoninstance_inputstream_h addoninstance_inputstream_h; + directFuncToKodi_addoninstance_peripheral_h addoninstance_peripheral_h; + directFuncToKodi_addoninstance_pvr_h addoninstance_pvr_h; + directFuncToKodi_addoninstance_screensaver_h addoninstance_screensaver_h; + directFuncToKodi_addoninstance_vfs_h addoninstance_vfs_h; + directFuncToKodi_addoninstance_videocodec_h addoninstance_videocodec_h; + directFuncToKodi_addoninstance_visualization_h addoninstance_visualization_h; + directFuncToKodi_gui_general_h gui_general_h; + directFuncToKodi_gui_list_item_h gui_list_item_h; + directFuncToKodi_gui_window_h gui_window_h; + directFuncToKodi_gui_controls_button_h gui_controls_button_h; + directFuncToKodi_gui_controls_edit_h gui_controls_edit_h; + directFuncToKodi_gui_controls_fade_label_h gui_controls_fade_label_h; + directFuncToKodi_gui_controls_image_h gui_controls_image_h; + directFuncToKodi_gui_controls_label_h gui_controls_label_h; + directFuncToKodi_gui_controls_progress_h gui_controls_progress_h; + directFuncToKodi_gui_controls_radio_button_h gui_controls_radio_button_h; + directFuncToKodi_gui_controls_rendering_h gui_controls_rendering_h; + directFuncToKodi_gui_controls_settings_slider_h gui_controls_settings_slider_h; + directFuncToKodi_gui_controls_slider_h gui_controls_slider_h; + directFuncToKodi_gui_controls_spin_h gui_controls_spin_h; + directFuncToKodi_gui_controls_text_box_h gui_controls_text_box_h; + directFuncToKodi_gui_dialogs_context_menu_h gui_dialogs_context_menu_h; + directFuncToKodi_gui_dialogs_extended_progress_h gui_dialogs_extended_progress_h; + directFuncToKodi_gui_dialogs_filebrowser_h gui_dialogs_filebrowser_h; + directFuncToKodi_gui_dialogs_keyboard_h gui_dialogs_keyboard_h; + directFuncToKodi_gui_dialogs_numeric_h gui_dialogs_numeric_h; + directFuncToKodi_gui_dialogs_ok_h gui_dialogs_ok_h; + directFuncToKodi_gui_dialogs_progress_h gui_dialogs_progress_h; + directFuncToKodi_gui_dialogs_select_h gui_dialogs_select_h; + directFuncToKodi_gui_dialogs_text_viewer_h gui_dialogs_text_viewer_h; + directFuncToKodi_gui_dialogs_yes_no_h gui_dialogs_yes_no_h; +}; + +struct DirectAddonIfcToAddon +{ + directFuncToAddon_addon_base_h addon_base_h; + directFuncToAddon_audio_engine_h audio_engine_h; + directFuncToAddon_filesystem_h filesystem_h; + directFuncToAddon_general_h general_h; + directFuncToAddon_monitor_h monitor_h; + directFuncToAddon_network_h network_h; + directFuncToAddon_addoninstance_audiodecoder_h addoninstance_audiodecoder_h; + directFuncToAddon_addoninstance_audioencoder_h addoninstance_audioencoder_h; + directFuncToAddon_addoninstance_game_h addoninstance_game_h; + directFuncToAddon_addoninstance_imagedecoder_h addoninstance_imagedecoder_h; + directFuncToAddon_addoninstance_inputstream_h addoninstance_inputstream_h; + directFuncToAddon_addoninstance_peripheral_h addoninstance_peripheral_h; + directFuncToAddon_addoninstance_pvr_h addoninstance_pvr_h; + directFuncToAddon_addoninstance_screensaver_h addoninstance_screensaver_h; + directFuncToAddon_addoninstance_vfs_h addoninstance_vfs_h; + directFuncToAddon_addoninstance_videocodec_h addoninstance_videocodec_h; + directFuncToAddon_addoninstance_visualization_h addoninstance_visualization_h; + directFuncToAddon_gui_general_h gui_general_h; + directFuncToAddon_gui_list_item_h gui_list_item_h; + directFuncToAddon_gui_window_h gui_window_h; + directFuncToAddon_gui_controls_button_h gui_controls_button_h; + directFuncToAddon_gui_controls_edit_h gui_controls_edit_h; + directFuncToAddon_gui_controls_fade_label_h gui_controls_fade_label_h; + directFuncToAddon_gui_controls_image_h gui_controls_image_h; + directFuncToAddon_gui_controls_label_h gui_controls_label_h; + directFuncToAddon_gui_controls_progress_h gui_controls_progress_h; + directFuncToAddon_gui_controls_radio_button_h gui_controls_radio_button_h; + directFuncToAddon_gui_controls_rendering_h gui_controls_rendering_h; + directFuncToAddon_gui_controls_settings_slider_h gui_controls_settings_slider_h; + directFuncToAddon_gui_controls_slider_h gui_controls_slider_h; + directFuncToAddon_gui_controls_spin_h gui_controls_spin_h; + directFuncToAddon_gui_controls_text_box_h gui_controls_text_box_h; + directFuncToAddon_gui_dialogs_context_menu_h gui_dialogs_context_menu_h; + directFuncToAddon_gui_dialogs_extended_progress_h gui_dialogs_extended_progress_h; + directFuncToAddon_gui_dialogs_filebrowser_h gui_dialogs_filebrowser_h; + directFuncToAddon_gui_dialogs_keyboard_h gui_dialogs_keyboard_h; + directFuncToAddon_gui_dialogs_numeric_h gui_dialogs_numeric_h; + directFuncToAddon_gui_dialogs_ok_h gui_dialogs_ok_h; + directFuncToAddon_gui_dialogs_progress_h gui_dialogs_progress_h; + directFuncToAddon_gui_dialogs_select_h gui_dialogs_select_h; + directFuncToAddon_gui_dialogs_text_viewer_h gui_dialogs_text_viewer_h; + directFuncToAddon_gui_dialogs_yes_no_h gui_dialogs_yes_no_h; + directFuncToAddon_processor_h processor_h; +}; + +struct DirectAddonIfc +{ + DirectAddonIfcToKodi to_kodi; + DirectAddonIfcToAddon to_addon; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/Instances.h b/xbmc/addons/kodi-dev-kit/src/shared/Instances.h new file mode 100644 index 0000000000000..d4562b9704ae4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/Instances.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +/*---AUTO_GEN_PARSE---*/ +#include "src/shared/api/addon-instance/audiodecoder.h" +#include "src/shared/api/addon-instance/audioencoder.h" +#include "src/shared/api/addon-instance/game.h" +#include "src/shared/api/addon-instance/imagedecoder.h" +#include "src/shared/api/addon-instance/inputstream.h" +#include "src/shared/api/addon-instance/peripheral.h" +#include "src/shared/api/addon-instance/pvr.h" +#include "src/shared/api/addon-instance/screensaver.h" +#include "src/shared/api/addon-instance/vfs.h" +#include "src/shared/api/addon-instance/videocodec.h" +#include "src/shared/api/addon-instance/visualization.h" +#include "src/shared/api/addon_base.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct UnionAddonFunctions +{ + /* related addon instancy type */ + ADDON_INSTANCE type; + /* the from addon self created and used pointer for instance */ + KODI_IFC_HDL hdl; + /* instance related pointer on Kodi side, normally the related class there */ + KODI_OWN_HDL kodi; + /* special pointer to related instance function structure of addon, this becomes given from addon + and again given from Kodi by destroy instance call, to allow addon a delete if it was + created before. If addon use a static structure can be this ignored. */ + KODI_IFC_HDL addon_struct_ptr; + /* Below the unions where store related instance function pointers, for here the whole structure + is used, other as on addon sided "KODI_INSTANCE_HDL" where a pointer to is set. + This with pointer is related to allow addon a static set of this and give his pointer on + instance creation. + Only as we can not know what addon does becomes it copied to here. */ + union + { + /*---AUTO_GEN_PARSE---*/ + uint32_t dummy; + union KODI_ADDON_FUNC_UNION kodi_addon; + union KODI_ADDON_AUDIODECODER_FUNC_UNION kodi_addon_audiodecoder; + union KODI_ADDON_AUDIOENCODER_FUNC_UNION kodi_addon_audioencoder; + union KODI_ADDON_GAME_FUNC_UNION kodi_addon_game; + union KODI_ADDON_IMAGEDECODER_FUNC_UNION kodi_addon_imagedecoder; + union KODI_ADDON_INPUTSTREAM_FUNC_UNION kodi_addon_inputstream; + union KODI_ADDON_PERIPHERAL_FUNC_UNION kodi_addon_peripheral; + union KODI_ADDON_PVR_FUNC_UNION kodi_addon_pvr; + union KODI_ADDON_SCREENSAVER_FUNC_UNION kodi_addon_screensaver; + union KODI_ADDON_VFS_FUNC_UNION kodi_addon_vfs; + union KODI_ADDON_VIDEOCODEC_FUNC_UNION kodi_addon_videocodec; + union KODI_ADDON_VISUALIZATION_FUNC_UNION kodi_addon_visualization; + /*---AUTO_GEN_PARSE---*/ + } types; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.cpp b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.cpp new file mode 100644 index 0000000000000..05647c253f3ed --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "ShareProcess.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CShareProcess::CShareProcess() +{ + +} + +CShareProcess::~CShareProcess() +{ + +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.h b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.h new file mode 100644 index 0000000000000..40d25acb11b88 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CShareProcess +{ +public: + CShareProcess(); + ~CShareProcess(); +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.cpp b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.cpp new file mode 100644 index 0000000000000..371ab11cfe9b5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.cpp @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "ShareProcessReceiver.h" + +#ifdef TARGET_POSIX +#include "SharedMemControlPosixMMAP.h" +#elif TARGET_WINDOWS +#include "SharedMemControlWindows.h" +#else +#error No valid OS defined +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CShareProcessReceiver::CShareProcessReceiver(const std::string& identifier, + bool mainThread, + size_t size /* = SHARED_DEFAULT_MEM_SIZE*/) + : m_identifier(identifier), + m_mainThread(mainThread), +#ifdef TARGET_POSIX + m_sharedMem(new CSharedMemControlPosix(identifier, size)) +#elif TARGET_WINDOWS + m_sharedMem(new CSharedMemControlWindows(identifier, size)) +#else + m_sharedMem(nullptr) +#endif +{ +} + +CShareProcessReceiver::~CShareProcessReceiver() +{ + Destroy(); + delete m_sharedMem; +} + +bool CShareProcessReceiver::Create(bool initial, bool useThread) +{ + if (!m_sharedMem->Create(initial)) + { + fprintf(stderr, "Failed to create receiver, error '%s'\n", + m_sharedMem->GetLastErrorText().c_str()); + return false; + } + + m_running = true; + m_useThread = useThread; + if (m_useThread) + m_thread = std::thread([&] { Process(); }); + + return true; +} + +void CShareProcessReceiver::Destroy() +{ + if (!m_running) + return; + + m_running = false; + m_sharedMem->Unlock_Target(); + + if (m_useThread) + { + if (m_thread.joinable()) + { + m_thread.join(); + } + } + else + { + while (m_active) + { + m_sharedMem->Unlock_Target(); + } + } + + m_sharedMem->Destroy(); +} + +bool CShareProcessReceiver::ProcessOutside() +{ + if (!m_running) + return false; + + bool ret = false; + + m_active = true; + + if (m_sharedMem->Lock_Target()) + { + if (!m_running) + { + m_active = false; + return false; + } + + apiShareData* const sharedMem = m_sharedMem->GetSharedMem(); + + char* data; + size_t data_size; + bool bigger_used = sharedMem->bigger; +// if (sharedMem->bigger) +// fprintf(stderr, "2 sharedMem->bigger %i\n", sharedMem->bigger); + if (!bigger_used) + { + data = sharedMem->data; + data_size = sharedMem->data_size; + } + else + { + size_t ptr = 0; + data = new char[sharedMem->data_size_complete]; + data_size = sharedMem->data_size_complete; + + while (true) + { + memcpy(data + ptr, sharedMem->data, sharedMem->data_size); + ptr += sharedMem->data_size; + if (ptr >= sharedMem->data_size_complete) + break; + + m_sharedMem->Unlock_Caller(); + m_sharedMem->Lock_Target(); + } + } + + msgpack::sbuffer retBuffer; + + auto input = msgpack::unpack(data, data_size); + if (HandleMessage(sharedMem->group, sharedMem->func, input, retBuffer)) + { + sharedMem->data_size_complete = retBuffer.size(); + if (sharedMem->data_size_complete <= SHARED_DEFAULT_MEM_SIZE) + { + sharedMem->bigger_return = false; + sharedMem->data_size = sharedMem->data_size_complete; + memcpy(sharedMem->data, retBuffer.data(), sharedMem->data_size); + } + else + { + sharedMem->bigger_return = true; + sharedMem->data_size = SHARED_DEFAULT_MEM_SIZE; + + size_t ptr = 0; + while (ptr < sharedMem->data_size_complete) + { + sharedMem->data_size = retBuffer.size() - ptr > SHARED_DEFAULT_MEM_SIZE ? SHARED_DEFAULT_MEM_SIZE + : retBuffer.size() - ptr; + memcpy(sharedMem->data, retBuffer.data() + ptr, sharedMem->data_size); + ptr += sharedMem->data_size; + + m_sharedMem->Unlock_Caller(); + m_sharedMem->Lock_Target(); + } + } + + ret = true; + } + else + { + ret = false; + } + + if (bigger_used) + { + delete[] data; + } + } + + m_sharedMem->Unlock_Caller(); + m_active = false; + + return ret; +} + +void CShareProcessReceiver::Process() +{ + while (m_running) + { + ProcessOutside(); + } +} + +void CShareProcessReceiver::RegisterReceiver(SharedProcess func) +{ + m_receivers.emplace_back(func); +} + +bool CShareProcessReceiver::HandleMessage(int group, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + bool ret = false; + m_sharedMem->SetActive(); + + out.clear(); + + for (const auto& receiver : m_receivers) + { + if (receiver(group, func, in, out)) + { + ret = true; + break; + } + } + + m_sharedMem->SetInactive(); + + return ret; +} + +const std::string& CShareProcessReceiver::GetLastErrorText() const +{ + return m_sharedMem->GetLastErrorText(); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h new file mode 100644 index 0000000000000..83a9919aa8ecd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "SharedData.h" + +#include +#include +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CSharedMemControl; + +class CShareProcessReceiver +{ +public: + CShareProcessReceiver(const std::string& identifier, + bool mainThread, + size_t size = SHARED_DEFAULT_MEM_SIZE); + ~CShareProcessReceiver(); + + bool Create(bool initial, bool useThread); + void Destroy(); + void RegisterReceiver(SharedProcess func); + bool ProcessOutside(); + + const std::string& GetIdentifier() const { return m_identifier; } + const std::string& GetLastErrorText() const; + + std::atomic_bool m_active{false}; + +protected: + void Process(); + +private: + bool HandleMessage(int group, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out); + + const std::string m_identifier; + const bool m_mainThread; + CSharedMemControl* const m_sharedMem; + + bool m_useThread{false}; + std::thread m_thread; + std::atomic_bool m_running{false}; + std::vector m_receivers; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.cpp b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.cpp new file mode 100644 index 0000000000000..cc805e337aa6d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.cpp @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "ShareProcessTransmitter.h" + +#ifdef TARGET_POSIX +#include "SharedMemControlPosixMMAP.h" +#elif TARGET_WINDOWS +#include "SharedMemControlWindows.h" +#else +#error No valid OS defined +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CShareProcessTransmitter::CShareProcessTransmitter(const std::string& identifier, bool mainThread, size_t size /* = SHARED_DEFAULT_MEM_SIZE*/) + : m_identifier(identifier), + m_mainThread(mainThread), +#ifdef TARGET_POSIX + m_sharedMem(new CSharedMemControlPosix(identifier, size)) +#elif TARGET_WINDOWS + m_sharedMem(new CSharedMemControlWindows(identifier, size)) +#else + m_sharedMem(nullptr) +#endif +{ +} + +CShareProcessTransmitter::~CShareProcessTransmitter() +{ + Destroy(); + delete m_sharedMem; +} + +bool CShareProcessTransmitter::Create(bool initial) +{ + if (!m_sharedMem->Create(initial)) + return false; + + m_created = true; + return true; +} + +void CShareProcessTransmitter::Destroy() +{ + m_created = false; + while (m_active) + { + m_sharedMem->Unlock_Caller(); + } + m_sharedMem->Destroy(); +} + +bool CShareProcessTransmitter::SendMessage(int group, int func) +{ + if (!m_created) + return false; + + // Lock to prevent other calls as long active. + m_sharedMem->Lock(); + m_active = true; + + apiShareData* sharedMem = m_sharedMem->GetSharedMem(); + sharedMem->group = group; + sharedMem->func = func; + sharedMem->bigger = false; + sharedMem->data_size_complete = 0; + sharedMem->data_size = 0; + sharedMem->main_thread = m_mainThread; + + // Unlock wait process inside kodi to make requested work. + m_sharedMem->Unlock_Target(); + + // Lock here until Kodi finished. + m_sharedMem->Lock_Caller(); + + m_active = false; + m_sharedMem->Unlock(); + + return m_created; +} + +bool CShareProcessTransmitter::SendMessage(int group, int func, const msgpack::sbuffer& in) +{ + if (!m_created) + return false; + + // Lock to prevent other calls as long active. + m_sharedMem->Lock(); + m_active = true; + + apiShareData* sharedMem = m_sharedMem->GetSharedMem(); + sharedMem->group = group; + sharedMem->func = func; + + size_t size = in.size(); + sharedMem->bigger = size > DEFAULT_SHARED_MEM_ARRAY_SIZE; + if (!sharedMem->bigger) + { + sharedMem->data_size_complete = size; + sharedMem->data_size = size; + + memcpy(sharedMem->data, in.data(), sharedMem->data_size); + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + } + else + { + size_t ptr = 0; + sharedMem->data_size_complete = size; + + while (ptr < sharedMem->data_size_complete) + { +// fprintf(stderr, "1 sharedMem->bigger %i %zu %zu\n", sharedMem->bigger, sharedMem->data_size, sharedMem->data_size_complete); + + sharedMem->data_size = size > DEFAULT_SHARED_MEM_ARRAY_SIZE ? DEFAULT_SHARED_MEM_ARRAY_SIZE : size; + + size -= DEFAULT_SHARED_MEM_ARRAY_SIZE; + + memcpy(sharedMem->data, in.data() + ptr, sharedMem->data_size); + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + + ptr += sharedMem->data_size; + } + } + + sharedMem->main_thread = m_mainThread; + + m_active = false; + m_sharedMem->Unlock(); + + return m_created; +} + +bool CShareProcessTransmitter::SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret) +{ + if (!m_created) + return false; + + // Lock to prevent other calls as long active. + m_sharedMem->Lock(); + m_active = true; + + apiShareData* sharedMem = m_sharedMem->GetSharedMem(); + sharedMem->group = group; + sharedMem->func = func; + + size_t size = in.size(); + sharedMem->bigger = size > DEFAULT_SHARED_MEM_ARRAY_SIZE; + if (!sharedMem->bigger) + { + sharedMem->data_size_complete = size; + sharedMem->data_size = size; + + memcpy(sharedMem->data, in.data(), sharedMem->data_size); + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + } + else + { + size_t ptr = 0; + sharedMem->data_size_complete = size; + + while (ptr < sharedMem->data_size_complete) + { +// fprintf(stderr, "1 sharedMem->bigger %i %zu %zu\n", sharedMem->bigger, sharedMem->data_size, sharedMem->data_size_complete); + + sharedMem->data_size = size > DEFAULT_SHARED_MEM_ARRAY_SIZE ? DEFAULT_SHARED_MEM_ARRAY_SIZE : size; + + size -= DEFAULT_SHARED_MEM_ARRAY_SIZE; + + memcpy(sharedMem->data, in.data() + ptr, sharedMem->data_size); + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + + ptr += sharedMem->data_size; + } + } + + sharedMem->main_thread = m_mainThread; + + if (m_created) + { + if (!sharedMem->bigger_return) + { + ret.write(sharedMem->data, sharedMem->data_size); + } + else + { + size_t ptr = 0; + while (ptr < sharedMem->data_size_complete) + { + ret.write(sharedMem->data, sharedMem->data_size); + ptr += sharedMem->data_size; + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + } + } + } + + m_active = false; + m_sharedMem->Unlock(); + + return m_created; +} + +bool CShareProcessTransmitter::SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret) +{ + if (!m_created) + return false; + + // Lock to prevent other calls as long active. + m_sharedMem->Lock(); + m_active = true; + + apiShareData* sharedMem = m_sharedMem->GetSharedMem(); + sharedMem->group = group; + sharedMem->func = func; + + // Unlock wait process inside kodi to make requested work. + m_sharedMem->Unlock_Target(); + + // Lock here until Kodi finished. + m_sharedMem->Lock_Caller(); + + if (m_created) + { + if (!sharedMem->bigger_return) + { + ret.write(sharedMem->data, sharedMem->data_size); + } + else + { + size_t ptr = 0; + while (ptr < sharedMem->data_size_complete) + { + ret.write(sharedMem->data, sharedMem->data_size); + ptr += sharedMem->data_size; + + m_sharedMem->Unlock_Target(); + m_sharedMem->Lock_Caller(); + } + } + } + + m_active = false; + m_sharedMem->Unlock(); + + return m_created; +} + +const std::string& CShareProcessTransmitter::GetLastErrorText() const +{ + return m_sharedMem->GetLastErrorText(); +} + +int64_t CShareProcessTransmitter::GetPID() const +{ + return m_sharedMem->GetPID(); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.h b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.h new file mode 100644 index 0000000000000..c32284ab7a495 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "SharedData.h" + +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CSharedMemControl; + +class CShareProcessTransmitter +{ +public: + CShareProcessTransmitter(const std::string& identifier, + bool mainThread, + size_t size = SHARED_DEFAULT_MEM_SIZE); + ~CShareProcessTransmitter(); + + bool Create(bool initial); + void Destroy(); + + bool SendMessage(int group, int func); + bool SendMessage(int group, int func, const msgpack::sbuffer& in); + bool SendMessage(int group, int func, const msgpack::sbuffer& in, msgpack::sbuffer& ret); + bool SendMessageOnlyGetReturn(int group, int func, msgpack::sbuffer& ret); + + const std::string& GetIdentifier() const { return m_identifier; } + const std::string& GetLastErrorText() const; + int64_t GetPID() const; + + std::atomic_bool m_active{false}; + std::atomic_bool m_created{false}; + +private: + const std::string m_identifier; + const bool m_mainThread; + CSharedMemControl* const m_sharedMem; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedData.h b/xbmc/addons/kodi-dev-kit/src/shared/SharedData.h new file mode 100644 index 0000000000000..fba730d8cd4e4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedData.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include + +#include + +#if (defined TARGET_WINDOWS) +typedef HANDLE SEMAPHORE_ID; +typedef unsigned long THREAD_ID; +#elif (defined TARGET_POSIX) +#include + +typedef sem_t SEMAPHORE_ID; +typedef pthread_t THREAD_ID; +#else +#error Not supported OS used +#endif + +#define SHARED_DEFAULT_MEM_SIZE 32768 * 8 +#define DEFAULT_SHARED_MEM_ARRAY_SIZE SHARED_DEFAULT_MEM_SIZE - (sizeof(uint32_t) * 10) + +/*! + * @brief Data structure to share memory between independent process apps. + * + * This used to exchange data between Kodi and addons. + * + * @todo Check for realloc to prevent additional data loops in some cases when + * more needs to send? + */ +typedef struct apiShareData +{ + //! If set to true related shared memory is inited and available + bool inited; + + //! Locking mutex of caller where blocks until target has done his work. + //! Lock called by caller, unlock called by target. + SEMAPHORE_ID sem_segment_to_caller; + + //! Locking mutex of target where where wait until caller request work. + //! Lock called by target, unlock called by caller. + SEMAPHORE_ID sem_segment_to_target; + + //! Normal locking mutex to prevent multiply access to shared memory at same time + SEMAPHORE_ID sem_segment_lock; + + bool main_thread; + THREAD_ID calling_thread; + + int api_level_caller; + int group; + int func; + + //! To inform about bigger memory size as here in data used and need loop until complete. + bool bigger; + + //! Like @ref bigger, only related to return of call. + bool bigger_return; + + //! Data size complete of all, normally equal to @ref SHARED_DEFAULT_MEM_SIZE. + //! If bigger as @ref data_size target need to copy to itself until complete size done. + size_t data_size_complete; + + //! Data size used in this shared memory here by @ref data + //! + //! @note It should confirm in most cases that no bigger data size is used as then additional + //! memory copy becomes needed! + size_t data_size; + + //! Shared memory data array to exchange working data between processes. + char data[SHARED_DEFAULT_MEM_SIZE/2]; + + size_t data_size_new; + + char data_new[SHARED_DEFAULT_MEM_SIZE/2]; +} apiShareData; + +using SharedProcess = std::function; diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h b/xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h new file mode 100644 index 0000000000000..5c18f77494d52 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "../../include/kodi/c-api/addon_base.h" +#include "SharedData.h" + +#ifndef ATTR_INT_APIENTRYP +#define ATTR_INT_APIENTRYP ATTR_APIENTRYP +#endif + +#ifndef ATTR_INT_DLL_EXPORT +#define ATTR_INT_DLL_EXPORT ATTR_DLL_EXPORT +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_tm +{ + IFC_tm() = default; + IFC_tm(const tm* c_data) + { + if (c_data == nullptr) + return; + + tm_sec = c_data->tm_sec; + tm_min = c_data->tm_min; + tm_hour = c_data->tm_hour; + tm_mday = c_data->tm_mday; + tm_mon = c_data->tm_mon; + tm_year = c_data->tm_year; + tm_wday = c_data->tm_wday; + tm_yday = c_data->tm_yday; + tm_isdst = c_data->tm_isdst; + +#ifdef __USE_MISC + tm_gmtoff = c_data->tm_gmtoff; + tm_zone = c_data->tm_zone; +#else + tm_gmtoff = c_data->__tm_gmtoff; /* Seconds east of UTC. */ + tm_zone = c_data->__tm_zone; /* Timezone abbreviation. */ +#endif + } + + void CleanCStructure(tm* c_data) + { + if (c_data == nullptr) + return; + } + + void SetCStructure(tm* c_data) + { + if (c_data == nullptr) + return; + + c_data->tm_sec = tm_sec; + c_data->tm_min = tm_min; + c_data->tm_hour = tm_hour; + c_data->tm_mday = tm_mday; + c_data->tm_mon = tm_mon; + c_data->tm_year = tm_year; + c_data->tm_wday = tm_wday; + c_data->tm_yday = tm_yday; + c_data->tm_isdst = tm_isdst; + +#ifdef __USE_MISC + c_data->tm_gmtoff = tm_gmtoff; + c_data->tm_zone = tm_zone.c_str(); +#else + c_data->tm_gmtoff = __tm_gmtoff; /* Seconds east of UTC. */ + c_data->tm_zone = __tm_zone; /* Timezone abbreviation. */ +#endif + } + + int tm_sec; /* Seconds. [0-60] (1 leap second) */ + int tm_min; /* Minutes. [0-59] */ + int tm_hour; /* Hours. [0-23] */ + int tm_mday; /* Day. [1-31] */ + int tm_mon; /* Month. [0-11] */ + int tm_year; /* Year - 1900. */ + int tm_wday; /* Day of week. [0-6] */ + int tm_yday; /* Days in year.[0-365] */ + int tm_isdst; /* DST. [-1/0/1]*/ + + long int tm_gmtoff; /* Seconds east of UTC. */ + std::string tm_zone; /* Timezone abbreviation. */ + + MSGPACK_DEFINE(tm_sec, + tm_min, + tm_hour, + tm_mday, + tm_mon, + tm_year, + tm_wday, + tm_yday, + tm_isdst, + tm_gmtoff, + tm_zone); +}; + +typedef int DummyValue; +constexpr DummyValue DummyValueNull = 0; +typedef uint64_t PtrValue; +typedef int NEED_TODO_VALUES; + +typedef enum funcGroup : int +{ + funcGroup_Main = 0, + /*---AUTO_GEN_PARSE---*/ + /* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + funcGroup_addon_base_h, + funcGroup_audio_engine_h, + funcGroup_filesystem_h, + funcGroup_general_h, + funcGroup_monitor_h, + funcGroup_network_h, + funcGroup_addoninstance_audiodecoder_h, + funcGroup_addoninstance_audioencoder_h, + funcGroup_addoninstance_game_h, + funcGroup_addoninstance_imagedecoder_h, + funcGroup_addoninstance_inputstream_h, + funcGroup_addoninstance_peripheral_h, + funcGroup_addoninstance_pvr_h, + funcGroup_addoninstance_screensaver_h, + funcGroup_addoninstance_vfs_h, + funcGroup_addoninstance_videocodec_h, + funcGroup_addoninstance_visualization_h, + funcGroup_gui_general_h, + funcGroup_gui_list_item_h, + funcGroup_gui_window_h, + funcGroup_gui_controls_button_h, + funcGroup_gui_controls_edit_h, + funcGroup_gui_controls_fade_label_h, + funcGroup_gui_controls_image_h, + funcGroup_gui_controls_label_h, + funcGroup_gui_controls_progress_h, + funcGroup_gui_controls_radio_button_h, + funcGroup_gui_controls_rendering_h, + funcGroup_gui_controls_settings_slider_h, + funcGroup_gui_controls_slider_h, + funcGroup_gui_controls_spin_h, + funcGroup_gui_controls_text_box_h, + funcGroup_gui_dialogs_context_menu_h, + funcGroup_gui_dialogs_extended_progress_h, + funcGroup_gui_dialogs_filebrowser_h, + funcGroup_gui_dialogs_keyboard_h, + funcGroup_gui_dialogs_numeric_h, + funcGroup_gui_dialogs_ok_h, + funcGroup_gui_dialogs_progress_h, + funcGroup_gui_dialogs_select_h, + funcGroup_gui_dialogs_text_viewer_h, + funcGroup_gui_dialogs_yes_no_h, + /*---AUTO_GEN_PARSE---*/ + funcGroup_Max +} funcGroup; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.cpp b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.cpp new file mode 100644 index 0000000000000..09c78a3aca2ea --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "SharedMemControl.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CSharedMemControl::CSharedMemControl(const std::string& identifier, + size_t size /* = DEFAULT_SHARED_MEM_SIZE*/) + : m_identifier(identifier), + m_sharedMemSize(size) +{ +} + +void CSharedMemControl::SetActive() +{ + m_active = true; +} + +void CSharedMemControl::SetInactive() +{ + m_active = false; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.h b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.h new file mode 100644 index 0000000000000..18a1f226e4b29 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "SharedData.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CSharedMemControl +{ +public: + CSharedMemControl(const std::string& identifier, size_t size = SHARED_DEFAULT_MEM_SIZE); + virtual ~CSharedMemControl() = default; + + virtual bool Create(bool initial) = 0; + virtual bool Destroy() = 0; + virtual int64_t GetPID() const = 0; + + virtual bool Lock_Caller() = 0; + virtual void Unlock_Caller() = 0; + + virtual bool Lock_Target() = 0; + virtual void Unlock_Target() = 0; + + virtual bool Lock() = 0; + virtual void Unlock() = 0; + + void SetActive(); + void SetInactive(); + + const std::string& GetIdentifier() const { return m_identifier; } + apiShareData* const GetSharedMem() { return m_sharedMem; } + size_t GetSharedMemSize() const { return m_sharedMemSize; } + const std::string& GetLastErrorText() const { return m_errorText; } + +protected: + apiShareData* m_sharedMem = nullptr; + std::string m_errorText; + +private: + const std::string m_identifier; + const size_t m_sharedMemSize; + bool m_active{false}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.cpp b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.cpp new file mode 100644 index 0000000000000..053d92dfbf71c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.cpp @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux,freebsd,android,osx,darwin_embedded>---*/ + +#include "SharedMemControlPosixMMAP.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CSharedMemControlPosix::CSharedMemControlPosix(const std::string& identifier, size_t size /*= SHARED_DEFAULT_MEM_SIZE*/) + : CSharedMemControl(identifier, size) +{ +} + +CSharedMemControlPosix::~CSharedMemControlPosix() +{ + +} + +bool CSharedMemControlPosix::Create(bool initial) +{ + m_creator = initial; + + fprintf(stderr, "<<<<<<<<<<<<<<<<<<<<<<< %s\n", GetIdentifier().c_str()); + int fd = shm_open(GetIdentifier().c_str(), initial ? O_CREAT | O_TRUNC | O_RDWR : O_RDWR, 0666); + if (fd == -1) + { + m_errorText = "Shared memory failed to open"; + return false; + } + + m_fd = fd; + + if (initial) + { + if (ftruncate(m_fd, sizeof(apiShareData)) == -1) + { + m_errorText = "Shared memory size set failed"; + Destroy(); + return false; + } + } + + apiShareData* mem = static_cast(mmap64(nullptr, sizeof(apiShareData), + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, 0)); + if (mem == MAP_FAILED) + { + m_errorText = "Shared memory size set failed"; + Destroy(); + return false; + } + + m_sharedMem = mem; + + if (initial) + { + memset(mem, 0, sizeof(apiShareData)); + + if (sem_init(&m_sharedMem->sem_segment_to_caller, 1, 0) == -1) + { + m_errorText = "Semaphores caller init failed"; + Destroy(); + return false; + } + if (sem_init(&m_sharedMem->sem_segment_to_target, 1, 0) == -1) + { + m_errorText = "Semaphores target init failed"; + Destroy(); + return false; + } + if (sem_init(&m_sharedMem->sem_segment_lock, 1, 1) == -1) + { + m_errorText = "Semaphores lock init failed"; + Destroy(); + return false; + } + + m_sharedMem->inited = true; + } + + m_created = true; + + return true; +} + +bool CSharedMemControlPosix::Destroy() +{ + if (!m_created) + return true; + + m_created = false; + + if (m_creator) + { + sem_destroy(&m_sharedMem->sem_segment_to_caller); + sem_destroy(&m_sharedMem->sem_segment_to_target); + sem_destroy(&m_sharedMem->sem_segment_lock); + } + + munmap(m_sharedMem, sizeof(apiShareData)); + m_sharedMem = nullptr; + + int fd = shm_unlink(GetIdentifier().c_str()); + if (fd == -1) + { + m_errorText = "Shared memory failed to unlink"; + return false; + } + + m_fd = -1; + + return true; +} + +int64_t CSharedMemControlPosix::GetPID() const +{ + return static_cast(getpid()); +} + +bool CSharedMemControlPosix::Lock_Caller() +{ + int err = sem_wait(&m_sharedMem->sem_segment_to_caller); + if (err != 0) + { + m_errorText = "Caller lock failed"; + return false; + } + + return true; +} + +void CSharedMemControlPosix::Unlock_Caller() +{ + sem_post(&m_sharedMem->sem_segment_to_caller); +} + +bool CSharedMemControlPosix::Lock_Target() +{ + int err = sem_wait(&m_sharedMem->sem_segment_to_target); + if (err != 0) + { + m_errorText = "Target lock failed"; + return false; + } + + return true; +} + +void CSharedMemControlPosix::Unlock_Target() +{ + sem_post(&m_sharedMem->sem_segment_to_target); +} + +bool CSharedMemControlPosix::Lock() +{ + int err = sem_wait(&m_sharedMem->sem_segment_lock); + if (err != 0) + { + m_errorText = "Target lock failed"; + return false; + } + + return true; +} + +void CSharedMemControlPosix::Unlock() +{ + sem_post(&m_sharedMem->sem_segment_lock); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.h b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.h new file mode 100644 index 0000000000000..694a8a2e92cff --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/*---AUTO_GEN_PARSE<$$CORE_SYSTEM_NAME:linux,freebsd,android,osx,darwin_embedded>---*/ + +#pragma once + +#include "SharedMemControl.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CSharedMemControlPosix : public CSharedMemControl +{ +public: + CSharedMemControlPosix(const std::string& identifier, size_t size = SHARED_DEFAULT_MEM_SIZE); + ~CSharedMemControlPosix() override; + + bool Create(bool initial) override; + bool Destroy() override; + + int64_t GetPID() const override; + + bool Lock_Caller() override; + void Unlock_Caller() override; + + bool Lock_Target() override; + void Unlock_Target() override; + + bool Lock() override; + void Unlock() override; + +private: + int m_fd{-1}; + bool m_creator{false}; + bool m_created{false}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h new file mode 100644 index 0000000000000..bf72d762fd0d1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h @@ -0,0 +1,373 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/audiodecoder.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_AUDIODECODER_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_AUDIODECODER_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1 + can_operate_file; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_INIT_V1 init; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1 read_pcm; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_SEEK_V1 seek; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1 read_tag; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1 track_count; /*---AUTO---*/ +} KODI_ADDON_AUDIODECODER_FUNC_V1_TO_V1; + +union KODI_ADDON_AUDIODECODER_FUNC_UNION +{ + struct KODI_ADDON_AUDIODECODER_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_AudioEngineDataFormat +#define MSGPACK_ADD_ENUM_AudioEngineDataFormat +MSGPACK_ADD_ENUM(AudioEngineDataFormat); +#endif +#ifndef MSGPACK_ADD_ENUM_AudioEngineChannel +#define MSGPACK_ADD_ENUM_AudioEngineChannel +MSGPACK_ADD_ENUM(AudioEngineChannel); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + + +struct directFuncToKodi_addoninstance_audiodecoder_h +{ + void* thisClassHdl; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_AUDIODECODER_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1)( + void*, const KODI_ADDON_AUDIODECODER_HDL, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_INIT_V1)( + void*, + const KODI_ADDON_AUDIODECODER_HDL, + const char*, + unsigned int, + int*, + int*, + int*, + int64_t*, + int*, + enum AudioEngineDataFormat*, + enum AudioEngineChannel[AUDIOENGINE_CH_MAX]); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_READ_TAG_V1)( + void*, + const KODI_ADDON_AUDIODECODER_HDL, + const char*, + struct KODI_ADDON_AUDIODECODER_INFO_TAG*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_READ_PCM_V1)( + void*, const KODI_ADDON_AUDIODECODER_HDL, uint8_t*, size_t, size_t*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( + void*, const KODI_ADDON_AUDIODECODER_HDL, const char*); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_SEEK_V1)( + void*, const KODI_ADDON_AUDIODECODER_HDL, int64_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_DESTROY_V1)( + void*, KODI_ADDON_AUDIODECODER_HDL); + +struct directFuncToAddon_addoninstance_audiodecoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1 kodi_addon_audiodecoder_can_operate_file_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_CREATE_V1 kodi_addon_audiodecoder_create_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_DESTROY_V1 kodi_addon_audiodecoder_destroy_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_INIT_V1 kodi_addon_audiodecoder_init_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_READ_PCM_V1 kodi_addon_audiodecoder_read_pcm_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_READ_TAG_V1 kodi_addon_audiodecoder_read_tag_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_SEEK_V1 kodi_addon_audiodecoder_seek_v1; + PFN_INT_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1 kodi_addon_audiodecoder_track_count_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_KODI_ADDON_AUDIODECODER_INFO_TAG +{ + IFC_KODI_ADDON_AUDIODECODER_INFO_TAG() = default; + IFC_KODI_ADDON_AUDIODECODER_INFO_TAG(const KODI_ADDON_AUDIODECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->title) + title = c_data->title; + if (c_data->artist) + artist = c_data->artist; + if (c_data->album) + album = c_data->album; + if (c_data->album_artist) + album_artist = c_data->album_artist; + if (c_data->media_type) + media_type = c_data->media_type; + if (c_data->genre) + genre = c_data->genre; + duration = c_data->duration; + track = c_data->track; + disc = c_data->disc; + if (c_data->disc_subtitle) + disc_subtitle = c_data->disc_subtitle; + disc_total = c_data->disc_total; + if (c_data->release_date) + release_date = c_data->release_date; + if (c_data->lyrics) + lyrics = c_data->lyrics; + samplerate = c_data->samplerate; + channels = c_data->channels; + bitrate = c_data->bitrate; + if (c_data->comment) + comment = c_data->comment; + if (c_data->cover_art_path) + cover_art_path = c_data->cover_art_path; + if (c_data->cover_art_mem_mimetype) + cover_art_mem_mimetype = c_data->cover_art_mem_mimetype; + cover_art_mem_size = c_data->cover_art_mem_size; + } + + static inline void CleanCStructure(KODI_ADDON_AUDIODECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->title) + { + free(c_data->title); + c_data->title = nullptr; + } + if (c_data->artist) + { + free(c_data->artist); + c_data->artist = nullptr; + } + if (c_data->album) + { + free(c_data->album); + c_data->album = nullptr; + } + if (c_data->album_artist) + { + free(c_data->album_artist); + c_data->album_artist = nullptr; + } + if (c_data->media_type) + { + free(c_data->media_type); + c_data->media_type = nullptr; + } + if (c_data->genre) + { + free(c_data->genre); + c_data->genre = nullptr; + } + if (c_data->disc_subtitle) + { + free(c_data->disc_subtitle); + c_data->disc_subtitle = nullptr; + } + if (c_data->release_date) + { + free(c_data->release_date); + c_data->release_date = nullptr; + } + if (c_data->lyrics) + { + free(c_data->lyrics); + c_data->lyrics = nullptr; + } + if (c_data->comment) + { + free(c_data->comment); + c_data->comment = nullptr; + } + if (c_data->cover_art_path) + { + free(c_data->cover_art_path); + c_data->cover_art_path = nullptr; + } + if (c_data->cover_art_mem_mimetype) + { + free(c_data->cover_art_mem_mimetype); + c_data->cover_art_mem_mimetype = nullptr; + } + } + + void SetCStructure(KODI_ADDON_AUDIODECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + if (!title.empty()) + c_data->title = strdup(title.c_str()); + if (!artist.empty()) + c_data->artist = strdup(artist.c_str()); + if (!album.empty()) + c_data->album = strdup(album.c_str()); + if (!album_artist.empty()) + c_data->album_artist = strdup(album_artist.c_str()); + if (!media_type.empty()) + c_data->media_type = strdup(media_type.c_str()); + if (!genre.empty()) + c_data->genre = strdup(genre.c_str()); + c_data->duration = duration; + c_data->track = track; + c_data->disc = disc; + if (!disc_subtitle.empty()) + c_data->disc_subtitle = strdup(disc_subtitle.c_str()); + c_data->disc_total = disc_total; + if (!release_date.empty()) + c_data->release_date = strdup(release_date.c_str()); + if (!lyrics.empty()) + c_data->lyrics = strdup(lyrics.c_str()); + c_data->samplerate = samplerate; + c_data->channels = channels; + c_data->bitrate = bitrate; + if (!comment.empty()) + c_data->comment = strdup(comment.c_str()); + if (!cover_art_path.empty()) + c_data->cover_art_path = strdup(cover_art_path.c_str()); + if (!cover_art_mem_mimetype.empty()) + c_data->cover_art_mem_mimetype = strdup(cover_art_mem_mimetype.c_str()); + c_data->cover_art_mem_size = cover_art_mem_size; + } + + std::string title; + std::string artist; + std::string album; + std::string album_artist; + std::string media_type; + std::string genre; + int duration; + int track; + int disc; + std::string disc_subtitle; + int disc_total; + std::string release_date; + std::string lyrics; + int samplerate; + int channels; + int bitrate; + std::string comment; + std::string cover_art_path; + std::string cover_art_mem_mimetype; + size_t cover_art_mem_size; + + MSGPACK_DEFINE(title, + artist, + album, + album_artist, + media_type, + genre, + duration, + track, + disc, + disc_subtitle, + disc_total, + release_date, + lyrics, + samplerate, + channels, + bitrate, + comment, + cover_art_path, + cover_art_mem_mimetype, + cover_art_mem_size); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_audiodecoder_h : int +{ + funcParent_addoninstance_audiodecoder_h_dummy +} funcParent_addoninstance_audiodecoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_audiodecoder_h : int +{ + funcChild_kodi_addon_audiodecoder_create_v1, + funcChild_kodi_addon_audiodecoder_destroy_v1, + funcChild_kodi_addon_audiodecoder_can_operate_file_v1, + funcChild_kodi_addon_audiodecoder_init_v1, + funcChild_kodi_addon_audiodecoder_read_pcm_v1, + funcChild_kodi_addon_audiodecoder_seek_v1, + funcChild_kodi_addon_audiodecoder_read_tag_v1, + funcChild_kodi_addon_audiodecoder_track_count_v1, +} funcChild_addoninstance_audiodecoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_AUDIODECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CREATE_V1)( KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_DESTROY_V1)( KODI_ADDON_AUDIODECODER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_destroy_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_CAN_OPERATE_FILE_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_can_operate_file_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_INIT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, unsigned int filecache, int* channels, int* samplerate, int* bitspersample, int64_t* totaltime, int* bitrate, enum AudioEngineDataFormat* format, enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]); +typedef std::tuple> msgChild__IN_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ +typedef std::tuple> msgChild_OUT_kodi_addon_audiodecoder_init_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_PCM_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, uint8_t* buffer, size_t size, size_t* actualsize); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_audiodecoder_read_pcm_v1; /* Autogenerated */ +// Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SEEK_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, int64_t time); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_seek_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_READ_TAG_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file, struct KODI_ADDON_AUDIODECODER_INFO_TAG* tag); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_read_tag_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_track_count_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h new file mode 100644 index 0000000000000..5206ae54c53c1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/audioencoder.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_AUDIOENCODER_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIOENCODER_START_V1 start; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1 encode; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1 finish; /*---AUTO---*/ +} KODI_ADDON_AUDIOENCODER_FUNC_V1_TO_V1; + +union KODI_ADDON_AUDIOENCODER_FUNC_UNION +{ + struct KODI_ADDON_AUDIOENCODER_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_SEEK_V1)(void*, + KODI_OWN_HDL, + size_t, + int); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_WRITE_V1)(void*, + KODI_OWN_HDL, + const uint8_t*, + size_t); + +struct directFuncToKodi_addoninstance_audioencoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_AUDIOENCODER_SEEK_V1 kodi_addon_audioencoder_seek_v1; + PFN_INT_KODI_ADDON_AUDIOENCODER_WRITE_V1 kodi_addon_audioencoder_write_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_AUDIOENCODER_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_FINISH_V1)( + void*, KODI_ADDON_AUDIOENCODER_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_START_V1)( + void*, KODI_ADDON_AUDIOENCODER_HDL, const struct AUDIOENCODER_INFO_TAG*); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_ENCODE_V1)( + void*, KODI_ADDON_AUDIOENCODER_HDL, const uint8_t*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_DESTROY_V1)( + void*, KODI_ADDON_AUDIOENCODER_HDL); + +struct directFuncToAddon_addoninstance_audioencoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_AUDIOENCODER_CREATE_V1 kodi_addon_audioencoder_create_v1; + PFN_INT_KODI_ADDON_AUDIOENCODER_DESTROY_V1 kodi_addon_audioencoder_destroy_v1; + PFN_INT_KODI_ADDON_AUDIOENCODER_ENCODE_V1 kodi_addon_audioencoder_encode_v1; + PFN_INT_KODI_ADDON_AUDIOENCODER_FINISH_V1 kodi_addon_audioencoder_finish_v1; + PFN_INT_KODI_ADDON_AUDIOENCODER_START_V1 kodi_addon_audioencoder_start_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_AUDIOENCODER_INFO_TAG +{ + IFC_AUDIOENCODER_INFO_TAG() = default; + IFC_AUDIOENCODER_INFO_TAG(const AUDIOENCODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->title) + title = c_data->title; + if (c_data->artist) + artist = c_data->artist; + if (c_data->album) + album = c_data->album; + if (c_data->album_artist) + album_artist = c_data->album_artist; + if (c_data->media_type) + media_type = c_data->media_type; + if (c_data->genre) + genre = c_data->genre; + duration = c_data->duration; + track = c_data->track; + disc = c_data->disc; + if (c_data->disc_subtitle) + disc_subtitle = c_data->disc_subtitle; + disc_total = c_data->disc_total; + if (c_data->release_date) + release_date = c_data->release_date; + if (c_data->lyrics) + lyrics = c_data->lyrics; + samplerate = c_data->samplerate; + channels = c_data->channels; + bits_per_sample = c_data->bits_per_sample; + track_length = c_data->track_length; + if (c_data->comment) + comment = c_data->comment; + } + + void SetCStructure(AUDIOENCODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + c_data->title = title.c_str(); + c_data->artist = artist.c_str(); + c_data->album = album.c_str(); + c_data->album_artist = album_artist.c_str(); + c_data->media_type = media_type.c_str(); + c_data->genre = genre.c_str(); + c_data->duration = duration; + c_data->track = track; + c_data->disc = disc; + c_data->disc_subtitle = disc_subtitle.c_str(); + c_data->disc_total = disc_total; + c_data->release_date = release_date.c_str(); + c_data->lyrics = lyrics.c_str(); + c_data->samplerate = samplerate; + c_data->channels = channels; + c_data->bits_per_sample = bits_per_sample; + c_data->track_length = track_length; + c_data->comment = comment.c_str(); + } + + std::string title; + std::string artist; + std::string album; + std::string album_artist; + std::string media_type; + std::string genre; + int duration; + int track; + int disc; + std::string disc_subtitle; + int disc_total; + std::string release_date; + std::string lyrics; + int samplerate; + int channels; + int bits_per_sample; + int track_length; + std::string comment; + + MSGPACK_DEFINE(title, + artist, + album, + album_artist, + media_type, + genre, + duration, + track, + disc, + disc_subtitle, + disc_total, + release_date, + lyrics, + samplerate, + channels, + bits_per_sample, + track_length, + comment); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_audioencoder_h : int +{ + funcParent_kodi_addon_audioencoder_write_v1, + funcParent_kodi_addon_audioencoder_seek_v1, +} funcParent_addoninstance_audioencoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_OWN_HDL hdl, const uint8_t* data, size_t len) __INTRODUCED_IN_KODI(1); +typedef std::tuple, size_t> msgParent__IN_kodi_addon_audioencoder_write_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_write_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_OWN_HDL hdl, size_t pos, int whence) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_audioencoder_seek_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_audioencoder_h : int +{ + funcChild_kodi_addon_audioencoder_create_v1, + funcChild_kodi_addon_audioencoder_destroy_v1, + funcChild_kodi_addon_audioencoder_start_v1, + funcChild_kodi_addon_audioencoder_encode_v1, + funcChild_kodi_addon_audioencoder_finish_v1, +} funcChild_addoninstance_audioencoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_AUDIOENCODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_audioencoder_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_DESTROY_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_destroy_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct AUDIOENCODER_INFO_TAG* tag); +typedef std::tuple msgChild__IN_kodi_addon_audioencoder_start_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_start_v1; /* Autogenerated */ +// Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const uint8_t* pbt_stream, size_t num_bytes_read); +typedef std::tuple, size_t> msgChild__IN_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_encode_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audioencoder_finish_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/game.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/game.h new file mode 100644 index 0000000000000..ff165ec1b8c61 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/game.h @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/game.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_GAME_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_GAME_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_LOAD_GAME_V1 load_game; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1 load_game_special; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_LOAD_STANDALONE_V1 load_standalone; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_UNLOAD_GAME_V1 unload_game; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_GET_GAME_TIMING_V1 get_game_timing; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_GET_REGION_V1 get_region; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1 requires_game_loop; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RUN_FRAME_V1 run_frame; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RESET_V1 reset; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1 hw_context_reset; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1 hw_context_destroy; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_HAS_FEATURE_V1 has_feature; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_GET_TOPOLOGY_V1 get_topology; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_FREE_TOPOLOGY_V1 free_topology; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1 + set_controller_layouts; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1 enable_keyboard; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_ENABLE_MOUSE_V1 enable_mouse; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1 connect_controller; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_INPUT_EVENT_V1 input_event; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_SERIALIZE_SIZE_V1 serialize_size; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_SERIALIZE_V1 serialize; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_DESERIALIZE_V1 deserialize; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_CHEAT_RESET_V1 cheat_reset; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_GET_MEMORY_V1 get_memory; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_SET_CHEAT_V1 set_cheat; /*---AUTO---*/ +} KODI_ADDON_GAME_FUNC_V1_TO_V1; + +union KODI_ADDON_GAME_FUNC_UNION +{ + struct KODI_ADDON_GAME_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_GAME_STREAM_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_OPEN_STREAM_V1)( + void*, KODI_OWN_HDL, const struct game_stream_properties*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1)( + void*, + KODI_OWN_HDL, + KODI_GAME_STREAM_HANDLE, + unsigned int, + unsigned int, + struct game_stream_buffer*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_INPUT_EVENT_V1)( + void*, KODI_OWN_HDL, const struct game_input_event*); +typedef game_proc_address_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_HW_GET_PROC_ADDRESS_V1)( + void*, KODI_OWN_HDL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_ADD_STREAM_DATA_V1)( + void*, KODI_OWN_HDL, KODI_GAME_STREAM_HANDLE, const struct game_stream_packet*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CLOSE_STREAM_V1)(void*, + KODI_OWN_HDL, + KODI_GAME_STREAM_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CLOSE_V1)(void*, KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1)( + void*, KODI_OWN_HDL, KODI_GAME_STREAM_HANDLE, struct game_stream_buffer*); + +struct directFuncToKodi_addoninstance_game_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_GAME_ADD_STREAM_DATA_V1 kodi_addon_game_add_stream_data_v1; + PFN_INT_KODI_ADDON_GAME_CLOSE_STREAM_V1 kodi_addon_game_close_stream_v1; + PFN_INT_KODI_ADDON_GAME_CLOSE_V1 kodi_addon_game_close_v1; + PFN_INT_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1 kodi_addon_game_get_stream_buffer_v1; + PFN_INT_KODI_ADDON_GAME_INPUT_EVENT_V1 kodi_addon_game_input_event_v1; + PFN_INT_KODI_ADDON_GAME_OPEN_STREAM_V1 kodi_addon_game_open_stream_v1; + PFN_INT_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1 kodi_addon_game_release_stream_buffer_v1; + PFN_INT_KODI_ADDON_HW_GET_PROC_ADDRESS_V1 kodi_addon_hw_get_proc_address_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_GAME_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CREATE_V1)(void*, + KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1)( + void*, const KODI_ADDON_GAME_HDL, bool, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1)( + void*, const KODI_ADDON_GAME_HDL, bool, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_ENABLE_MOUSE_V1)(void*, + const KODI_ADDON_GAME_HDL, + bool, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_HAS_FEATURE_V1)(void*, + const KODI_ADDON_GAME_HDL, + const char*, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_INPUT_EVENT_V1)( + void*, const KODI_ADDON_GAME_HDL, const struct game_input_event*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CHEAT_RESET_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_DESERIALIZE_V1)( + void*, const KODI_ADDON_GAME_HDL, const uint8_t*, size_t); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_GAME_TIMING_V1)( + void*, const KODI_ADDON_GAME_HDL, struct game_system_timing*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_MEMORY_V1)( + void*, const KODI_ADDON_GAME_HDL, enum GAME_MEMORY, uint8_t**, size_t*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1)( + void*, const KODI_ADDON_GAME_HDL, enum SPECIAL_GAME_TYPE, const char**, size_t); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_LOAD_GAME_V1)( + void*, const KODI_ADDON_GAME_HDL, const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_LOAD_STANDALONE_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RESET_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RUN_FRAME_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_SERIALIZE_V1)( + void*, const KODI_ADDON_GAME_HDL, uint8_t*, size_t); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_SET_CHEAT_V1)( + void*, const KODI_ADDON_GAME_HDL, unsigned int, bool, const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_UNLOAD_GAME_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef enum GAME_REGION(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_REGION_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef size_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_SERIALIZE_SIZE_V1)( + void*, const KODI_ADDON_GAME_HDL); +typedef struct game_input_topology*( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_TOPOLOGY_V1)(void*, const KODI_ADDON_GAME_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_DESTROY_V1)(void*, KODI_ADDON_GAME_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_FREE_TOPOLOGY_V1)( + void*, const KODI_ADDON_GAME_HDL, struct game_input_topology*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1)( + void*, const KODI_ADDON_GAME_HDL, const struct game_controller_layout*, size_t); + +struct directFuncToAddon_addoninstance_game_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_GAME_CHEAT_RESET_V1 kodi_addon_game_cheat_reset_v1; + PFN_INT_KODI_ADDON_GAME_CONNECT_CONTROLLER_V1 kodi_addon_game_connect_controller_v1; + PFN_INT_KODI_ADDON_GAME_CREATE_V1 kodi_addon_game_create_v1; + PFN_INT_KODI_ADDON_GAME_DESERIALIZE_V1 kodi_addon_game_deserialize_v1; + PFN_INT_KODI_ADDON_GAME_DESTROY_V1 kodi_addon_game_destroy_v1; + PFN_INT_KODI_ADDON_GAME_ENABLE_KEYBOARD_V1 kodi_addon_game_enable_keyboard_v1; + PFN_INT_KODI_ADDON_GAME_ENABLE_MOUSE_V1 kodi_addon_game_enable_mouse_v1; + PFN_INT_KODI_ADDON_GAME_FREE_TOPOLOGY_V1 kodi_addon_game_free_topology_v1; + PFN_INT_KODI_ADDON_GAME_GET_GAME_TIMING_V1 kodi_addon_game_get_game_timing_v1; + PFN_INT_KODI_ADDON_GAME_GET_MEMORY_V1 kodi_addon_game_get_memory_v1; + PFN_INT_KODI_ADDON_GAME_GET_REGION_V1 kodi_addon_game_get_region_v1; + PFN_INT_KODI_ADDON_GAME_GET_TOPOLOGY_V1 kodi_addon_game_get_topology_v1; + PFN_INT_KODI_ADDON_GAME_HAS_FEATURE_V1 kodi_addon_game_has_feature_v1; + PFN_INT_KODI_ADDON_GAME_HW_CONTEXT_DESTROY_V1 kodi_addon_game_hw_context_destroy_v1; + PFN_INT_KODI_ADDON_GAME_HW_CONTEXT_RESET_V1 kodi_addon_game_hw_context_reset_v1; + PFN_INT_KODI_ADDON_GAME_INPUT_EVENT_V1 kodi_addon_game_input_event_v1; + PFN_INT_KODI_ADDON_GAME_LOAD_GAME_SPECIAL_V1 kodi_addon_game_load_game_special_v1; + PFN_INT_KODI_ADDON_GAME_LOAD_GAME_V1 kodi_addon_game_load_game_v1; + PFN_INT_KODI_ADDON_GAME_LOAD_STANDALONE_V1 kodi_addon_game_load_standalone_v1; + PFN_INT_KODI_ADDON_GAME_REQUIRES_GAME_LOOP_V1 kodi_addon_game_requires_game_loop_v1; + PFN_INT_KODI_ADDON_GAME_RESET_V1 kodi_addon_game_reset_v1; + PFN_INT_KODI_ADDON_GAME_RUN_FRAME_V1 kodi_addon_game_run_frame_v1; + PFN_INT_KODI_ADDON_GAME_SERIALIZE_SIZE_V1 kodi_addon_game_serialize_size_v1; + PFN_INT_KODI_ADDON_GAME_SERIALIZE_V1 kodi_addon_game_serialize_v1; + PFN_INT_KODI_ADDON_GAME_SET_CHEAT_V1 kodi_addon_game_set_cheat_v1; + PFN_INT_KODI_ADDON_GAME_SET_CONTROLLER_LAYOUTS_V1 kodi_addon_game_set_controller_layouts_v1; + PFN_INT_KODI_ADDON_GAME_UNLOAD_GAME_V1 kodi_addon_game_unload_game_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_game_h : int +{ + funcParent_addoninstance_game_h_dummy +} funcParent_addoninstance_game_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_game_h : int +{ + funcChild_addoninstance_game_h_dummy +} funcChild_addoninstance_game_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h new file mode 100644 index 0000000000000..546ed72d69e51 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/imagedecoder.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_IMAGEDECODER_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1 + load_image_from_memory; /*---AUTO---*/ + PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1 decode; /*---AUTO---*/ +} KODI_ADDON_IMAGEDECODER_FUNC_V1_TO_V1; + +union KODI_ADDON_IMAGEDECODER_FUNC_UNION +{ + struct KODI_ADDON_IMAGEDECODER_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_FMT +#define MSGPACK_ADD_ENUM_ADDON_IMG_FMT +MSGPACK_ADD_ENUM(ADDON_IMG_FMT); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_MIMETYPE_V1)(void*, KODI_OWN_HDL); + +struct directFuncToKodi_addoninstance_imagedecoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_IMAGEDECODER_MIMETYPE_V1 kodi_addon_imagedecoder_mimetype_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_IMAGEDECODER_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_DECODE_V1)( + void*, + KODI_ADDON_IMAGEDECODER_HDL, + uint8_t*, + size_t, + unsigned int, + unsigned int, + unsigned int, + enum ADDON_IMG_FMT); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)( + void*, KODI_ADDON_IMAGEDECODER_HDL, const uint8_t*, size_t, unsigned int*, unsigned int*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_DESTROY_V1)( + void*, KODI_ADDON_IMAGEDECODER_HDL); + +struct directFuncToAddon_addoninstance_imagedecoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_IMAGEDECODER_CREATE_V1 kodi_addon_imagedecoder_create_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_DECODE_V1 kodi_addon_imagedecoder_decode_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_DESTROY_V1 kodi_addon_imagedecoder_destroy_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1 + kodi_addon_imagedecoder_load_image_from_memory_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_imagedecoder_h : int +{ + funcParent_kodi_addon_imagedecoder_mimetype_v1, +} funcParent_addoninstance_imagedecoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_imagedecoder_mimetype(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_imagedecoder_mimetype_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_imagedecoder_h : int +{ + funcChild_kodi_addon_imagedecoder_create_v1, + funcChild_kodi_addon_imagedecoder_destroy_v1, + funcChild_kodi_addon_imagedecoder_load_image_from_memory_v1, + funcChild_kodi_addon_imagedecoder_decode_v1, +} funcChild_addoninstance_imagedecoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_IMAGEDECODER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DESTROY_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_destroy_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)( KODI_ADDON_IMAGEDECODER_HDL hdl, const uint8_t* buffer, size_t buf_size, unsigned int* width, unsigned int* height); +typedef std::tuple, size_t, unsigned int, unsigned int> msgChild__IN_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_load_image_from_memory_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1)(KODI_ADDON_IMAGEDECODER_HDL hdl, uint8_t* pixels, size_t pixels_size, unsigned int width, unsigned int height, unsigned int pitch, enum ADDON_IMG_FMT format); +typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ +typedef std::tuple> msgChild_OUT_kodi_addon_imagedecoder_decode_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h new file mode 100644 index 0000000000000..6a44bcad34aca --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/inputstream.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_INPUTSTREAM_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_OPEN_V1 open; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_CLOSE_V1 close; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1 get_path_list; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1 get_capabilities; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1 get_stream_ids; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1 get_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1 enable_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1 open_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1 demux_reset; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1 demux_abort; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1 demux_flush; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1 demux_read; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1 demux_seek_time; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1 demux_set_speed; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1 + set_video_resolution; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1 get_total_time; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_TIME_V1 get_time; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1 get_times; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_POS_TIME_V1 pos_time; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1 read_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1 seek_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1 position_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1 length_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1 + is_real_time_stream; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1 get_chapter; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1 + get_chapter_count; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1 get_chapter_name; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1 get_chapter_pos; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1 seek_chapter; /*---AUTO---*/ + PFN_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1 + block_size_stream; /*---AUTO---*/ +} KODI_ADDON_INPUTSTREAM_FUNC_V1_TO_V1; + +union KODI_ADDON_INPUTSTREAM_FUNC_UNION +{ + struct KODI_ADDON_INPUTSTREAM_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef struct DEMUX_PACKET*( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_ALLOCATE_DEMUX_PACKET_V1)(void*, + KODI_OWN_HDL, + int); +typedef struct DEMUX_PACKET*( + ATTR_INT_APIENTRYP + PFN_INT_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1)(void*, + KODI_OWN_HDL, + unsigned int, + unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1)( + void*, KODI_OWN_HDL, struct DEMUX_PACKET*); + +struct directFuncToKodi_addoninstance_inputstream_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_INPUTSTREAM_ALLOCATE_DEMUX_PACKET_V1 + kodi_addon_inputstream_allocate_demux_packet_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1 + kodi_addon_inputstream_allocate_encrypted_demux_packet_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1 kodi_addon_inputstream_free_demux_packet_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_INPUTSTREAM_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, double, bool, double*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, struct INPUTSTREAM_IDS*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1)( + void*, + const KODI_ADDON_INPUTSTREAM_HDL, + int, + struct INPUTSTREAM_INFO*, + KODI_OWN_HDL*, + PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, struct INPUTSTREAM_TIMES*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_OPEN_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, struct INPUTSTREAM_PROPERTY*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_POS_TIME_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int); +typedef const char*( + ATTR_INT_APIENTRYP + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1)(void*, + const KODI_ADDON_INPUTSTREAM_HDL, + int); +typedef const char*( + ATTR_INT_APIENTRYP + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1)(void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TIME_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, uint8_t*, unsigned int); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int64_t, int); +typedef struct DEMUX_PACKET*( + ATTR_INT_APIENTRYP + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1)(void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_CLOSE_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_DESTROY_V1)( + void*, KODI_ADDON_INPUTSTREAM_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, struct INPUTSTREAM_CAPABILITIES*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1)( + void*, const KODI_ADDON_INPUTSTREAM_HDL, int, int); + +struct directFuncToAddon_addoninstance_inputstream_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_INPUTSTREAM_BLOCK_SIZE_STREAM_V1 kodi_addon_inputstream_block_size_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_CLOSE_V1 kodi_addon_inputstream_close_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_CREATE_V1 kodi_addon_inputstream_create_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_ABORT_V1 kodi_addon_inputstream_demux_abort_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_FLUSH_V1 kodi_addon_inputstream_demux_flush_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_READ_V1 kodi_addon_inputstream_demux_read_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_RESET_V1 kodi_addon_inputstream_demux_reset_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_SEEK_TIME_V1 kodi_addon_inputstream_demux_seek_time_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DEMUX_SET_SPEED_V1 kodi_addon_inputstream_demux_set_speed_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_DESTROY_V1 kodi_addon_inputstream_destroy_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_ENABLE_STREAM_V1 kodi_addon_inputstream_enable_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CAPABILITIES_V1 kodi_addon_inputstream_get_capabilities_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_COUNT_V1 kodi_addon_inputstream_get_chapter_count_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_NAME_V1 kodi_addon_inputstream_get_chapter_name_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_POS_V1 kodi_addon_inputstream_get_chapter_pos_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_CHAPTER_V1 kodi_addon_inputstream_get_chapter_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_PATH_LIST_V1 kodi_addon_inputstream_get_path_list_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_STREAM_IDS_V1 kodi_addon_inputstream_get_stream_ids_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_STREAM_V1 kodi_addon_inputstream_get_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TIMES_V1 kodi_addon_inputstream_get_times_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TIME_V1 kodi_addon_inputstream_get_time_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_GET_TOTAL_TIME_V1 kodi_addon_inputstream_get_total_time_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_IS_REAL_TIME_STREAM_V1 + kodi_addon_inputstream_is_real_time_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_LENGTH_STREAM_V1 kodi_addon_inputstream_length_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_OPEN_STREAM_V1 kodi_addon_inputstream_open_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_OPEN_V1 kodi_addon_inputstream_open_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_POSITION_STREAM_V1 kodi_addon_inputstream_position_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_POS_TIME_V1 kodi_addon_inputstream_pos_time_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_READ_STREAM_V1 kodi_addon_inputstream_read_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_SEEK_CHAPTER_V1 kodi_addon_inputstream_seek_chapter_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_SEEK_STREAM_V1 kodi_addon_inputstream_seek_stream_v1; + PFN_INT_KODI_ADDON_INPUTSTREAM_SET_VIDEO_RESOLUTION_V1 + kodi_addon_inputstream_set_video_resolution_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_inputstream_h : int +{ + funcParent_addoninstance_inputstream_h_dummy +} funcParent_addoninstance_inputstream_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_inputstream_h : int +{ + funcChild_addoninstance_inputstream_h_dummy +} funcChild_addoninstance_inputstream_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h new file mode 100644 index 0000000000000..4f19514970a88 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/peripheral.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_PERIPHERAL_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_PERIPHERAL_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1 get_capabilities; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1 + perform_device_scan; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1 + free_scan_results; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1 get_events; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1 free_events; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1 send_event; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1 + get_joystick_info; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1 + free_joystick_info; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1 get_features; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1 free_features; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1 map_features; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1 + get_ignored_primitives; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1 free_primitives; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1 + set_ignored_primitives; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1 save_button_map; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1 + revert_button_map; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1 reset_button_map; /*---AUTO---*/ + PFN_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1 + power_off_joystick; /*---AUTO---*/ +} KODI_ADDON_PERIPHERAL_FUNC_V1_TO_V1; + +union KODI_ADDON_PERIPHERAL_FUNC_UNION +{ + struct KODI_ADDON_PERIPHERAL_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef enum JOYSTICK_FEATURE_TYPE( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FEATURE_TYPE_V1)(void*, + KODI_OWN_HDL, + const char*, + const char*); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1)( + void*, KODI_OWN_HDL, const char*, enum JOYSTICK_FEATURE_TYPE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1)(void*, + KODI_OWN_HDL, + const char*, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1)(void*, KODI_OWN_HDL); + +struct directFuncToKodi_addoninstance_peripheral_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1 kodi_addon_peripheral_feature_count_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FEATURE_TYPE_V1 kodi_addon_peripheral_feature_type_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1 kodi_addon_peripheral_refresh_button_maps_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1 kodi_addon_peripheral_trigger_scan_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_PERIPHERAL_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, const struct PERIPHERAL_EVENT*); +typedef enum PERIPHERAL_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct PERIPHERAL_EVENT**, size_t*); +typedef enum PERIPHERAL_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1)( + void*, + KODI_ADDON_PERIPHERAL_HDL, + const struct JOYSTICK_INFO*, + const char*, + struct JOYSTICK_FEATURE**, + size_t*); +typedef enum PERIPHERAL_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1)( + void*, + KODI_ADDON_PERIPHERAL_HDL, + const struct JOYSTICK_INFO*, + struct JOYSTICK_DRIVER_PRIMITIVE**, + size_t*); +typedef enum PERIPHERAL_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, unsigned int, struct JOYSTICK_INFO*); +typedef enum PERIPHERAL_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1)( + void*, + KODI_ADDON_PERIPHERAL_HDL, + const struct JOYSTICK_INFO*, + const char*, + const struct JOYSTICK_FEATURE*, + size_t); +typedef enum PERIPHERAL_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct PERIPHERAL_INFO**, size_t*); +typedef enum PERIPHERAL_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1)( + void*, + KODI_ADDON_PERIPHERAL_HDL, + const struct JOYSTICK_INFO*, + const struct JOYSTICK_DRIVER_PRIMITIVE*, + size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_DESTROY_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct PERIPHERAL_EVENT*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct JOYSTICK_FEATURE*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct JOYSTICK_INFO*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct JOYSTICK_DRIVER_PRIMITIVE*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct PERIPHERAL_INFO*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, struct PERIPHERAL_CAPABILITIES*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, const struct JOYSTICK_INFO*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, const struct JOYSTICK_INFO*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1)( + void*, KODI_ADDON_PERIPHERAL_HDL, const struct JOYSTICK_INFO*); + +struct directFuncToAddon_addoninstance_peripheral_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_PERIPHERAL_CREATE_V1 kodi_addon_peripheral_create_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_DESTROY_V1 kodi_addon_peripheral_destroy_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FREE_EVENTS_V1 kodi_addon_peripheral_free_events_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FREE_FEATURES_V1 kodi_addon_peripheral_free_features_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FREE_JOYSTICK_INFO_V1 kodi_addon_peripheral_free_joystick_info_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FREE_PRIMITIVES_V1 kodi_addon_peripheral_free_primitives_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_FREE_SCAN_RESULTS_V1 kodi_addon_peripheral_free_scan_results_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_GET_CAPABILITIES_V1 kodi_addon_peripheral_get_capabilities_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_GET_EVENTS_V1 kodi_addon_peripheral_get_events_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_GET_FEATURES_V1 kodi_addon_peripheral_get_features_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_GET_IGNORED_PRIMITIVES_V1 + kodi_addon_peripheral_get_ignored_primitives_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_GET_JOYSTICK_INFO_V1 kodi_addon_peripheral_get_joystick_info_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_MAP_FEATURES_V1 kodi_addon_peripheral_map_features_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_PERFORM_DEVICE_SCAN_V1 kodi_addon_peripheral_perform_device_scan_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_POWER_OFF_JOYSTICK_V1 kodi_addon_peripheral_power_off_joystick_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_RESET_BUTTON_MAP_V1 kodi_addon_peripheral_reset_button_map_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_REVERT_BUTTON_MAP_V1 kodi_addon_peripheral_revert_button_map_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_SAVE_BUTTON_MAP_V1 kodi_addon_peripheral_save_button_map_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_SEND_EVENT_V1 kodi_addon_peripheral_send_event_v1; + PFN_INT_KODI_ADDON_PERIPHERAL_SET_IGNORED_PRIMITIVES_V1 + kodi_addon_peripheral_set_ignored_primitives_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_peripheral_h : int +{ + funcParent_addoninstance_peripheral_h_dummy +} funcParent_addoninstance_peripheral_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_peripheral_h : int +{ + funcChild_addoninstance_peripheral_h_dummy +} funcChild_addoninstance_peripheral_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h new file mode 100644 index 0000000000000..ae19056dd7058 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h @@ -0,0 +1,732 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/pvr.h" +#include "src/shared/SharedGroups.h" +#include "src/shared/api/addon-instance/pvr/pvr_channel_groups.h" +#include "src/shared/api/addon-instance/pvr/pvr_channels.h" +#include "src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/api/addon-instance/pvr/pvr_edl.h" +#include "src/shared/api/addon-instance/pvr/pvr_epg.h" +#include "src/shared/api/addon-instance/pvr/pvr_general.h" +#include "src/shared/api/addon-instance/pvr/pvr_menu_hook.h" +#include "src/shared/api/addon-instance/pvr/pvr_providers.h" +#include "src/shared/api/addon-instance/pvr/pvr_recordings.h" +#include "src/shared/api/addon-instance/pvr/pvr_timers.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_PVR_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1 get_capabilities; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1 get_backend_name; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1 get_backend_version; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1 get_backend_hostname; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1 + get_connection_string; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1 get_drive_space; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1 + call_settings_menu_hook; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1 get_channels_amount; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNELS_V1 get_channels; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1 + get_channel_stream_properties; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1 get_signal_status; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1 get_descramble_info; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1 get_providers_amount; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1 get_providers; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1 + get_channel_groups_amount; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1 get_channel_groups; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1 + get_channel_group_members; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1 delete_channel; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1 rename_channel; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1 + open_dialog_channel_settings; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1 + open_dialog_channel_add; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1 + open_dialog_channel_scan; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1 + call_channel_menu_hook; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1 get_epg_for_channel; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1 + is_epg_tag_recordable; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1 is_epg_tag_playable; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1 get_epg_tag_edl; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1 + get_epg_tag_stream_properties; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1 + set_epg_max_past_days; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1 + set_epg_max_future_days; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1 call_epg_menu_hook; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1 + get_recordings_amount; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1 get_recordings; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1 delete_recording; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1 undelete_recording; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1 + delete_all_recordings_from_trash; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1 rename_recording; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1 + set_recording_lifetime; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1 + set_recording_play_count; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1 + set_recording_last_played_position; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1 + get_recording_last_played_position; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1 get_recording_edl; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1 get_recording_size; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1 + get_recording_stream_properties; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1 + call_recording_menu_hook; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1 get_timer_types; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1 get_timers_amount; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_GET_TIMERS_V1 get_timers; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_ADD_TIMER_V1 add_timer; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_DELETE_TIMER_V1 delete_timer; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1 update_timer; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1 call_timer_menu_hook; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1 on_system_sleep; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1 on_system_wake; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1 + on_power_saving_activated; /*---AUTO---*/ + PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1 + on_power_saving_deactivated; /*---AUTO---*/ +} KODI_ADDON_PVR_FUNC_V1_TO_V1; + +union KODI_ADDON_PVR_FUNC_UNION +{ + struct KODI_ADDON_PVR_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_ERROR +#define MSGPACK_ADD_ENUM_PVR_ERROR +MSGPACK_ADD_ENUM(PVR_ERROR); +#endif +#ifndef MSGPACK_ADD_ENUM_PVR_CONNECTION_STATE +#define MSGPACK_ADD_ENUM_PVR_CONNECTION_STATE +MSGPACK_ADD_ENUM(PVR_CONNECTION_STATE); +#endif +#ifndef MSGPACK_ADD_ENUM_EPG_EVENT_STATE +#define MSGPACK_ADD_ENUM_EPG_EVENT_STATE +MSGPACK_ADD_ENUM(EPG_EVENT_STATE); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_MAX_FUTURE_DAYS_V1)(void*, + KODI_OWN_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1)(void*, + KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ADD_MENU_HOOK_V1)( + void*, KODI_OWN_HDL, const struct PVR_MENUHOOK*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1)( + void*, KODI_OWN_HDL, const char*, enum PVR_CONNECTION_STATE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_EPG_EVENT_STATE_CHANGE_V1)( + void*, KODI_OWN_HDL, struct EPG_TAG*, enum EPG_EVENT_STATE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1)( + void*, KODI_OWN_HDL, const char*, const char*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_MEMBER_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL_GROUP_MEMBER*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL_GROUP*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_EPG_ENTRY_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct EPG_TAG*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_PROVIDER_ENTRY_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_PROVIDER*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_RECORDING_ENTRY_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_RECORDING*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_TIMER_ENTRY_V1)( + void*, KODI_OWN_HDL, const KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_TIMER*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_CHANNEL_GROUPS_UPDATE_V1)( + void*, KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1)(void*, + KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1)(void*, + KODI_OWN_HDL, + unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1)(void*, + KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1)(void*, + KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1)(void*, + KODI_OWN_HDL); + +struct directFuncToKodi_addoninstance_pvr_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_PVR_ADD_MENU_HOOK_V1 kodi_addon_pvr_add_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1 kodi_addon_pvr_connection_state_change_v1; + PFN_INT_KODI_ADDON_PVR_EPG_EVENT_STATE_CHANGE_V1 kodi_addon_pvr_epg_event_state_change_v1; + PFN_INT_KODI_ADDON_PVR_GET_EPG_MAX_FUTURE_DAYS_V1 kodi_addon_pvr_get_epg_max_future_days_v1; + PFN_INT_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1 kodi_addon_pvr_get_epg_max_past_days_v1; + PFN_INT_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1 kodi_addon_pvr_recording_notification_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1 kodi_addon_pvr_transfer_channel_entry_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_MEMBER_V1 + kodi_addon_pvr_transfer_channel_group_member_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_GROUP_V1 kodi_addon_pvr_transfer_channel_group_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_EPG_ENTRY_V1 kodi_addon_pvr_transfer_epg_entry_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_PROVIDER_ENTRY_V1 kodi_addon_pvr_transfer_provider_entry_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_RECORDING_ENTRY_V1 kodi_addon_pvr_transfer_recording_entry_v1; + PFN_INT_KODI_ADDON_PVR_TRANSFER_TIMER_ENTRY_V1 kodi_addon_pvr_transfer_timer_entry_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_CHANNEL_GROUPS_UPDATE_V1 + kodi_addon_pvr_trigger_channel_groups_update_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1 kodi_addon_pvr_trigger_channel_update_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1 kodi_addon_pvr_trigger_epg_update_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1 kodi_addon_pvr_trigger_providers_update_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1 kodi_addon_pvr_trigger_recording_update_v1; + PFN_INT_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1 kodi_addon_pvr_trigger_timer_update_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ADD_TIMER_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_TIMER*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_MENUHOOK*, const struct PVR_CHANNEL*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_MENUHOOK*, const struct EPG_TAG*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_MENUHOOK*, const struct PVR_RECORDING*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_MENUHOOK*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_MENUHOOK*, const struct PVR_TIMER*); +typedef enum PVR_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_DELETE_CHANNEL_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_CHANNEL*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_DELETE_RECORDING_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_DELETE_TIMER_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_TIMER*, bool); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1)( + void*, KODI_ADDON_PVR_HDL, char*, size_t); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_BACKEND_NAME_V1)( + void*, KODI_ADDON_PVR_HDL, char*, size_t); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1)( + void*, KODI_ADDON_PVR_HDL, char*, size_t); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CAPABILITIES_V1)( + void*, KODI_ADDON_PVR_HDL, struct PVR_ADDON_CAPABILITIES*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1)( + void*, KODI_ADDON_PVR_HDL, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNELS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL, bool); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1)( + void*, KODI_ADDON_PVR_HDL, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL, bool); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL, const struct PVR_CHANNEL_GROUP*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_CHANNEL*, struct PVR_NAMED_VALUE*, size_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1)( + void*, KODI_ADDON_PVR_HDL, char*, size_t); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1)( + void*, KODI_ADDON_PVR_HDL, int, struct PVR_DESCRAMBLE_INFO*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1)( + void*, KODI_ADDON_PVR_HDL, uint64_t*, uint64_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL, int, time_t, time_t); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1)( + void*, KODI_ADDON_PVR_HDL, const struct EPG_TAG*, struct PVR_EDL_ENTRY[], size_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1)( + void*, KODI_ADDON_PVR_HDL, const struct EPG_TAG*, struct PVR_NAMED_VALUE*, size_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1)( + void*, KODI_ADDON_PVR_HDL, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_PROVIDERS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1)( + void*, KODI_ADDON_PVR_HDL, bool, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDINGS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL, bool); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDING_EDL_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, struct PVR_EDL_ENTRY[], size_t*); +typedef enum PVR_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, int64_t*); +typedef enum PVR_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, struct PVR_NAMED_VALUE*, size_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1)( + void*, KODI_ADDON_PVR_HDL, int, struct PVR_SIGNAL_STATUS*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1)( + void*, KODI_ADDON_PVR_HDL, int*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_TIMERS_V1)( + void*, KODI_ADDON_PVR_HDL, KODI_ADDON_PVR_TRANSFER_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_TIMER_TYPES_V1)( + void*, KODI_ADDON_PVR_HDL, struct PVR_TIMER_TYPE[], size_t*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1)( + void*, KODI_ADDON_PVR_HDL, const struct EPG_TAG*, bool*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1)( + void*, KODI_ADDON_PVR_HDL, const struct EPG_TAG*, bool*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_CHANNEL*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1)( + void*, KODI_ADDON_PVR_HDL); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_CHANNEL*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_RENAME_CHANNEL_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_CHANNEL*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_RENAME_RECORDING_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1)( + void*, KODI_ADDON_PVR_HDL, int); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1)( + void*, KODI_ADDON_PVR_HDL, int); +typedef enum PVR_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, int); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*, int); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_UNDELETE_RECORDING_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_RECORDING*); +typedef enum PVR_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_UPDATE_TIMER_V1)( + void*, KODI_ADDON_PVR_HDL, const struct PVR_TIMER*); + +struct directFuncToAddon_addoninstance_pvr_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_PVR_ADD_TIMER_V1 kodi_addon_pvr_add_timer_v1; + PFN_INT_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1 kodi_addon_pvr_call_channel_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1 kodi_addon_pvr_call_epg_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1 kodi_addon_pvr_call_recording_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1 kodi_addon_pvr_call_settings_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1 kodi_addon_pvr_call_timer_menu_hook_v1; + PFN_INT_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1 + kodi_addon_pvr_delete_all_recordings_from_trash_v1; + PFN_INT_KODI_ADDON_PVR_DELETE_CHANNEL_V1 kodi_addon_pvr_delete_channel_v1; + PFN_INT_KODI_ADDON_PVR_DELETE_RECORDING_V1 kodi_addon_pvr_delete_recording_v1; + PFN_INT_KODI_ADDON_PVR_DELETE_TIMER_V1 kodi_addon_pvr_delete_timer_v1; + PFN_INT_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1 kodi_addon_pvr_get_backend_hostname_v1; + PFN_INT_KODI_ADDON_PVR_GET_BACKEND_NAME_V1 kodi_addon_pvr_get_backend_name_v1; + PFN_INT_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1 kodi_addon_pvr_get_backend_version_v1; + PFN_INT_KODI_ADDON_PVR_GET_CAPABILITIES_V1 kodi_addon_pvr_get_capabilities_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1 kodi_addon_pvr_get_channels_amount_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNELS_V1 kodi_addon_pvr_get_channels_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1 kodi_addon_pvr_get_channel_groups_amount_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1 kodi_addon_pvr_get_channel_groups_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1 kodi_addon_pvr_get_channel_group_members_v1; + PFN_INT_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1 + kodi_addon_pvr_get_channel_stream_properties_v1; + PFN_INT_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1 kodi_addon_pvr_get_connection_string_v1; + PFN_INT_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1 kodi_addon_pvr_get_descramble_info_v1; + PFN_INT_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1 kodi_addon_pvr_get_drive_space_v1; + PFN_INT_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1 kodi_addon_pvr_get_epg_for_channel_v1; + PFN_INT_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1 kodi_addon_pvr_get_epg_tag_edl_v1; + PFN_INT_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1 + kodi_addon_pvr_get_epg_tag_stream_properties_v1; + PFN_INT_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1 kodi_addon_pvr_get_providers_amount_v1; + PFN_INT_KODI_ADDON_PVR_GET_PROVIDERS_V1 kodi_addon_pvr_get_providers_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1 kodi_addon_pvr_get_recordings_amount_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDINGS_V1 kodi_addon_pvr_get_recordings_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDING_EDL_V1 kodi_addon_pvr_get_recording_edl_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1 + kodi_addon_pvr_get_recording_last_played_position_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1 kodi_addon_pvr_get_recording_size_v1; + PFN_INT_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1 + kodi_addon_pvr_get_recording_stream_properties_v1; + PFN_INT_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1 kodi_addon_pvr_get_signal_status_v1; + PFN_INT_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1 kodi_addon_pvr_get_timers_amount_v1; + PFN_INT_KODI_ADDON_PVR_GET_TIMERS_V1 kodi_addon_pvr_get_timers_v1; + PFN_INT_KODI_ADDON_PVR_GET_TIMER_TYPES_V1 kodi_addon_pvr_get_timer_types_v1; + PFN_INT_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1 kodi_addon_pvr_is_epg_tag_playable_v1; + PFN_INT_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1 kodi_addon_pvr_is_epg_tag_recordable_v1; + PFN_INT_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1 kodi_addon_pvr_on_power_saving_activated_v1; + PFN_INT_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1 + kodi_addon_pvr_on_power_saving_deactivated_v1; + PFN_INT_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1 kodi_addon_pvr_on_system_sleep_v1; + PFN_INT_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1 kodi_addon_pvr_on_system_wake_v1; + PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1 kodi_addon_pvr_open_dialog_channel_add_v1; + PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1 kodi_addon_pvr_open_dialog_channel_scan_v1; + PFN_INT_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1 + kodi_addon_pvr_open_dialog_channel_settings_v1; + PFN_INT_KODI_ADDON_PVR_RENAME_CHANNEL_V1 kodi_addon_pvr_rename_channel_v1; + PFN_INT_KODI_ADDON_PVR_RENAME_RECORDING_V1 kodi_addon_pvr_rename_recording_v1; + PFN_INT_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1 kodi_addon_pvr_set_epg_max_future_days_v1; + PFN_INT_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1 kodi_addon_pvr_set_epg_max_past_days_v1; + PFN_INT_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1 + kodi_addon_pvr_set_recording_last_played_position_v1; + PFN_INT_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1 kodi_addon_pvr_set_recording_lifetime_v1; + PFN_INT_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1 kodi_addon_pvr_set_recording_play_count_v1; + PFN_INT_KODI_ADDON_PVR_UNDELETE_RECORDING_V1 kodi_addon_pvr_undelete_recording_v1; + PFN_INT_KODI_ADDON_PVR_UPDATE_TIMER_V1 kodi_addon_pvr_update_timer_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_pvr_h : int +{ + funcParent_kodi_addon_pvr_get_epg_max_future_days_v1, + funcParent_kodi_addon_pvr_get_epg_max_past_days_v1, + funcParent_kodi_addon_pvr_add_menu_hook_v1, + funcParent_kodi_addon_pvr_recording_notification_v1, + funcParent_kodi_addon_pvr_connection_state_change_v1, + funcParent_kodi_addon_pvr_epg_event_state_change_v1, + funcParent_kodi_addon_pvr_transfer_channel_entry_v1, + funcParent_kodi_addon_pvr_transfer_provider_entry_v1, + funcParent_kodi_addon_pvr_transfer_channel_group_v1, + funcParent_kodi_addon_pvr_transfer_channel_group_member_v1, + funcParent_kodi_addon_pvr_transfer_epg_entry_v1, + funcParent_kodi_addon_pvr_transfer_recording_entry_v1, + funcParent_kodi_addon_pvr_transfer_timer_entry_v1, + funcParent_kodi_addon_pvr_trigger_channel_update_v1, + funcParent_kodi_addon_pvr_trigger_providers_update_v1, + funcParent_kodi_addon_pvr_trigger_channel_groups_update_v1, + funcParent_kodi_addon_pvr_trigger_epg_update_v1, + funcParent_kodi_addon_pvr_trigger_recording_update_v1, + funcParent_kodi_addon_pvr_trigger_timer_update_v1, +} funcParent_addoninstance_pvr_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_future_days_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_get_epg_max_past_days_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_OWN_HDL hdl, const struct PVR_MENUHOOK* hook) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_add_menu_hook_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_OWN_HDL hdl, const char* name, const char* fileName, bool on) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_recording_notification_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_connection_state_change(KODI_OWN_HDL hdl, const char* strConnectionString, enum PVR_CONNECTION_STATE newState, const char* strMessage) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_connection_state_change_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_epg_event_state_change(KODI_OWN_HDL hdl, struct EPG_TAG* tag, enum EPG_EVENT_STATE newState) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_epg_event_state_change_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL* chan) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_entry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_provider_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_PROVIDER* chanProvider) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_provider_entry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_channel_group_member( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP_MEMBER* member) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_channel_group_member_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_epg_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct EPG_TAG* epgentry) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_epg_entry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_recording_entry( KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_RECORDING* recording) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_recording_entry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_transfer_timer_entry(KODI_OWN_HDL hdl, const KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_TIMER* timer) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_transfer_timer_entry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_update_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_providers_update_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_channel_groups_update_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_OWN_HDL hdl, unsigned int iChannelUid) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_epg_update_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_recording_update_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_pvr_trigger_timer_update_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_pvr_h : int +{ + funcChild_kodi_addon_pvr_get_capabilities_v1, + funcChild_kodi_addon_pvr_get_backend_name_v1, + funcChild_kodi_addon_pvr_get_backend_version_v1, + funcChild_kodi_addon_pvr_get_backend_hostname_v1, + funcChild_kodi_addon_pvr_get_connection_string_v1, + funcChild_kodi_addon_pvr_get_drive_space_v1, + funcChild_kodi_addon_pvr_call_settings_menu_hook_v1, + funcChild_kodi_addon_pvr_get_channels_amount_v1, + funcChild_kodi_addon_pvr_get_channels_v1, + funcChild_kodi_addon_pvr_get_channel_stream_properties_v1, + funcChild_kodi_addon_pvr_get_signal_status_v1, + funcChild_kodi_addon_pvr_get_descramble_info_v1, + funcChild_kodi_addon_pvr_get_providers_amount_v1, + funcChild_kodi_addon_pvr_get_providers_v1, + funcChild_kodi_addon_pvr_get_channel_groups_amount_v1, + funcChild_kodi_addon_pvr_get_channel_groups_v1, + funcChild_kodi_addon_pvr_get_channel_group_members_v1, + funcChild_kodi_addon_pvr_delete_channel_v1, + funcChild_kodi_addon_pvr_rename_channel_v1, + funcChild_kodi_addon_pvr_open_dialog_channel_settings_v1, + funcChild_kodi_addon_pvr_open_dialog_channel_add_v1, + funcChild_kodi_addon_pvr_open_dialog_channel_scan_v1, + funcChild_kodi_addon_pvr_call_channel_menu_hook_v1, + funcChild_kodi_addon_pvr_get_epg_for_channel_v1, + funcChild_kodi_addon_pvr_is_epg_tag_recordable_v1, + funcChild_kodi_addon_pvr_is_epg_tag_playable_v1, + funcChild_kodi_addon_pvr_get_epg_tag_edl_v1, + funcChild_kodi_addon_pvr_get_epg_tag_stream_properties_v1, + funcChild_kodi_addon_pvr_set_epg_max_past_days_v1, + funcChild_kodi_addon_pvr_set_epg_max_future_days_v1, + funcChild_kodi_addon_pvr_call_epg_menu_hook_v1, + funcChild_kodi_addon_pvr_get_recordings_amount_v1, + funcChild_kodi_addon_pvr_get_recordings_v1, + funcChild_kodi_addon_pvr_delete_recording_v1, + funcChild_kodi_addon_pvr_undelete_recording_v1, + funcChild_kodi_addon_pvr_delete_all_recordings_from_trash_v1, + funcChild_kodi_addon_pvr_rename_recording_v1, + funcChild_kodi_addon_pvr_set_recording_lifetime_v1, + funcChild_kodi_addon_pvr_set_recording_play_count_v1, + funcChild_kodi_addon_pvr_set_recording_last_played_position_v1, + funcChild_kodi_addon_pvr_get_recording_last_played_position_v1, + funcChild_kodi_addon_pvr_get_recording_edl_v1, + funcChild_kodi_addon_pvr_get_recording_size_v1, + funcChild_kodi_addon_pvr_get_recording_stream_properties_v1, + funcChild_kodi_addon_pvr_call_recording_menu_hook_v1, + funcChild_kodi_addon_pvr_get_timer_types_v1, + funcChild_kodi_addon_pvr_get_timers_amount_v1, + funcChild_kodi_addon_pvr_get_timers_v1, + funcChild_kodi_addon_pvr_add_timer_v1, + funcChild_kodi_addon_pvr_delete_timer_v1, + funcChild_kodi_addon_pvr_update_timer_v1, + funcChild_kodi_addon_pvr_call_timer_menu_hook_v1, + funcChild_kodi_addon_pvr_on_system_sleep_v1, + funcChild_kodi_addon_pvr_on_system_wake_v1, + funcChild_kodi_addon_pvr_on_power_saving_activated_v1, + funcChild_kodi_addon_pvr_on_power_saving_deactivated_v1, +} funcChild_addoninstance_pvr_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CAPABILITIES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_ADDON_CAPABILITIES* capabilities); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_capabilities_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_NAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_name_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_VERSION_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_version_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_BACKEND_HOSTNAME_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_backend_hostname_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CONNECTION_STRING_V1)( KODI_ADDON_PVR_HDL hdl, char* str, size_t mem_size); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_connection_string_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DRIVE_SPACE_V1)( KODI_ADDON_PVR_HDL hdl, uint64_t* total, uint64_t* used); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_drive_space_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_SETTINGS_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook); +typedef std::tuple msgChild__IN_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_settings_menu_hook_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_amount_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNELS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channels_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel, struct PVR_NAMED_VALUE* properties, size_t* properties_count); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_stream_properties_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_SIGNAL_STATUS_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_SIGNAL_STATUS* signal_status); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_signal_status_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_DESCRAMBLE_INFO_V1)( KODI_ADDON_PVR_HDL hdl, int channel_uid, struct PVR_DESCRAMBLE_INFO* descramble_info); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_descramble_info_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_amount_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_PROVIDERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_providers_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_amount_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUPS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool radio); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_groups_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_CHANNEL_GROUP_MEMBERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, const struct PVR_CHANNEL_GROUP* group); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_channel_group_members_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); +typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_channel_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); +typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_channel_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SETTINGS_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); +typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_settings_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_ADD_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_CHANNEL* channel); +typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_add_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_OPEN_DIALOG_CHANNEL_SCAN_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_open_dialog_channel_scan_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_CHANNEL_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_CHANNEL* channel); +typedef std::tuple msgChild__IN_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_channel_menu_hook_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_FOR_CHANNEL_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, int channel_uid, time_t start, time_t end); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_for_channel_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_RECORDABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_recordable); +typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_recordable_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_IS_EPG_TAG_PLAYABLE_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, bool* is_playable); +typedef std::tuple msgChild__IN_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_is_epg_tag_playable_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_EDL_ENTRY edl[], size_t* size); +typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_epg_tag_edl_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_TAG_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct EPG_TAG* tag, struct PVR_NAMED_VALUE* properties, size_t* properties_count); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_epg_tag_stream_properties_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_PAST_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int past_days); +typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_past_days_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_EPG_MAX_FUTURE_DAYS_V1)( KODI_ADDON_PVR_HDL hdl, int future_days); +typedef std::tuple msgChild__IN_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_epg_max_future_days_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_EPG_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct EPG_TAG* tag); +typedef std::tuple msgChild__IN_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_epg_menu_hook_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, bool deleted, int* amount); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_amount_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDINGS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle, bool deleted); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recordings_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); +typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_recording_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UNDELETE_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); +typedef std::tuple msgChild__IN_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_undelete_recording_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_ALL_RECORDINGS_FROM_TRASH_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_all_recordings_from_trash_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_RENAME_RECORDING_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); +typedef std::tuple msgChild__IN_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_rename_recording_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LIFETIME_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording); +typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_lifetime_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_PLAY_COUNT_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int count); +typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_play_count_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_SET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int last_played_position); +typedef std::tuple msgChild__IN_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_set_recording_last_played_position_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_LAST_PLAYED_POSITION_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int* last_played_position); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_last_played_position_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_EDL_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_EDL_ENTRY edl[], size_t* size); +typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_recording_edl_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_SIZE_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, int64_t* size); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_size_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_RECORDING_STREAM_PROPERTIES_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_RECORDING* recording, struct PVR_NAMED_VALUE* properties, size_t* properties_count); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_recording_stream_properties_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_RECORDING_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_RECORDING* recording); +typedef std::tuple msgChild__IN_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_recording_menu_hook_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMER_TYPES_V1)( KODI_ADDON_PVR_HDL hdl, struct PVR_TIMER_TYPE types[], size_t* types_count); +typedef std::tuple, size_t> msgChild__IN_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_pvr_get_timer_types_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_AMOUNT_V1)( KODI_ADDON_PVR_HDL hdl, int* amount); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_amount_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_GET_TIMERS_V1)( KODI_ADDON_PVR_HDL hdl, KODI_ADDON_PVR_TRANSFER_HDL handle); +typedef std::tuple msgChild__IN_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_get_timers_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ADD_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); +typedef std::tuple msgChild__IN_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_add_timer_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_DELETE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer, bool force_delete); +typedef std::tuple msgChild__IN_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_delete_timer_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_UPDATE_TIMER_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_TIMER* timer); +typedef std::tuple msgChild__IN_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_update_timer_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_CALL_TIMER_MENU_HOOK_V1)( KODI_ADDON_PVR_HDL hdl, const struct PVR_MENUHOOK* menuhook, const struct PVR_TIMER* timer); +typedef std::tuple msgChild__IN_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_call_timer_menu_hook_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_SLEEP_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_sleep_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_SYSTEM_WAKE_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_system_wake_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_ACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_activated_v1; /* Autogenerated */ +// Original API call: typedef enum PVR_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_PVR_ON_POWER_SAVING_DEACTIVATED_V1)( KODI_ADDON_PVR_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_pvr_on_power_saving_deactivated_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channel_groups.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channel_groups.h new file mode 100644 index 0000000000000..c15999e05c73c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channel_groups.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_channel_groups.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_CHANNEL_GROUP +{ + IFC_PVR_CHANNEL_GROUP() = default; + IFC_PVR_CHANNEL_GROUP(const PVR_CHANNEL_GROUP* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strGroupName.data(), c_data->strGroupName, PVR_ADDON_NAME_STRING_LENGTH); + bIsRadio = c_data->bIsRadio; + iPosition = c_data->iPosition; + } + + void SetCStructure(PVR_CHANNEL_GROUP* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strGroupName, strGroupName.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->bIsRadio = bIsRadio; + c_data->iPosition = iPosition; + } + + std::array strGroupName; + bool bIsRadio; + unsigned int iPosition; + + MSGPACK_DEFINE(strGroupName, bIsRadio, iPosition); +}; + +struct IFC_PVR_CHANNEL_GROUP_MEMBER +{ + IFC_PVR_CHANNEL_GROUP_MEMBER() = default; + IFC_PVR_CHANNEL_GROUP_MEMBER(const PVR_CHANNEL_GROUP_MEMBER* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strGroupName.data(), c_data->strGroupName, PVR_ADDON_NAME_STRING_LENGTH); + iChannelUniqueId = c_data->iChannelUniqueId; + iChannelNumber = c_data->iChannelNumber; + iSubChannelNumber = c_data->iSubChannelNumber; + iOrder = c_data->iOrder; + } + + void SetCStructure(PVR_CHANNEL_GROUP_MEMBER* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strGroupName, strGroupName.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->iChannelUniqueId = iChannelUniqueId; + c_data->iChannelNumber = iChannelNumber; + c_data->iSubChannelNumber = iSubChannelNumber; + c_data->iOrder = iOrder; + } + + std::array strGroupName; + unsigned int iChannelUniqueId; + unsigned int iChannelNumber; + unsigned int iSubChannelNumber; + int iOrder; + + MSGPACK_DEFINE(strGroupName, iChannelUniqueId, iChannelNumber, iSubChannelNumber, iOrder); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channels.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channels.h new file mode 100644 index 0000000000000..0b5d3ad146b7f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channels.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_channels.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_CHANNEL +{ + IFC_PVR_CHANNEL() = default; + IFC_PVR_CHANNEL(const PVR_CHANNEL* c_data) + { + if (c_data == nullptr) + return; + + iUniqueId = c_data->iUniqueId; + bIsRadio = c_data->bIsRadio; + iChannelNumber = c_data->iChannelNumber; + iSubChannelNumber = c_data->iSubChannelNumber; + memcpy(strChannelName.data(), c_data->strChannelName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strMimeType.data(), c_data->strMimeType, PVR_ADDON_INPUT_FORMAT_STRING_LENGTH); + iEncryptionSystem = c_data->iEncryptionSystem; + memcpy(strIconPath.data(), c_data->strIconPath, PVR_ADDON_URL_STRING_LENGTH); + bIsHidden = c_data->bIsHidden; + bHasArchive = c_data->bHasArchive; + iOrder = c_data->iOrder; + iClientProviderUid = c_data->iClientProviderUid; + } + + void SetCStructure(PVR_CHANNEL* c_data) + { + if (c_data == nullptr) + return; + + c_data->iUniqueId = iUniqueId; + c_data->bIsRadio = bIsRadio; + c_data->iChannelNumber = iChannelNumber; + c_data->iSubChannelNumber = iSubChannelNumber; + memcpy(c_data->strChannelName, strChannelName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strMimeType, strMimeType.data(), PVR_ADDON_INPUT_FORMAT_STRING_LENGTH); + c_data->iEncryptionSystem = iEncryptionSystem; + memcpy(c_data->strIconPath, strIconPath.data(), PVR_ADDON_URL_STRING_LENGTH); + c_data->bIsHidden = bIsHidden; + c_data->bHasArchive = bHasArchive; + c_data->iOrder = iOrder; + c_data->iClientProviderUid = iClientProviderUid; + } + + unsigned int iUniqueId; + bool bIsRadio; + unsigned int iChannelNumber; + unsigned int iSubChannelNumber; + std::array strChannelName; + std::array strMimeType; + unsigned int iEncryptionSystem; + std::array strIconPath; + bool bIsHidden; + bool bHasArchive; + int iOrder; + int iClientProviderUid; + + MSGPACK_DEFINE(iUniqueId, + bIsRadio, + iChannelNumber, + iSubChannelNumber, + strChannelName, + strMimeType, + iEncryptionSystem, + strIconPath, + bIsHidden, + bHasArchive, + iOrder, + iClientProviderUid); +}; + +struct IFC_PVR_SIGNAL_STATUS +{ + IFC_PVR_SIGNAL_STATUS() = default; + IFC_PVR_SIGNAL_STATUS(const PVR_SIGNAL_STATUS* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strAdapterName.data(), c_data->strAdapterName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strAdapterStatus.data(), c_data->strAdapterStatus, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strServiceName.data(), c_data->strServiceName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strProviderName.data(), c_data->strProviderName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strMuxName.data(), c_data->strMuxName, PVR_ADDON_NAME_STRING_LENGTH); + iSNR = c_data->iSNR; + iSignal = c_data->iSignal; + iBER = c_data->iBER; + iUNC = c_data->iUNC; + } + + void SetCStructure(PVR_SIGNAL_STATUS* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strAdapterName, strAdapterName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strAdapterStatus, strAdapterStatus.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strServiceName, strServiceName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strProviderName, strProviderName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strMuxName, strMuxName.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->iSNR = iSNR; + c_data->iSignal = iSignal; + c_data->iBER = iBER; + c_data->iUNC = iUNC; + } + + std::array strAdapterName; + std::array strAdapterStatus; + std::array strServiceName; + std::array strProviderName; + std::array strMuxName; + int iSNR; + int iSignal; + long iBER; + long iUNC; + + MSGPACK_DEFINE(strAdapterName, + strAdapterStatus, + strServiceName, + strProviderName, + strMuxName, + iSNR, + iSignal, + iBER, + iUNC); +}; + +struct IFC_PVR_DESCRAMBLE_INFO +{ + IFC_PVR_DESCRAMBLE_INFO() = default; + IFC_PVR_DESCRAMBLE_INFO(const PVR_DESCRAMBLE_INFO* c_data) + { + if (c_data == nullptr) + return; + + iPid = c_data->iPid; + iCaid = c_data->iCaid; + iProvid = c_data->iProvid; + iEcmTime = c_data->iEcmTime; + iHops = c_data->iHops; + memcpy(strCardSystem.data(), c_data->strCardSystem, PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(strReader.data(), c_data->strReader, PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(strFrom.data(), c_data->strFrom, PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(strProtocol.data(), c_data->strProtocol, PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + } + + void SetCStructure(PVR_DESCRAMBLE_INFO* c_data) + { + if (c_data == nullptr) + return; + + c_data->iPid = iPid; + c_data->iCaid = iCaid; + c_data->iProvid = iProvid; + c_data->iEcmTime = iEcmTime; + c_data->iHops = iHops; + memcpy(c_data->strCardSystem, strCardSystem.data(), PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(c_data->strReader, strReader.data(), PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(c_data->strFrom, strFrom.data(), PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + memcpy(c_data->strProtocol, strProtocol.data(), PVR_ADDON_DESCRAMBLE_INFO_STRING_LENGTH); + } + + int iPid; + int iCaid; + int iProvid; + int iEcmTime; + int iHops; + std::array strCardSystem; + std::array strReader; + std::array strFrom; + std::array strProtocol; + + MSGPACK_DEFINE( + iPid, iCaid, iProvid, iEcmTime, iHops, strCardSystem, strReader, strFrom, strProtocol); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_defines.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_defines.h new file mode 100644 index 0000000000000..af889ec5ebde7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_defines.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_defines.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_NAMED_VALUE +{ + IFC_PVR_NAMED_VALUE() = default; + IFC_PVR_NAMED_VALUE(const PVR_NAMED_VALUE* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strName.data(), c_data->strName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strValue.data(), c_data->strValue, PVR_ADDON_NAME_STRING_LENGTH); + } + + void SetCStructure(PVR_NAMED_VALUE* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strName, strName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strValue, strValue.data(), PVR_ADDON_NAME_STRING_LENGTH); + } + + std::array strName; + std::array strValue; + + MSGPACK_DEFINE(strName, strValue); +}; + +struct IFC_PVR_ATTRIBUTE_INT_VALUE +{ + IFC_PVR_ATTRIBUTE_INT_VALUE() = default; + IFC_PVR_ATTRIBUTE_INT_VALUE(const PVR_ATTRIBUTE_INT_VALUE* c_data) + { + if (c_data == nullptr) + return; + + iValue = c_data->iValue; + memcpy(strDescription.data(), c_data->strDescription, PVR_ADDON_ATTRIBUTE_DESC_LENGTH); + } + + void SetCStructure(PVR_ATTRIBUTE_INT_VALUE* c_data) + { + if (c_data == nullptr) + return; + + c_data->iValue = iValue; + memcpy(c_data->strDescription, strDescription.data(), PVR_ADDON_ATTRIBUTE_DESC_LENGTH); + } + + int iValue; + std::array strDescription; + + MSGPACK_DEFINE(iValue, strDescription); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_edl.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_edl.h new file mode 100644 index 0000000000000..af76011859579 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_edl.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_edl.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_EDL_TYPE +#define MSGPACK_ADD_ENUM_PVR_EDL_TYPE +MSGPACK_ADD_ENUM(PVR_EDL_TYPE); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_EDL_ENTRY +{ + IFC_PVR_EDL_ENTRY() = default; + IFC_PVR_EDL_ENTRY(const PVR_EDL_ENTRY* c_data) + { + if (c_data == nullptr) + return; + + start = c_data->start; + end = c_data->end; + type = c_data->type; + } + + void SetCStructure(PVR_EDL_ENTRY* c_data) + { + if (c_data == nullptr) + return; + + c_data->start = start; + c_data->end = end; + c_data->type = type; + } + + int64_t start; + int64_t end; + enum PVR_EDL_TYPE type; + + MSGPACK_DEFINE(start, end, type); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_epg.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_epg.h new file mode 100644 index 0000000000000..5490ba0b6e776 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_epg.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_epg.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_EPG_TAG +{ + IFC_EPG_TAG() = default; + IFC_EPG_TAG(const EPG_TAG* c_data) + { + if (c_data == nullptr) + return; + + iUniqueBroadcastId = c_data->iUniqueBroadcastId; + iUniqueChannelId = c_data->iUniqueChannelId; + if (c_data->strTitle) + strTitle = c_data->strTitle; + startTime = c_data->startTime; + endTime = c_data->endTime; + if (c_data->strPlotOutline) + strPlotOutline = c_data->strPlotOutline; + if (c_data->strPlot) + strPlot = c_data->strPlot; + if (c_data->strOriginalTitle) + strOriginalTitle = c_data->strOriginalTitle; + if (c_data->strCast) + strCast = c_data->strCast; + if (c_data->strDirector) + strDirector = c_data->strDirector; + if (c_data->strWriter) + strWriter = c_data->strWriter; + iYear = c_data->iYear; + if (c_data->strIMDBNumber) + strIMDBNumber = c_data->strIMDBNumber; + if (c_data->strIconPath) + strIconPath = c_data->strIconPath; + iGenreType = c_data->iGenreType; + iGenreSubType = c_data->iGenreSubType; + if (c_data->strGenreDescription) + strGenreDescription = c_data->strGenreDescription; + if (c_data->strFirstAired) + strFirstAired = c_data->strFirstAired; + iParentalRating = c_data->iParentalRating; + if (c_data->strParentalRatingCode) + strParentalRatingCode = c_data->strParentalRatingCode; + iStarRating = c_data->iStarRating; + iSeriesNumber = c_data->iSeriesNumber; + iEpisodeNumber = c_data->iEpisodeNumber; + iEpisodePartNumber = c_data->iEpisodePartNumber; + if (c_data->strEpisodeName) + strEpisodeName = c_data->strEpisodeName; + iFlags = c_data->iFlags; + if (c_data->strSeriesLink) + strSeriesLink = c_data->strSeriesLink; + } + + void SetCStructure(EPG_TAG* c_data) + { + if (c_data == nullptr) + return; + + c_data->iUniqueBroadcastId = iUniqueBroadcastId; + c_data->iUniqueChannelId = iUniqueChannelId; + c_data->strTitle = strTitle.c_str(); + c_data->startTime = startTime; + c_data->endTime = endTime; + c_data->strPlotOutline = strPlotOutline.c_str(); + c_data->strPlot = strPlot.c_str(); + c_data->strOriginalTitle = strOriginalTitle.c_str(); + c_data->strCast = strCast.c_str(); + c_data->strDirector = strDirector.c_str(); + c_data->strWriter = strWriter.c_str(); + c_data->iYear = iYear; + c_data->strIMDBNumber = strIMDBNumber.c_str(); + c_data->strIconPath = strIconPath.c_str(); + c_data->iGenreType = iGenreType; + c_data->iGenreSubType = iGenreSubType; + c_data->strGenreDescription = strGenreDescription.c_str(); + c_data->strFirstAired = strFirstAired.c_str(); + c_data->iParentalRating = iParentalRating; + c_data->strParentalRatingCode = strParentalRatingCode.c_str(); + c_data->iStarRating = iStarRating; + c_data->iSeriesNumber = iSeriesNumber; + c_data->iEpisodeNumber = iEpisodeNumber; + c_data->iEpisodePartNumber = iEpisodePartNumber; + c_data->strEpisodeName = strEpisodeName.c_str(); + c_data->iFlags = iFlags; + c_data->strSeriesLink = strSeriesLink.c_str(); + } + + unsigned int iUniqueBroadcastId; + unsigned int iUniqueChannelId; + std::string strTitle; + time_t startTime; + time_t endTime; + std::string strPlotOutline; + std::string strPlot; + std::string strOriginalTitle; + std::string strCast; + std::string strDirector; + std::string strWriter; + int iYear; + std::string strIMDBNumber; + std::string strIconPath; + int iGenreType; + int iGenreSubType; + std::string strGenreDescription; + std::string strFirstAired; + int iParentalRating; + std::string strParentalRatingCode; + int iStarRating; + int iSeriesNumber; + int iEpisodeNumber; + int iEpisodePartNumber; + std::string strEpisodeName; + unsigned int iFlags; + std::string strSeriesLink; + + MSGPACK_DEFINE(iUniqueBroadcastId, + iUniqueChannelId, + strTitle, + startTime, + endTime, + strPlotOutline, + strPlot, + strOriginalTitle, + strCast, + strDirector, + strWriter, + iYear, + strIMDBNumber, + strIconPath, + iGenreType, + iGenreSubType, + strGenreDescription, + strFirstAired, + iParentalRating, + strParentalRatingCode, + iStarRating, + iSeriesNumber, + iEpisodeNumber, + iEpisodePartNumber, + strEpisodeName, + iFlags, + strSeriesLink); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_general.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_general.h new file mode 100644 index 0000000000000..16f0973bac97c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_general.h @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_general.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_ADDON_CAPABILITIES +{ + IFC_PVR_ADDON_CAPABILITIES() = default; + IFC_PVR_ADDON_CAPABILITIES(const PVR_ADDON_CAPABILITIES* c_data) + { + if (c_data == nullptr) + return; + + bSupportsEPG = c_data->bSupportsEPG; + bSupportsEPGEdl = c_data->bSupportsEPGEdl; + bSupportsTV = c_data->bSupportsTV; + bSupportsRadio = c_data->bSupportsRadio; + bSupportsRecordings = c_data->bSupportsRecordings; + bSupportsRecordingsUndelete = c_data->bSupportsRecordingsUndelete; + bSupportsTimers = c_data->bSupportsTimers; + bSupportsChannelGroups = c_data->bSupportsChannelGroups; + bSupportsChannelScan = c_data->bSupportsChannelScan; + bSupportsChannelSettings = c_data->bSupportsChannelSettings; + bHandlesInputStream = c_data->bHandlesInputStream; + bHandlesDemuxing = c_data->bHandlesDemuxing; + bSupportsRecordingPlayCount = c_data->bSupportsRecordingPlayCount; + bSupportsLastPlayedPosition = c_data->bSupportsLastPlayedPosition; + bSupportsRecordingEdl = c_data->bSupportsRecordingEdl; + bSupportsRecordingsRename = c_data->bSupportsRecordingsRename; + bSupportsRecordingsLifetimeChange = c_data->bSupportsRecordingsLifetimeChange; + bSupportsDescrambleInfo = c_data->bSupportsDescrambleInfo; + bSupportsAsyncEPGTransfer = c_data->bSupportsAsyncEPGTransfer; + bSupportsRecordingSize = c_data->bSupportsRecordingSize; + bSupportsProviders = c_data->bSupportsProviders; + bSupportsRecordingsDelete = c_data->bSupportsRecordingsDelete; + iRecordingsLifetimesSize = c_data->iRecordingsLifetimesSize; + memcpy(recordingsLifetimeValues.data(), c_data->recordingsLifetimeValues, + PVR_ADDON_ATTRIBUTE_VALUES_ARRAY_SIZE); + } + + void SetCStructure(PVR_ADDON_CAPABILITIES* c_data) + { + if (c_data == nullptr) + return; + + c_data->bSupportsEPG = bSupportsEPG; + c_data->bSupportsEPGEdl = bSupportsEPGEdl; + c_data->bSupportsTV = bSupportsTV; + c_data->bSupportsRadio = bSupportsRadio; + c_data->bSupportsRecordings = bSupportsRecordings; + c_data->bSupportsRecordingsUndelete = bSupportsRecordingsUndelete; + c_data->bSupportsTimers = bSupportsTimers; + c_data->bSupportsChannelGroups = bSupportsChannelGroups; + c_data->bSupportsChannelScan = bSupportsChannelScan; + c_data->bSupportsChannelSettings = bSupportsChannelSettings; + c_data->bHandlesInputStream = bHandlesInputStream; + c_data->bHandlesDemuxing = bHandlesDemuxing; + c_data->bSupportsRecordingPlayCount = bSupportsRecordingPlayCount; + c_data->bSupportsLastPlayedPosition = bSupportsLastPlayedPosition; + c_data->bSupportsRecordingEdl = bSupportsRecordingEdl; + c_data->bSupportsRecordingsRename = bSupportsRecordingsRename; + c_data->bSupportsRecordingsLifetimeChange = bSupportsRecordingsLifetimeChange; + c_data->bSupportsDescrambleInfo = bSupportsDescrambleInfo; + c_data->bSupportsAsyncEPGTransfer = bSupportsAsyncEPGTransfer; + c_data->bSupportsRecordingSize = bSupportsRecordingSize; + c_data->bSupportsProviders = bSupportsProviders; + c_data->bSupportsRecordingsDelete = bSupportsRecordingsDelete; + c_data->iRecordingsLifetimesSize = iRecordingsLifetimesSize; + memcpy(c_data->recordingsLifetimeValues, recordingsLifetimeValues.data(), + PVR_ADDON_ATTRIBUTE_VALUES_ARRAY_SIZE); + } + + bool bSupportsEPG; + bool bSupportsEPGEdl; + bool bSupportsTV; + bool bSupportsRadio; + bool bSupportsRecordings; + bool bSupportsRecordingsUndelete; + bool bSupportsTimers; + bool bSupportsChannelGroups; + bool bSupportsChannelScan; + bool bSupportsChannelSettings; + bool bHandlesInputStream; + bool bHandlesDemuxing; + bool bSupportsRecordingPlayCount; + bool bSupportsLastPlayedPosition; + bool bSupportsRecordingEdl; + bool bSupportsRecordingsRename; + bool bSupportsRecordingsLifetimeChange; + bool bSupportsDescrambleInfo; + bool bSupportsAsyncEPGTransfer; + bool bSupportsRecordingSize; + bool bSupportsProviders; + bool bSupportsRecordingsDelete; + unsigned int iRecordingsLifetimesSize; + std::array + recordingsLifetimeValues; + + MSGPACK_DEFINE(bSupportsEPG, + bSupportsEPGEdl, + bSupportsTV, + bSupportsRadio, + bSupportsRecordings, + bSupportsRecordingsUndelete, + bSupportsTimers, + bSupportsChannelGroups, + bSupportsChannelScan, + bSupportsChannelSettings, + bHandlesInputStream, + bHandlesDemuxing, + bSupportsRecordingPlayCount, + bSupportsLastPlayedPosition, + bSupportsRecordingEdl, + bSupportsRecordingsRename, + bSupportsRecordingsLifetimeChange, + bSupportsDescrambleInfo, + bSupportsAsyncEPGTransfer, + bSupportsRecordingSize, + bSupportsProviders, + bSupportsRecordingsDelete, + iRecordingsLifetimesSize, + recordingsLifetimeValues); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_menu_hook.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_menu_hook.h new file mode 100644 index 0000000000000..4f25ca72c0717 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_menu_hook.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_menu_hook.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_MENUHOOK_CAT +#define MSGPACK_ADD_ENUM_PVR_MENUHOOK_CAT +MSGPACK_ADD_ENUM(PVR_MENUHOOK_CAT); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_MENUHOOK +{ + IFC_PVR_MENUHOOK() = default; + IFC_PVR_MENUHOOK(const PVR_MENUHOOK* c_data) + { + if (c_data == nullptr) + return; + + iHookId = c_data->iHookId; + iLocalizedStringId = c_data->iLocalizedStringId; + category = c_data->category; + } + + void SetCStructure(PVR_MENUHOOK* c_data) + { + if (c_data == nullptr) + return; + + c_data->iHookId = iHookId; + c_data->iLocalizedStringId = iLocalizedStringId; + c_data->category = category; + } + + unsigned int iHookId; + unsigned int iLocalizedStringId; + enum PVR_MENUHOOK_CAT category; + + MSGPACK_DEFINE(iHookId, iLocalizedStringId, category); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_providers.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_providers.h new file mode 100644 index 0000000000000..46f011cfff730 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_providers.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_providers.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_PROVIDER_TYPE +#define MSGPACK_ADD_ENUM_PVR_PROVIDER_TYPE +MSGPACK_ADD_ENUM(PVR_PROVIDER_TYPE); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_PROVIDER +{ + IFC_PVR_PROVIDER() = default; + IFC_PVR_PROVIDER(const PVR_PROVIDER* c_data) + { + if (c_data == nullptr) + return; + + iUniqueId = c_data->iUniqueId; + memcpy(strName.data(), c_data->strName, PVR_ADDON_NAME_STRING_LENGTH); + type = c_data->type; + memcpy(strIconPath.data(), c_data->strIconPath, PVR_ADDON_URL_STRING_LENGTH); + memcpy(strCountries.data(), c_data->strCountries, PVR_ADDON_COUNTRIES_STRING_LENGTH); + memcpy(strLanguages.data(), c_data->strLanguages, PVR_ADDON_LANGUAGES_STRING_LENGTH); + } + + void SetCStructure(PVR_PROVIDER* c_data) + { + if (c_data == nullptr) + return; + + c_data->iUniqueId = iUniqueId; + memcpy(c_data->strName, strName.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->type = type; + memcpy(c_data->strIconPath, strIconPath.data(), PVR_ADDON_URL_STRING_LENGTH); + memcpy(c_data->strCountries, strCountries.data(), PVR_ADDON_COUNTRIES_STRING_LENGTH); + memcpy(c_data->strLanguages, strLanguages.data(), PVR_ADDON_LANGUAGES_STRING_LENGTH); + } + + unsigned int iUniqueId; + std::array strName; + enum PVR_PROVIDER_TYPE type; + std::array strIconPath; + std::array strCountries; + std::array strLanguages; + + MSGPACK_DEFINE(iUniqueId, strName, type, strIconPath, strCountries, strLanguages); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_recordings.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_recordings.h new file mode 100644 index 0000000000000..7ab09d097f3a2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_recordings.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_recordings.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_RECORDING_CHANNEL_TYPE +#define MSGPACK_ADD_ENUM_PVR_RECORDING_CHANNEL_TYPE +MSGPACK_ADD_ENUM(PVR_RECORDING_CHANNEL_TYPE); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_RECORDING +{ + IFC_PVR_RECORDING() = default; + IFC_PVR_RECORDING(const PVR_RECORDING* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strRecordingId.data(), c_data->strRecordingId, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strTitle.data(), c_data->strTitle, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strEpisodeName.data(), c_data->strEpisodeName, PVR_ADDON_NAME_STRING_LENGTH); + iSeriesNumber = c_data->iSeriesNumber; + iEpisodeNumber = c_data->iEpisodeNumber; + iYear = c_data->iYear; + memcpy(strDirectory.data(), c_data->strDirectory, PVR_ADDON_URL_STRING_LENGTH); + memcpy(strPlotOutline.data(), c_data->strPlotOutline, PVR_ADDON_DESC_STRING_LENGTH); + memcpy(strPlot.data(), c_data->strPlot, PVR_ADDON_DESC_STRING_LENGTH); + memcpy(strGenreDescription.data(), c_data->strGenreDescription, PVR_ADDON_DESC_STRING_LENGTH); + memcpy(strChannelName.data(), c_data->strChannelName, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strIconPath.data(), c_data->strIconPath, PVR_ADDON_URL_STRING_LENGTH); + memcpy(strThumbnailPath.data(), c_data->strThumbnailPath, PVR_ADDON_URL_STRING_LENGTH); + memcpy(strFanartPath.data(), c_data->strFanartPath, PVR_ADDON_URL_STRING_LENGTH); + recordingTime = c_data->recordingTime; + iDuration = c_data->iDuration; + iPriority = c_data->iPriority; + iLifetime = c_data->iLifetime; + iGenreType = c_data->iGenreType; + iGenreSubType = c_data->iGenreSubType; + iPlayCount = c_data->iPlayCount; + iLastPlayedPosition = c_data->iLastPlayedPosition; + bIsDeleted = c_data->bIsDeleted; + iEpgEventId = c_data->iEpgEventId; + iChannelUid = c_data->iChannelUid; + channelType = c_data->channelType; + memcpy(strFirstAired.data(), c_data->strFirstAired, PVR_ADDON_DATE_STRING_LENGTH); + iFlags = c_data->iFlags; + sizeInBytes = c_data->sizeInBytes; + iClientProviderUid = c_data->iClientProviderUid; + memcpy(strProviderName.data(), c_data->strProviderName, PVR_ADDON_NAME_STRING_LENGTH); + } + + void SetCStructure(PVR_RECORDING* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strRecordingId, strRecordingId.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strTitle, strTitle.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strEpisodeName, strEpisodeName.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->iSeriesNumber = iSeriesNumber; + c_data->iEpisodeNumber = iEpisodeNumber; + c_data->iYear = iYear; + memcpy(c_data->strDirectory, strDirectory.data(), PVR_ADDON_URL_STRING_LENGTH); + memcpy(c_data->strPlotOutline, strPlotOutline.data(), PVR_ADDON_DESC_STRING_LENGTH); + memcpy(c_data->strPlot, strPlot.data(), PVR_ADDON_DESC_STRING_LENGTH); + memcpy(c_data->strGenreDescription, strGenreDescription.data(), PVR_ADDON_DESC_STRING_LENGTH); + memcpy(c_data->strChannelName, strChannelName.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strIconPath, strIconPath.data(), PVR_ADDON_URL_STRING_LENGTH); + memcpy(c_data->strThumbnailPath, strThumbnailPath.data(), PVR_ADDON_URL_STRING_LENGTH); + memcpy(c_data->strFanartPath, strFanartPath.data(), PVR_ADDON_URL_STRING_LENGTH); + c_data->recordingTime = recordingTime; + c_data->iDuration = iDuration; + c_data->iPriority = iPriority; + c_data->iLifetime = iLifetime; + c_data->iGenreType = iGenreType; + c_data->iGenreSubType = iGenreSubType; + c_data->iPlayCount = iPlayCount; + c_data->iLastPlayedPosition = iLastPlayedPosition; + c_data->bIsDeleted = bIsDeleted; + c_data->iEpgEventId = iEpgEventId; + c_data->iChannelUid = iChannelUid; + c_data->channelType = channelType; + memcpy(c_data->strFirstAired, strFirstAired.data(), PVR_ADDON_DATE_STRING_LENGTH); + c_data->iFlags = iFlags; + c_data->sizeInBytes = sizeInBytes; + c_data->iClientProviderUid = iClientProviderUid; + memcpy(c_data->strProviderName, strProviderName.data(), PVR_ADDON_NAME_STRING_LENGTH); + } + + std::array strRecordingId; + std::array strTitle; + std::array strEpisodeName; + int iSeriesNumber; + int iEpisodeNumber; + int iYear; + std::array strDirectory; + std::array strPlotOutline; + std::array strPlot; + std::array strGenreDescription; + std::array strChannelName; + std::array strIconPath; + std::array strThumbnailPath; + std::array strFanartPath; + time_t recordingTime; + int iDuration; + int iPriority; + int iLifetime; + int iGenreType; + int iGenreSubType; + int iPlayCount; + int iLastPlayedPosition; + bool bIsDeleted; + unsigned int iEpgEventId; + int iChannelUid; + enum PVR_RECORDING_CHANNEL_TYPE channelType; + std::array strFirstAired; + unsigned int iFlags; + int64_t sizeInBytes; + int iClientProviderUid; + std::array strProviderName; + + MSGPACK_DEFINE(strRecordingId, + strTitle, + strEpisodeName, + iSeriesNumber, + iEpisodeNumber, + iYear, + strDirectory, + strPlotOutline, + strPlot, + strGenreDescription, + strChannelName, + strIconPath, + strThumbnailPath, + strFanartPath, + recordingTime, + iDuration, + iPriority, + iLifetime, + iGenreType, + iGenreSubType, + iPlayCount, + iLastPlayedPosition, + bIsDeleted, + iEpgEventId, + iChannelUid, + channelType, + strFirstAired, + iFlags, + sizeInBytes, + iClientProviderUid, + strProviderName); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_timers.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_timers.h new file mode 100644 index 0000000000000..8eca899d98603 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_timers.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/addon-instance/pvr/pvr_timers.h" +#include "../../../../../src/shared/api/addon-instance/pvr/pvr_defines.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_PVR_TIMER_STATE +#define MSGPACK_ADD_ENUM_PVR_TIMER_STATE +MSGPACK_ADD_ENUM(PVR_TIMER_STATE); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_PVR_TIMER_TYPE +{ + IFC_PVR_TIMER_TYPE() = default; + IFC_PVR_TIMER_TYPE(const PVR_TIMER_TYPE* c_data) + { + if (c_data == nullptr) + return; + + iId = c_data->iId; + iAttributes = c_data->iAttributes; + memcpy(strDescription.data(), c_data->strDescription, PVR_ADDON_TIMERTYPE_STRING_LENGTH); + iPrioritiesSize = c_data->iPrioritiesSize; + memcpy(priorities.data(), c_data->priorities, PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + iPrioritiesDefault = c_data->iPrioritiesDefault; + iLifetimesSize = c_data->iLifetimesSize; + memcpy(lifetimes.data(), c_data->lifetimes, PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + iLifetimesDefault = c_data->iLifetimesDefault; + iPreventDuplicateEpisodesSize = c_data->iPreventDuplicateEpisodesSize; + memcpy(preventDuplicateEpisodes.data(), c_data->preventDuplicateEpisodes, + PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + iPreventDuplicateEpisodesDefault = c_data->iPreventDuplicateEpisodesDefault; + iRecordingGroupSize = c_data->iRecordingGroupSize; + memcpy(recordingGroup.data(), c_data->recordingGroup, PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + iRecordingGroupDefault = c_data->iRecordingGroupDefault; + iMaxRecordingsSize = c_data->iMaxRecordingsSize; + memcpy(maxRecordings.data(), c_data->maxRecordings, + PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL); + iMaxRecordingsDefault = c_data->iMaxRecordingsDefault; + } + + void SetCStructure(PVR_TIMER_TYPE* c_data) + { + if (c_data == nullptr) + return; + + c_data->iId = iId; + c_data->iAttributes = iAttributes; + memcpy(c_data->strDescription, strDescription.data(), PVR_ADDON_TIMERTYPE_STRING_LENGTH); + c_data->iPrioritiesSize = iPrioritiesSize; + memcpy(c_data->priorities, priorities.data(), PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + c_data->iPrioritiesDefault = iPrioritiesDefault; + c_data->iLifetimesSize = iLifetimesSize; + memcpy(c_data->lifetimes, lifetimes.data(), PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + c_data->iLifetimesDefault = iLifetimesDefault; + c_data->iPreventDuplicateEpisodesSize = iPreventDuplicateEpisodesSize; + memcpy(c_data->preventDuplicateEpisodes, preventDuplicateEpisodes.data(), + PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + c_data->iPreventDuplicateEpisodesDefault = iPreventDuplicateEpisodesDefault; + c_data->iRecordingGroupSize = iRecordingGroupSize; + memcpy(c_data->recordingGroup, recordingGroup.data(), PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE); + c_data->iRecordingGroupDefault = iRecordingGroupDefault; + c_data->iMaxRecordingsSize = iMaxRecordingsSize; + memcpy(c_data->maxRecordings, maxRecordings.data(), + PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL); + c_data->iMaxRecordingsDefault = iMaxRecordingsDefault; + } + + unsigned int iId; + uint64_t iAttributes; + std::array strDescription; + unsigned int iPrioritiesSize; + std::array priorities; + int iPrioritiesDefault; + unsigned int iLifetimesSize; + std::array lifetimes; + int iLifetimesDefault; + unsigned int iPreventDuplicateEpisodesSize; + std::array + preventDuplicateEpisodes; + unsigned int iPreventDuplicateEpisodesDefault; + unsigned int iRecordingGroupSize; + std::array recordingGroup; + unsigned int iRecordingGroupDefault; + unsigned int iMaxRecordingsSize; + std::array + maxRecordings; + int iMaxRecordingsDefault; + + MSGPACK_DEFINE(iId, + iAttributes, + strDescription, + iPrioritiesSize, + priorities, + iPrioritiesDefault, + iLifetimesSize, + lifetimes, + iLifetimesDefault, + iPreventDuplicateEpisodesSize, + preventDuplicateEpisodes, + iPreventDuplicateEpisodesDefault, + iRecordingGroupSize, + recordingGroup, + iRecordingGroupDefault, + iMaxRecordingsSize, + maxRecordings, + iMaxRecordingsDefault); +}; + +struct IFC_PVR_TIMER +{ + IFC_PVR_TIMER() = default; + IFC_PVR_TIMER(const PVR_TIMER* c_data) + { + if (c_data == nullptr) + return; + + iClientIndex = c_data->iClientIndex; + iParentClientIndex = c_data->iParentClientIndex; + iClientChannelUid = c_data->iClientChannelUid; + startTime = c_data->startTime; + endTime = c_data->endTime; + bStartAnyTime = c_data->bStartAnyTime; + bEndAnyTime = c_data->bEndAnyTime; + state = c_data->state; + iTimerType = c_data->iTimerType; + memcpy(strTitle.data(), c_data->strTitle, PVR_ADDON_NAME_STRING_LENGTH); + memcpy(strEpgSearchString.data(), c_data->strEpgSearchString, PVR_ADDON_NAME_STRING_LENGTH); + bFullTextEpgSearch = c_data->bFullTextEpgSearch; + memcpy(strDirectory.data(), c_data->strDirectory, PVR_ADDON_URL_STRING_LENGTH); + memcpy(strSummary.data(), c_data->strSummary, PVR_ADDON_DESC_STRING_LENGTH); + iPriority = c_data->iPriority; + iLifetime = c_data->iLifetime; + iMaxRecordings = c_data->iMaxRecordings; + iRecordingGroup = c_data->iRecordingGroup; + firstDay = c_data->firstDay; + iWeekdays = c_data->iWeekdays; + iPreventDuplicateEpisodes = c_data->iPreventDuplicateEpisodes; + iEpgUid = c_data->iEpgUid; + iMarginStart = c_data->iMarginStart; + iMarginEnd = c_data->iMarginEnd; + iGenreType = c_data->iGenreType; + iGenreSubType = c_data->iGenreSubType; + memcpy(strSeriesLink.data(), c_data->strSeriesLink, PVR_ADDON_URL_STRING_LENGTH); + } + + void SetCStructure(PVR_TIMER* c_data) + { + if (c_data == nullptr) + return; + + c_data->iClientIndex = iClientIndex; + c_data->iParentClientIndex = iParentClientIndex; + c_data->iClientChannelUid = iClientChannelUid; + c_data->startTime = startTime; + c_data->endTime = endTime; + c_data->bStartAnyTime = bStartAnyTime; + c_data->bEndAnyTime = bEndAnyTime; + c_data->state = state; + c_data->iTimerType = iTimerType; + memcpy(c_data->strTitle, strTitle.data(), PVR_ADDON_NAME_STRING_LENGTH); + memcpy(c_data->strEpgSearchString, strEpgSearchString.data(), PVR_ADDON_NAME_STRING_LENGTH); + c_data->bFullTextEpgSearch = bFullTextEpgSearch; + memcpy(c_data->strDirectory, strDirectory.data(), PVR_ADDON_URL_STRING_LENGTH); + memcpy(c_data->strSummary, strSummary.data(), PVR_ADDON_DESC_STRING_LENGTH); + c_data->iPriority = iPriority; + c_data->iLifetime = iLifetime; + c_data->iMaxRecordings = iMaxRecordings; + c_data->iRecordingGroup = iRecordingGroup; + c_data->firstDay = firstDay; + c_data->iWeekdays = iWeekdays; + c_data->iPreventDuplicateEpisodes = iPreventDuplicateEpisodes; + c_data->iEpgUid = iEpgUid; + c_data->iMarginStart = iMarginStart; + c_data->iMarginEnd = iMarginEnd; + c_data->iGenreType = iGenreType; + c_data->iGenreSubType = iGenreSubType; + memcpy(c_data->strSeriesLink, strSeriesLink.data(), PVR_ADDON_URL_STRING_LENGTH); + } + + unsigned int iClientIndex; + unsigned int iParentClientIndex; + int iClientChannelUid; + time_t startTime; + time_t endTime; + bool bStartAnyTime; + bool bEndAnyTime; + enum PVR_TIMER_STATE state; + unsigned int iTimerType; + std::array strTitle; + std::array strEpgSearchString; + bool bFullTextEpgSearch; + std::array strDirectory; + std::array strSummary; + int iPriority; + int iLifetime; + int iMaxRecordings; + unsigned int iRecordingGroup; + time_t firstDay; + unsigned int iWeekdays; + unsigned int iPreventDuplicateEpisodes; + unsigned int iEpgUid; + unsigned int iMarginStart; + unsigned int iMarginEnd; + int iGenreType; + int iGenreSubType; + std::array strSeriesLink; + + MSGPACK_DEFINE(iClientIndex, + iParentClientIndex, + iClientChannelUid, + startTime, + endTime, + bStartAnyTime, + bEndAnyTime, + state, + iTimerType, + strTitle, + strEpgSearchString, + bFullTextEpgSearch, + strDirectory, + strSummary, + iPriority, + iLifetime, + iMaxRecordings, + iRecordingGroup, + firstDay, + iWeekdays, + iPreventDuplicateEpisodes, + iEpgUid, + iMarginStart, + iMarginEnd, + iGenreType, + iGenreSubType, + strSeriesLink); +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h new file mode 100644 index 0000000000000..e25e3c2bd487d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/screensaver.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_SCREENSAVER_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_SCREENSAVER_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_SCREENSAVER_START_V1 start; /*---AUTO---*/ + PFN_KODI_ADDON_SCREENSAVER_STOP_V1 stop; /*---AUTO---*/ + PFN_KODI_ADDON_SCREENSAVER_RENDER_V1 render; /*---AUTO---*/ +} KODI_ADDON_SCREENSAVER_FUNC_V1_TO_V1; + +union KODI_ADDON_SCREENSAVER_FUNC_UNION +{ + struct KODI_ADDON_SCREENSAVER_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_GET_PROPERTIES_V1)( + void*, KODI_OWN_HDL, struct SCREENSAVER_PROPS*); + +struct directFuncToKodi_addoninstance_screensaver_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_SCREENSAVER_GET_PROPERTIES_V1 kodi_addon_screensaver_get_properties_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_SCREENSAVER_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_START_V1)( + void*, KODI_ADDON_SCREENSAVER_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_DESTROY_V1)( + void*, KODI_ADDON_SCREENSAVER_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_RENDER_V1)( + void*, KODI_ADDON_SCREENSAVER_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_STOP_V1)(void*, + KODI_ADDON_SCREENSAVER_HDL); + +struct directFuncToAddon_addoninstance_screensaver_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_SCREENSAVER_CREATE_V1 kodi_addon_screensaver_create_v1; + PFN_INT_KODI_ADDON_SCREENSAVER_DESTROY_V1 kodi_addon_screensaver_destroy_v1; + PFN_INT_KODI_ADDON_SCREENSAVER_RENDER_V1 kodi_addon_screensaver_render_v1; + PFN_INT_KODI_ADDON_SCREENSAVER_START_V1 kodi_addon_screensaver_start_v1; + PFN_INT_KODI_ADDON_SCREENSAVER_STOP_V1 kodi_addon_screensaver_stop_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_SCREENSAVER_PROPS +{ + IFC_SCREENSAVER_PROPS() = default; + IFC_SCREENSAVER_PROPS(const SCREENSAVER_PROPS* c_data) + { + if (c_data == nullptr) + return; + + device = PtrValue(c_data->device); + x = c_data->x; + y = c_data->y; + width = c_data->width; + height = c_data->height; + pixelRatio = c_data->pixelRatio; + if (c_data->name) + name = c_data->name; + if (c_data->presets) + presets = c_data->presets; + if (c_data->profile) + profile = c_data->profile; + } + + static inline void CleanCStructure(SCREENSAVER_PROPS* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->name) + { + free(c_data->name); + c_data->name = nullptr; + } + if (c_data->presets) + { + free(c_data->presets); + c_data->presets = nullptr; + } + if (c_data->profile) + { + free(c_data->profile); + c_data->profile = nullptr; + } + } + + void SetCStructure(SCREENSAVER_PROPS* c_data) + { + if (c_data == nullptr) + return; + + c_data->device = reinterpret_cast(device); + c_data->x = x; + c_data->y = y; + c_data->width = width; + c_data->height = height; + c_data->pixelRatio = pixelRatio; + if (!name.empty()) + c_data->name = strdup(name.c_str()); + if (!presets.empty()) + c_data->presets = strdup(presets.c_str()); + if (!profile.empty()) + c_data->profile = strdup(profile.c_str()); + } + + PtrValue device; + int x; + int y; + int width; + int height; + float pixelRatio; + std::string name; + std::string presets; + std::string profile; + + MSGPACK_DEFINE(device, x, y, width, height, pixelRatio, name, presets, profile); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_screensaver_h : int +{ + funcParent_kodi_addon_screensaver_get_properties_v1, +} funcParent_addoninstance_screensaver_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties(KODI_OWN_HDL hdl, struct SCREENSAVER_PROPS* props) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_screensaver_get_properties_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_screensaver_h : int +{ + funcChild_kodi_addon_screensaver_create_v1, + funcChild_kodi_addon_screensaver_destroy_v1, + funcChild_kodi_addon_screensaver_start_v1, + funcChild_kodi_addon_screensaver_stop_v1, + funcChild_kodi_addon_screensaver_render_v1, +} funcChild_addoninstance_screensaver_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_SCREENSAVER_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_CREATE_V1)(KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_screensaver_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_screensaver_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_DESTROY_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_screensaver_destroy_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_screensaver_start_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_screensaver_start_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_screensaver_stop_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_screensaver_stop_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(KODI_ADDON_SCREENSAVER_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_screensaver_render_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_screensaver_render_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h new file mode 100644 index 0000000000000..a013e82f75238 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h @@ -0,0 +1,435 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/vfs.h" +#include "src/shared/SharedGroups.h" +#include "src/shared/api/filesystem.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_VFS_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_VFS_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1 clear_out_idle; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1 disconnect_all; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_OPEN_V1 file_open; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1 file_open_for_write; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_CLOSE_V1 file_close; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_READ_V1 file_read; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_WRITE_V1 file_write; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_SEEK_V1 file_seek; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1 file_truncate; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1 file_get_length; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1 file_get_position; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1 file_get_chunk_size; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1 + file_io_control_get_seek_possible; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1 + file_io_control_get_cache_status; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1 + file_io_control_set_cache_rate; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1 + file_io_control_set_retry; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_STAT_V1 stat; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_EXISTS_V1 exists; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DELETE_IT_V1 delete_it; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_RENAME_V1 rename; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1 directory_exists; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1 directory_remove; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1 directory_create; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1 directory_get; /*---AUTO---*/ + PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1 + directory_contains_files; /*---AUTO---*/ +} KODI_ADDON_VFS_FUNC_V1_TO_V1; + +union KODI_ADDON_VFS_FUNC_UNION +{ + struct KODI_ADDON_VFS_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__GET_KEYBOARD_INPUT_V1)( + void*, KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*, char**, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__REQUIRE_AUTHENTICATION_V1)( + void*, KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__SET_ERROR_DIALOG_V1)( + void*, KODI_OWN_HDL, KODI_CTX_CB_HDL, const char*, const char*, const char*, const char*); + +struct directFuncToKodi_addoninstance_vfs_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__GET_KEYBOARD_INPUT_V1 + kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; + PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__REQUIRE_AUTHENTICATION_V1 + kodi_addon_vfs_get_dir_cb__require_authentication_v1; + PFN_INT_KODI_ADDON_VFS_GET_DIR_CB__SET_ERROR_DIALOG_V1 + kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_VFS_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_CREATE_V1)(void*, + KODI_OWN_HDL); +typedef KODI_VFS_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( + void*, KODI_ADDON_VFS_HDL, const struct VFS_URL*, bool); +typedef KODI_VFS_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_OPEN_V1)( + void*, KODI_ADDON_VFS_HDL, const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DELETE_IT_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( + void*, KODI_ADDON_VFS_HDL, const struct VFS_URL*, struct VFS_DIR_ENTRY**, size_t*, char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_GET_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*, + struct VFS_DIR_ENTRY**, + size_t*, + KODI_CTX_CB_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_EXISTS_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_CLOSE_V1)(void*, + KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, struct VFS_CACHE_STATUS*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_RENAME_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*, + const struct VFS_URL*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)(void*, + KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(void*, + KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL, + int64_t); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_STAT_V1)(void*, + KODI_ADDON_VFS_HDL, + const struct VFS_URL*, + struct VFS_STAT_STRUCTURE*); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)(void*, + KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_POSITION_V1)(void*, + KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_SEEK_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, int64_t, int); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_READ_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, uint8_t*, size_t); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_WRITE_V1)( + void*, KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, const uint8_t*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(void*, + KODI_ADDON_VFS_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DESTROY_V1)(void*, KODI_ADDON_VFS_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(void*, + KODI_ADDON_VFS_HDL); + +struct directFuncToAddon_addoninstance_vfs_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1 kodi_addon_vfs_clear_out_idle_v1; + PFN_INT_KODI_ADDON_VFS_CREATE_V1 kodi_addon_vfs_create_v1; + PFN_INT_KODI_ADDON_VFS_DELETE_IT_V1 kodi_addon_vfs_delete_it_v1; + PFN_INT_KODI_ADDON_VFS_DESTROY_V1 kodi_addon_vfs_destroy_v1; + PFN_INT_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1 kodi_addon_vfs_directory_contains_files_v1; + PFN_INT_KODI_ADDON_VFS_DIRECTORY_CREATE_V1 kodi_addon_vfs_directory_create_v1; + PFN_INT_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1 kodi_addon_vfs_directory_exists_v1; + PFN_INT_KODI_ADDON_VFS_DIRECTORY_GET_V1 kodi_addon_vfs_directory_get_v1; + PFN_INT_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1 kodi_addon_vfs_directory_remove_v1; + PFN_INT_KODI_ADDON_VFS_DISCONNECT_ALL_V1 kodi_addon_vfs_disconnect_all_v1; + PFN_INT_KODI_ADDON_VFS_EXISTS_V1 kodi_addon_vfs_exists_v1; + PFN_INT_KODI_ADDON_VFS_FILE_CLOSE_V1 kodi_addon_vfs_file_close_v1; + PFN_INT_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1 kodi_addon_vfs_file_get_chunk_size_v1; + PFN_INT_KODI_ADDON_VFS_FILE_GET_LENGTH_V1 kodi_addon_vfs_file_get_length_v1; + PFN_INT_KODI_ADDON_VFS_FILE_GET_POSITION_V1 kodi_addon_vfs_file_get_position_v1; + PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1 + kodi_addon_vfs_file_io_control_get_cache_status_v1; + PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1 + kodi_addon_vfs_file_io_control_get_seek_possible_v1; + PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1 + kodi_addon_vfs_file_io_control_set_cache_rate_v1; + PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1 kodi_addon_vfs_file_io_control_set_retry_v1; + PFN_INT_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1 kodi_addon_vfs_file_open_for_write_v1; + PFN_INT_KODI_ADDON_VFS_FILE_OPEN_V1 kodi_addon_vfs_file_open_v1; + PFN_INT_KODI_ADDON_VFS_FILE_READ_V1 kodi_addon_vfs_file_read_v1; + PFN_INT_KODI_ADDON_VFS_FILE_SEEK_V1 kodi_addon_vfs_file_seek_v1; + PFN_INT_KODI_ADDON_VFS_FILE_TRUNCATE_V1 kodi_addon_vfs_file_truncate_v1; + PFN_INT_KODI_ADDON_VFS_FILE_WRITE_V1 kodi_addon_vfs_file_write_v1; + PFN_INT_KODI_ADDON_VFS_RENAME_V1 kodi_addon_vfs_rename_v1; + PFN_INT_KODI_ADDON_VFS_STAT_V1 kodi_addon_vfs_stat_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_VFS_URL +{ + IFC_VFS_URL() = default; + IFC_VFS_URL(const VFS_URL* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->url) + url = c_data->url; + if (c_data->domain) + domain = c_data->domain; + if (c_data->hostname) + hostname = c_data->hostname; + if (c_data->filename) + filename = c_data->filename; + port = c_data->port; + if (c_data->options) + options = c_data->options; + if (c_data->username) + username = c_data->username; + if (c_data->password) + password = c_data->password; + if (c_data->redacted) + redacted = c_data->redacted; + if (c_data->sharename) + sharename = c_data->sharename; + if (c_data->protocol) + protocol = c_data->protocol; + } + + void SetCStructure(VFS_URL* c_data) + { + if (c_data == nullptr) + return; + + c_data->url = url.c_str(); + c_data->domain = domain.c_str(); + c_data->hostname = hostname.c_str(); + c_data->filename = filename.c_str(); + c_data->port = port; + c_data->options = options.c_str(); + c_data->username = username.c_str(); + c_data->password = password.c_str(); + c_data->redacted = redacted.c_str(); + c_data->sharename = sharename.c_str(); + c_data->protocol = protocol.c_str(); + } + + std::string url; + std::string domain; + std::string hostname; + std::string filename; + unsigned int port; + std::string options; + std::string username; + std::string password; + std::string redacted; + std::string sharename; + std::string protocol; + + MSGPACK_DEFINE(url, + domain, + hostname, + filename, + port, + options, + username, + password, + redacted, + sharename, + protocol); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_vfs_h : int +{ + funcParent_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1, + funcParent_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1, + funcParent_kodi_addon_vfs_get_dir_cb__require_authentication_v1, +} funcParent_addoninstance_vfs_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, char** input, bool hidden_input) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__get_keyboard_input_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__set_error_dialog(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* heading, const char* line1, const char* line2, const char* line3) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__set_error_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_vfs_get_dir_cb__require_authentication(KODI_OWN_HDL hdl, KODI_CTX_CB_HDL ctx_cb_hdl, const char* url) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_vfs_get_dir_cb__require_authentication_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_vfs_h : int +{ + funcChild_kodi_addon_vfs_create_v1, + funcChild_kodi_addon_vfs_destroy_v1, + funcChild_kodi_addon_vfs_file_open_v1, + funcChild_kodi_addon_vfs_file_open_for_write_v1, + funcChild_kodi_addon_vfs_file_close_v1, + funcChild_kodi_addon_vfs_file_read_v1, + funcChild_kodi_addon_vfs_file_write_v1, + funcChild_kodi_addon_vfs_file_seek_v1, + funcChild_kodi_addon_vfs_file_truncate_v1, + funcChild_kodi_addon_vfs_file_get_length_v1, + funcChild_kodi_addon_vfs_file_get_position_v1, + funcChild_kodi_addon_vfs_file_get_chunk_size_v1, + funcChild_kodi_addon_vfs_file_io_control_get_seek_possible_v1, + funcChild_kodi_addon_vfs_file_io_control_get_cache_status_v1, + funcChild_kodi_addon_vfs_file_io_control_set_cache_rate_v1, + funcChild_kodi_addon_vfs_file_io_control_set_retry_v1, + funcChild_kodi_addon_vfs_stat_v1, + funcChild_kodi_addon_vfs_exists_v1, + funcChild_kodi_addon_vfs_clear_out_idle_v1, + funcChild_kodi_addon_vfs_disconnect_all_v1, + funcChild_kodi_addon_vfs_delete_it_v1, + funcChild_kodi_addon_vfs_rename_v1, + funcChild_kodi_addon_vfs_directory_exists_v1, + funcChild_kodi_addon_vfs_directory_remove_v1, + funcChild_kodi_addon_vfs_directory_create_v1, + funcChild_kodi_addon_vfs_directory_get_v1, + funcChild_kodi_addon_vfs_directory_contains_files_v1, +} funcChild_addoninstance_vfs_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_VFS_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CREATE_V1)(KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_vfs_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DESTROY_V1)(KODI_ADDON_VFS_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_vfs_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_destroy_v1; /* Autogenerated */ +// Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_v1; /* Autogenerated */ +// Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, bool overwrite); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_open_for_write_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_close_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_close_v1; /* Autogenerated */ +// Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_READ_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint8_t* buffer, size_t buf_size); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_read_v1; /* Autogenerated */ +typedef std::tuple> msgChild_OUT_kodi_addon_vfs_file_read_v1; /* Autogenerated */ +// Original API call: typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_WRITE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, const uint8_t* buffer, size_t buf_size); +typedef std::tuple, size_t> msgChild__IN_kodi_addon_vfs_file_write_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_write_v1; /* Autogenerated */ +// Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_SEEK_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t position, int whence); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_seek_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, int64_t size); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_truncate_v1; /* Autogenerated */ +// Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_length_v1; /* Autogenerated */ +// Original API call: typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_position_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_get_chunk_size_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_SEEK_POSSIBLE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_seek_possible_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_GET_CACHE_STATUS_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, struct VFS_CACHE_STATUS* status); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_get_cache_status_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)( KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, unsigned int rate); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_cache_rate_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)(KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, bool retry); +typedef std::tuple msgChild__IN_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_file_io_control_set_retry_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_STAT_STRUCTURE* buffer); +typedef std::tuple msgChild__IN_kodi_addon_vfs_stat_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_stat_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_exists_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_exists_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(KODI_ADDON_VFS_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_clear_out_idle_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(KODI_ADDON_VFS_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_disconnect_all_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_delete_it_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, const struct VFS_URL* url2); +typedef std::tuple msgChild__IN_kodi_addon_vfs_rename_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_rename_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_exists_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_remove_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url); +typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_vfs_directory_create_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, KODI_CTX_CB_HDL ctx_cb_hdl); +typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_vfs_directory_get_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( KODI_ADDON_VFS_HDL hdl, const struct VFS_URL* url, struct VFS_DIR_ENTRY** entries, size_t* num_entries, char** rootpath); +typedef std::tuple msgChild__IN_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ +typedef std::tuple, size_t, std::string> msgChild_OUT_kodi_addon_vfs_directory_contains_files_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h new file mode 100644 index 0000000000000..5042e217734f9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/videocodec.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_VIDEOCODEC_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_OPEN_V1 open; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1 reconfigure; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1 add_data; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1 get_picture; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_GET_NAME_V1 get_name; /*---AUTO---*/ + PFN_KODI_ADDON_VIDEOCODEC_RESET_V1 reset; /*---AUTO---*/ +} KODI_ADDON_VIDEOCODEC_FUNC_V1_TO_V1; + +union KODI_ADDON_VIDEOCODEC_FUNC_UNION +{ + struct KODI_ADDON_VIDEOCODEC_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_GET_FRAME_BUFFER_V1)( + void*, KODI_OWN_HDL, struct VIDEOCODEC_PICTURE*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1)( + void*, KODI_OWN_HDL, struct VIDEOCODEC_PICTURE*); + +struct directFuncToKodi_addoninstance_videocodec_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VIDEOCODEC_GET_FRAME_BUFFER_V1 kodi_addon_videocodec_get_frame_buffer_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1 + kodi_addon_videocodec_release_frame_buffer_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_VIDEOCODEC_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1)( + void*, KODI_ADDON_VIDEOCODEC_HDL, const struct DEMUX_PACKET*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_OPEN_V1)(void*, + KODI_ADDON_VIDEOCODEC_HDL, + struct VIDEOCODEC_INITDATA*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1)( + void*, KODI_ADDON_VIDEOCODEC_HDL, struct VIDEOCODEC_INITDATA*); +typedef const char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_GET_NAME_V1)(void*, KODI_ADDON_VIDEOCODEC_HDL); +typedef enum VIDEOCODEC_RETVAL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1)( + void*, KODI_ADDON_VIDEOCODEC_HDL, struct VIDEOCODEC_PICTURE*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_DESTROY_V1)( + void*, KODI_ADDON_VIDEOCODEC_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_RESET_V1)(void*, + KODI_ADDON_VIDEOCODEC_HDL); + +struct directFuncToAddon_addoninstance_videocodec_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1 kodi_addon_videocodec_add_data_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_CREATE_V1 kodi_addon_videocodec_create_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_DESTROY_V1 kodi_addon_videocodec_destroy_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_GET_NAME_V1 kodi_addon_videocodec_get_name_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_GET_PICTURE_V1 kodi_addon_videocodec_get_picture_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_OPEN_V1 kodi_addon_videocodec_open_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1 kodi_addon_videocodec_reconfigure_v1; + PFN_INT_KODI_ADDON_VIDEOCODEC_RESET_V1 kodi_addon_videocodec_reset_v1; +}; + +//}}} + +typedef enum funcParent_addoninstance_videocodec_h : int +{ + funcParent_addoninstance_videocodec_h_dummy +} funcParent_addoninstance_videocodec_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_videocodec_h : int +{ + funcChild_addoninstance_videocodec_h_dummy +} funcChild_addoninstance_videocodec_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/* NOTE: Ignored as direct api only is set! */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h new file mode 100644 index 0000000000000..af36ef16df467 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h @@ -0,0 +1,466 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/addon-instance/visualization.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_VISUALIZATION_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_VISUALIZATION_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_START_V1 start; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_STOP_V1 stop; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1 get_info; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1 audio_data; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1 is_dirty; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_RENDER_V1 render; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1 get_presets; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1 + get_active_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1 prev_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1 next_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1 load_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1 random_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1 lock_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1 rate_preset; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1 is_locked; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1 update_albumart; /*---AUTO---*/ + PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1 update_track; /*---AUTO---*/ +} KODI_ADDON_VISUALIZATION_FUNC_V1_TO_V1; + +union KODI_ADDON_VISUALIZATION_FUNC_UNION +{ + struct KODI_ADDON_VISUALIZATION_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_CLEAR_PRESETS_V1)(void*, + KODI_OWN_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1)( + void*, KODI_OWN_HDL, struct VIS_PROPS*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1)(void*, + KODI_OWN_HDL, + const char*); + +struct directFuncToKodi_addoninstance_visualization_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VISUALIZATION_CLEAR_PRESETS_V1 kodi_addon_visualization_clear_presets_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1 kodi_addon_visualization_get_properties_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1 kodi_addon_visualization_transfer_preset_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef KODI_ADDON_VISUALIZATION_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_CREATE_V1)( + void*, KODI_OWN_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_START_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, int, int, int, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, const struct VIS_TRACK*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, const float*, size_t, const float*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_DESTROY_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_INFO_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL, struct VIS_INFO*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RENDER_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_STOP_V1)( + void*, KODI_ADDON_VISUALIZATION_HDL); + +struct directFuncToAddon_addoninstance_visualization_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1 kodi_addon_visualization_audio_data_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_CREATE_V1 kodi_addon_visualization_create_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_DESTROY_V1 kodi_addon_visualization_destroy_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1 + kodi_addon_visualization_get_active_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_INFO_V1 kodi_addon_visualization_get_info_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1 kodi_addon_visualization_get_presets_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1 kodi_addon_visualization_is_dirty_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1 kodi_addon_visualization_is_locked_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1 kodi_addon_visualization_load_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1 kodi_addon_visualization_lock_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1 kodi_addon_visualization_next_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1 kodi_addon_visualization_prev_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1 kodi_addon_visualization_random_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1 kodi_addon_visualization_rate_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_RENDER_V1 kodi_addon_visualization_render_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_START_V1 kodi_addon_visualization_start_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_STOP_V1 kodi_addon_visualization_stop_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1 kodi_addon_visualization_update_albumart_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1 kodi_addon_visualization_update_track_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_VIS_INFO +{ + IFC_VIS_INFO() = default; + IFC_VIS_INFO(const VIS_INFO* c_data) + { + if (c_data == nullptr) + return; + + wants_freq = c_data->wants_freq; + sync_delay = c_data->sync_delay; + } + + void SetCStructure(VIS_INFO* c_data) + { + if (c_data == nullptr) + return; + + c_data->wants_freq = wants_freq; + c_data->sync_delay = sync_delay; + } + + bool wants_freq; + int sync_delay; + + MSGPACK_DEFINE(wants_freq, sync_delay); +}; + +struct IFC_VIS_TRACK +{ + IFC_VIS_TRACK() = default; + IFC_VIS_TRACK(const VIS_TRACK* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->title) + title = c_data->title; + if (c_data->artist) + artist = c_data->artist; + if (c_data->album) + album = c_data->album; + if (c_data->albumArtist) + albumArtist = c_data->albumArtist; + if (c_data->genre) + genre = c_data->genre; + if (c_data->comment) + comment = c_data->comment; + if (c_data->lyrics) + lyrics = c_data->lyrics; + if (c_data->reserved1) + reserved1 = c_data->reserved1; + if (c_data->reserved2) + reserved2 = c_data->reserved2; + trackNumber = c_data->trackNumber; + discNumber = c_data->discNumber; + duration = c_data->duration; + year = c_data->year; + rating = c_data->rating; + reserved3 = c_data->reserved3; + reserved4 = c_data->reserved4; + } + + void SetCStructure(VIS_TRACK* c_data) + { + if (c_data == nullptr) + return; + + c_data->title = title.c_str(); + c_data->artist = artist.c_str(); + c_data->album = album.c_str(); + c_data->albumArtist = albumArtist.c_str(); + c_data->genre = genre.c_str(); + c_data->comment = comment.c_str(); + c_data->lyrics = lyrics.c_str(); + c_data->reserved1 = reserved1.c_str(); + c_data->reserved2 = reserved2.c_str(); + c_data->trackNumber = trackNumber; + c_data->discNumber = discNumber; + c_data->duration = duration; + c_data->year = year; + c_data->rating = rating; + c_data->reserved3 = reserved3; + c_data->reserved4 = reserved4; + } + + std::string title; + std::string artist; + std::string album; + std::string albumArtist; + std::string genre; + std::string comment; + std::string lyrics; + std::string reserved1; + std::string reserved2; + int trackNumber; + int discNumber; + int duration; + int year; + int rating; + int reserved3; + int reserved4; + + MSGPACK_DEFINE(title, + artist, + album, + albumArtist, + genre, + comment, + lyrics, + reserved1, + reserved2, + trackNumber, + discNumber, + duration, + year, + rating, + reserved3, + reserved4); +}; + +struct IFC_VIS_PROPS +{ + IFC_VIS_PROPS() = default; + IFC_VIS_PROPS(const VIS_PROPS* c_data) + { + if (c_data == nullptr) + return; + + device = PtrValue(c_data->device); + x = c_data->x; + y = c_data->y; + width = c_data->width; + height = c_data->height; + pixelRatio = c_data->pixelRatio; + if (c_data->name) + name = c_data->name; + if (c_data->presets) + presets = c_data->presets; + if (c_data->profile) + profile = c_data->profile; + } + + static inline void CleanCStructure(VIS_PROPS* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->name) + { + free(c_data->name); + c_data->name = nullptr; + } + if (c_data->presets) + { + free(c_data->presets); + c_data->presets = nullptr; + } + if (c_data->profile) + { + free(c_data->profile); + c_data->profile = nullptr; + } + } + + void SetCStructure(VIS_PROPS* c_data) + { + if (c_data == nullptr) + return; + + c_data->device = reinterpret_cast(device); + c_data->x = x; + c_data->y = y; + c_data->width = width; + c_data->height = height; + c_data->pixelRatio = pixelRatio; + if (!name.empty()) + c_data->name = strdup(name.c_str()); + if (!presets.empty()) + c_data->presets = strdup(presets.c_str()); + if (!profile.empty()) + c_data->profile = strdup(profile.c_str()); + } + + PtrValue device; + int x; + int y; + int width; + int height; + float pixelRatio; + std::string name; + std::string presets; + std::string profile; + + MSGPACK_DEFINE(device, x, y, width, height, pixelRatio, name, presets, profile); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_visualization_h : int +{ + funcParent_kodi_addon_visualization_get_properties_v1, + funcParent_kodi_addon_visualization_transfer_preset_v1, + funcParent_kodi_addon_visualization_clear_presets_v1, +} funcParent_addoninstance_visualization_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(KODI_OWN_HDL hdl, struct VIS_PROPS* props) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_visualization_get_properties_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(KODI_OWN_HDL hdl, const char* preset) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_visualization_transfer_preset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(KODI_OWN_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_visualization_clear_presets_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_visualization_h : int +{ + funcChild_kodi_addon_visualization_create_v1, + funcChild_kodi_addon_visualization_destroy_v1, + funcChild_kodi_addon_visualization_start_v1, + funcChild_kodi_addon_visualization_stop_v1, + funcChild_kodi_addon_visualization_get_info_v1, + funcChild_kodi_addon_visualization_audio_data_v1, + funcChild_kodi_addon_visualization_is_dirty_v1, + funcChild_kodi_addon_visualization_render_v1, + funcChild_kodi_addon_visualization_get_presets_v1, + funcChild_kodi_addon_visualization_get_active_preset_v1, + funcChild_kodi_addon_visualization_prev_preset_v1, + funcChild_kodi_addon_visualization_next_preset_v1, + funcChild_kodi_addon_visualization_load_preset_v1, + funcChild_kodi_addon_visualization_random_preset_v1, + funcChild_kodi_addon_visualization_lock_preset_v1, + funcChild_kodi_addon_visualization_rate_preset_v1, + funcChild_kodi_addon_visualization_is_locked_v1, + funcChild_kodi_addon_visualization_update_albumart_v1, + funcChild_kodi_addon_visualization_update_track_v1, +} funcChild_addoninstance_visualization_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef KODI_ADDON_VISUALIZATION_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CREATE_V1)(KODI_OWN_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_DESTROY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_destroy_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int channels, int samples_per_sec, int bits_per_sample, const char* song_name); +typedef std::tuple msgChild__IN_kodi_addon_visualization_start_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_start_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_stop_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_stop_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_INFO_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, struct VIS_INFO* info); +typedef std::tuple msgChild__IN_kodi_addon_visualization_get_info_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_info_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length, const float* freq_data, size_t freq_data_length); +typedef std::tuple, size_t, std::vector, size_t> msgChild__IN_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_audio_data_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_dirty_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_render_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_render_v1; /* Autogenerated */ +// Original API call: typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_presets_v1; /* Autogenerated */ +// Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_active_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_prev_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_next_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, int select); +typedef std::tuple msgChild__IN_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_load_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_random_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_lock_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus); +typedef std::tuple msgChild__IN_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_rate_preset_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)(KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_is_locked_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart); +typedef std::tuple msgChild__IN_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_albumart_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)(KODI_ADDON_VISUALIZATION_HDL hdl, const struct VIS_TRACK* track); +typedef std::tuple msgChild__IN_kodi_addon_visualization_update_track_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_update_track_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/addon_base.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon_base.h new file mode 100644 index 0000000000000..add29c1ac7e6a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon_base.h @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/addon_base.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_CREATE_INSTANCE_V1 create_instance; /*---AUTO---*/ + PFN_KODI_ADDON_DESTROY_INSTANCE_V1 destroy_instance; /*---AUTO---*/ + PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1 setting_change_string; /*---AUTO---*/ + PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1 setting_change_boolean; /*---AUTO---*/ + PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1 setting_change_integer; /*---AUTO---*/ + PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1 setting_change_float; /*---AUTO---*/ +} KODI_ADDON_FUNC_V1_TO_V1; + +union KODI_ADDON_FUNC_UNION +{ + struct KODI_ADDON_FUNC_V1_TO_V1 v1; +}; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_ADDON_INSTANCE +#define MSGPACK_ADD_ENUM_ADDON_INSTANCE +MSGPACK_ADD_ENUM(ADDON_INSTANCE); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_STATUS +#define MSGPACK_ADD_ENUM_ADDON_STATUS +MSGPACK_ADD_ENUM(ADDON_STATUS); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_LOG +#define MSGPACK_ADD_ENUM_ADDON_LOG +MSGPACK_ADD_ENUM(ADDON_LOG); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_SETTING_BOOL_V1)(void*, const char*, bool*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_SETTING_FLOAT_V1)(void*, + const char*, + float*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_SETTING_INT_V1)(void*, const char*, int*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_SETTING_STRING_V1)(void*, + const char*, + char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_OPEN_SETTINGS_DIALOG_V1)(void*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SET_SETTING_BOOL_V1)(void*, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SET_SETTING_FLOAT_V1)(void*, const char*, float); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SET_SETTING_INT_V1)(void*, const char*, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SET_SETTING_STRING_V1)(void*, + const char*, + const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_INFO_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_LIB_PATH_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_SHARE_PATH_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_TEMP_PATH_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_USER_PATH_V1)(void*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_LOG_V1)(void*, enum ADDON_LOG, const char*, ...); + +struct directFuncToKodi_addon_base_h +{ + void* thisClassHdl; + /* Function "kodi_check_main_shared" only used inside dev-kit library only */ + /* Function "kodi_deinit" only used inside dev-kit library only */ + /* Function "kodi_init" only used inside dev-kit library only */ + /* Function "kodi_process" only used inside dev-kit library only */ + PFN_INT_KODI_ADDON_GET_INFO_V1 kodi_addon_get_info_v1; + PFN_INT_KODI_ADDON_GET_LIB_PATH_V1 kodi_addon_get_lib_path_v1; + PFN_INT_KODI_ADDON_GET_SETTING_BOOL_V1 kodi_addon_get_setting_bool_v1; + PFN_INT_KODI_ADDON_GET_SETTING_FLOAT_V1 kodi_addon_get_setting_float_v1; + PFN_INT_KODI_ADDON_GET_SETTING_INT_V1 kodi_addon_get_setting_int_v1; + PFN_INT_KODI_ADDON_GET_SETTING_STRING_V1 kodi_addon_get_setting_string_v1; + PFN_INT_KODI_ADDON_GET_SHARE_PATH_V1 kodi_addon_get_share_path_v1; + PFN_INT_KODI_ADDON_GET_TEMP_PATH_V1 kodi_addon_get_temp_path_v1; + PFN_INT_KODI_ADDON_GET_USER_PATH_V1 kodi_addon_get_user_path_v1; + PFN_INT_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1 kodi_addon_is_setting_using_default_v1; + PFN_INT_KODI_ADDON_OPEN_SETTINGS_DIALOG_V1 kodi_addon_open_settings_dialog_v1; + PFN_INT_KODI_ADDON_SET_SETTING_BOOL_V1 kodi_addon_set_setting_bool_v1; + PFN_INT_KODI_ADDON_SET_SETTING_FLOAT_V1 kodi_addon_set_setting_float_v1; + PFN_INT_KODI_ADDON_SET_SETTING_INT_V1 kodi_addon_set_setting_int_v1; + PFN_INT_KODI_ADDON_SET_SETTING_STRING_V1 kodi_addon_set_setting_string_v1; + PFN_INT_KODI_LOG_V1 kodi_log_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_CREATE_INSTANCE_V1)( + void*, + KODI_ADDON_HDL, + ADDON_INSTANCE, + const std::string&, + KODI_OWN_HDL, + KODI_HANDLE*, + KODI_HANDLE); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_CREATE_V1)(void*, KODI_ADDON_HDL*); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)( + void*, const KODI_ADDON_HDL, const char*, bool); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)( + void*, const KODI_ADDON_HDL, const char*, float); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)( + void*, const KODI_ADDON_HDL, const char*, int); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SETTING_CHANGE_STRING_V1)( + void*, const KODI_ADDON_HDL, const char*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_DESTROY_INSTANCE_V1)(void*, + const KODI_ADDON_HDL, + ADDON_INSTANCE, + KODI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_DESTROY_V1)(void*, KODI_ADDON_HDL); + +struct directFuncToAddon_addon_base_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_CREATE_INSTANCE_V1 kodi_addon_create_instance_v1; + PFN_INT_KODI_ADDON_CREATE_V1 kodi_addon_create_v1; + PFN_INT_KODI_ADDON_DESTROY_INSTANCE_V1 kodi_addon_destroy_instance_v1; + PFN_INT_KODI_ADDON_DESTROY_V1 kodi_addon_destroy_v1; + PFN_INT_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1 kodi_addon_setting_change_boolean_v1; + PFN_INT_KODI_ADDON_SETTING_CHANGE_FLOAT_V1 kodi_addon_setting_change_float_v1; + PFN_INT_KODI_ADDON_SETTING_CHANGE_INTEGER_V1 kodi_addon_setting_change_integer_v1; + PFN_INT_KODI_ADDON_SETTING_CHANGE_STRING_V1 kodi_addon_setting_change_string_v1; +}; + +//}}} + +typedef enum funcParent_addon_base_h : int +{ + funcParent_kodi_check_main_shared_v1, + funcParent_kodi_init_v1, + funcParent_kodi_deinit_v1, + funcParent_kodi_process_v1, + funcParent_kodi_log_v1, + funcParent_kodi_addon_get_lib_path_v1, + funcParent_kodi_addon_get_share_path_v1, + funcParent_kodi_addon_get_user_path_v1, + funcParent_kodi_addon_get_temp_path_v1, + funcParent_kodi_addon_get_info_v1, + funcParent_kodi_addon_open_settings_dialog_v1, + funcParent_kodi_addon_is_setting_using_default_v1, + funcParent_kodi_addon_get_setting_bool_v1, + funcParent_kodi_addon_get_setting_int_v1, + funcParent_kodi_addon_get_setting_float_v1, + funcParent_kodi_addon_get_setting_string_v1, + funcParent_kodi_addon_set_setting_bool_v1, + funcParent_kodi_addon_set_setting_int_v1, + funcParent_kodi_addon_set_setting_float_v1, + funcParent_kodi_addon_set_setting_string_v1, +} funcParent_addon_base_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT const char* kodi_check_main_shared(int argc, char* argv[]) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_check_main_shared - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_check_main_shared - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT KODI_IFC_HDL kodi_init(unsigned int api, int argc, char* argv[], struct KODI_ADDON_FUNC* func, bool via_main, bool no_receive) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_init - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_init - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT void kodi_deinit(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_deinit - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_deinit - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT bool kodi_process(KODI_IFC_HDL hdl) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_process - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_process - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT void kodi_log(enum ADDON_LOG loglevel, const char* format, ...) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_log_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_log_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_lib_path() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_lib_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_lib_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_share_path() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_share_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_share_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_user_path() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_user_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_user_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_temp_path() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_temp_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_temp_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_info(const char* id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_info_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_info_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_open_settings_dialog() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_open_settings_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_is_setting_using_default(const char* id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_is_setting_using_default_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_bool(const char* id, bool* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_setting_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_setting_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_int(const char* id, int* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_setting_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_setting_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, float* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_setting_float_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_setting_float_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_string(const char* id, char** value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_setting_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_setting_string_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_bool(const char* id, bool value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_set_setting_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_set_setting_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_int(const char* id, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_set_setting_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_set_setting_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, float value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_set_setting_float_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_set_setting_float_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_set_setting_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_set_setting_string_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addon_base_h : int +{ + funcChild_kodi_addon_create_v1, + funcChild_kodi_addon_destroy_v1, + funcChild_kodi_addon_create_instance_v1, + funcChild_kodi_addon_destroy_instance_v1, + funcChild_kodi_addon_setting_change_string_v1, + funcChild_kodi_addon_setting_change_boolean_v1, + funcChild_kodi_addon_setting_change_integer_v1, + funcChild_kodi_addon_setting_change_float_v1, +} funcChild_addon_base_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(KODI_HANDLE first_instance, KODI_ADDON_HDL* hdl); +typedef std::tuple msgChild__IN_kodi_addon_create_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +typedef std::tuple msgChild_OUT_kodi_addon_create_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_destroy_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)(const KODI_ADDON_HDL hdl, enum ADDON_INSTANCE instanceType, const char* instanceID, struct KODI_INSTANCE_HDL* addonInstance, KODI_IFC_HDL parent); +typedef std::tuple msgChild__IN_kodi_addon_create_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +typedef std::tuple msgChild_OUT_kodi_addon_create_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)(const KODI_ADDON_HDL hdl, enum ADDON_INSTANCE instanceType, struct KODI_INSTANCE_HDL* instance); +typedef std::tuple msgChild__IN_kodi_addon_destroy_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +typedef std::tuple msgChild_OUT_kodi_addon_destroy_instance_v1; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const char* name, const char* value); +typedef std::tuple msgChild__IN_kodi_addon_setting_change_string_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_setting_change_string_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const char* name, bool value); +typedef std::tuple msgChild__IN_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_setting_change_boolean_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const char* name, int value); +typedef std::tuple msgChild__IN_kodi_addon_setting_change_integer_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_setting_change_integer_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const char* name, float value); +typedef std::tuple msgChild__IN_kodi_addon_setting_change_float_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_setting_change_float_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/audio_engine.h b/xbmc/addons/kodi-dev-kit/src/shared/api/audio_engine.h new file mode 100644 index 0000000000000..b99aa8b4ede18 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/audio_engine.h @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/audio_engine.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_AudioEngineDataFormat +#define MSGPACK_ADD_ENUM_AudioEngineDataFormat +MSGPACK_ADD_ENUM(AudioEngineDataFormat); +#endif +#ifndef MSGPACK_ADD_ENUM_AudioEngineChannel +#define MSGPACK_ADD_ENUM_AudioEngineChannel +MSGPACK_ADD_ENUM(AudioEngineChannel); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_AE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_MAKE_V1)( + void*, const struct AUDIO_ENGINE_FMT*, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_GET_CURRENT_SINK_FORMAT_V1)( + void*, struct AUDIO_ENGINE_FMT*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_IS_PLANAR_FORMAT_V1)( + void*, enum AudioEngineDataFormat); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_IS_BUFFERING_V1)(void*, + KODI_AE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_IS_DRAINED_V1)(void*, KODI_AE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_IS_DRAINING_V1)(void*, KODI_AE_HDL); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CACHE_TIME_V1)(void*, + KODI_AE_HDL); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CACHE_TOTAL_V1)(void*, + KODI_AE_HDL); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_DELAY_V1)(void*, KODI_AE_HDL); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_RESAMPLE_RATIO_V1)( + void*, KODI_AE_HDL); +typedef enum AudioEngineDataFormat( + ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_DATA_FORMAT_V1)(void*, KODI_AE_HDL); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_AMPLIFICATION_V1)(void*, + KODI_AE_HDL); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_VOLUME_V1)(void*, KODI_AE_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_ADD_DATA_V1)( + void*, + KODI_AE_HDL, + uint8_t* const*, + size_t, + size_t, + unsigned int, + unsigned int, + unsigned int, + double, + bool, + double); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CHANNEL_COUNT_V1)( + void*, KODI_AE_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_FRAME_SIZE_V1)( + void*, KODI_AE_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_SAMPLE_RATE_V1)( + void*, KODI_AE_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_GET_SPACE_V1)(void*, + KODI_AE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_DRAIN_V1)(void*, KODI_AE_HDL, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_FLUSH_V1)(void*, KODI_AE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_FREE_V1)(void*, KODI_AE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_PAUSE_V1)(void*, KODI_AE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_RESUME_V1)(void*, KODI_AE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_SET_AMPLIFICATION_V1)(void*, + KODI_AE_HDL, + float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_SET_RESAMPLE_RATIO_V1)(void*, + KODI_AE_HDL, + double); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_AUDIOENGINE_STREAM_SET_VOLUME_V1)(void*, + KODI_AE_HDL, + float); + +struct directFuncToKodi_audio_engine_h +{ + void* thisClassHdl; + PFN_INT_KODI_AUDIOENGINE_GET_CURRENT_SINK_FORMAT_V1 kodi_audioengine_get_current_sink_format_v1; + PFN_INT_KODI_AUDIOENGINE_IS_PLANAR_FORMAT_V1 kodi_audioengine_is_planar_format_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_ADD_DATA_V1 kodi_audioengine_stream_add_data_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_DRAIN_V1 kodi_audioengine_stream_drain_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_FLUSH_V1 kodi_audioengine_stream_flush_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_FREE_V1 kodi_audioengine_stream_free_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_AMPLIFICATION_V1 kodi_audioengine_stream_get_amplification_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CACHE_TIME_V1 kodi_audioengine_stream_get_cache_time_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CACHE_TOTAL_V1 kodi_audioengine_stream_get_cache_total_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_CHANNEL_COUNT_V1 kodi_audioengine_stream_get_channel_count_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_DATA_FORMAT_V1 kodi_audioengine_stream_get_data_format_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_DELAY_V1 kodi_audioengine_stream_get_delay_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_FRAME_SIZE_V1 kodi_audioengine_stream_get_frame_size_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_RESAMPLE_RATIO_V1 + kodi_audioengine_stream_get_resample_ratio_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_SAMPLE_RATE_V1 kodi_audioengine_stream_get_sample_rate_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_SPACE_V1 kodi_audioengine_stream_get_space_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_GET_VOLUME_V1 kodi_audioengine_stream_get_volume_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_IS_BUFFERING_V1 kodi_audioengine_stream_is_buffering_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_IS_DRAINED_V1 kodi_audioengine_stream_is_drained_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_IS_DRAINING_V1 kodi_audioengine_stream_is_draining_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_MAKE_V1 kodi_audioengine_stream_make_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_PAUSE_V1 kodi_audioengine_stream_pause_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_RESUME_V1 kodi_audioengine_stream_resume_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_SET_AMPLIFICATION_V1 kodi_audioengine_stream_set_amplification_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_SET_RESAMPLE_RATIO_V1 + kodi_audioengine_stream_set_resample_ratio_v1; + PFN_INT_KODI_AUDIOENGINE_STREAM_SET_VOLUME_V1 kodi_audioengine_stream_set_volume_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_audio_engine_h +{ + void* thisClassHdl; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_AUDIO_ENGINE_FMT +{ + IFC_AUDIO_ENGINE_FMT() = default; + IFC_AUDIO_ENGINE_FMT(const AUDIO_ENGINE_FMT* c_data) + { + if (c_data == nullptr) + return; + + data_format = c_data->data_format; + sample_rate = c_data->sample_rate; + channel_count = c_data->channel_count; + memcpy(channels.data(), c_data->channels, AUDIOENGINE_CH_MAX); + frames = c_data->frames; + frame_size = c_data->frame_size; + } + + void SetCStructure(AUDIO_ENGINE_FMT* c_data) + { + if (c_data == nullptr) + return; + + c_data->data_format = data_format; + c_data->sample_rate = sample_rate; + c_data->channel_count = channel_count; + memcpy(c_data->channels, channels.data(), AUDIOENGINE_CH_MAX); + c_data->frames = frames; + c_data->frame_size = frame_size; + } + + enum AudioEngineDataFormat data_format; + unsigned int sample_rate; + unsigned int channel_count; + std::array channels; + unsigned int frames; + unsigned int frame_size; + + MSGPACK_DEFINE(data_format, sample_rate, channel_count, channels, frames, frame_size); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_audio_engine_h : int +{ + funcParent_kodi_audioengine_get_current_sink_format_v1, + funcParent_kodi_audioengine_is_planar_format_v1, + funcParent_kodi_audioengine_stream_make_v1, + funcParent_kodi_audioengine_stream_free_v1, + funcParent_kodi_audioengine_stream_get_space_v1, + funcParent_kodi_audioengine_stream_add_data_v1, + funcParent_kodi_audioengine_stream_get_delay_v1, + funcParent_kodi_audioengine_stream_is_buffering_v1, + funcParent_kodi_audioengine_stream_get_cache_time_v1, + funcParent_kodi_audioengine_stream_get_cache_total_v1, + funcParent_kodi_audioengine_stream_pause_v1, + funcParent_kodi_audioengine_stream_resume_v1, + funcParent_kodi_audioengine_stream_drain_v1, + funcParent_kodi_audioengine_stream_is_draining_v1, + funcParent_kodi_audioengine_stream_is_drained_v1, + funcParent_kodi_audioengine_stream_flush_v1, + funcParent_kodi_audioengine_stream_get_volume_v1, + funcParent_kodi_audioengine_stream_set_volume_v1, + funcParent_kodi_audioengine_stream_get_amplification_v1, + funcParent_kodi_audioengine_stream_set_amplification_v1, + funcParent_kodi_audioengine_stream_get_frame_size_v1, + funcParent_kodi_audioengine_stream_get_channel_count_v1, + funcParent_kodi_audioengine_stream_get_sample_rate_v1, + funcParent_kodi_audioengine_stream_get_data_format_v1, + funcParent_kodi_audioengine_stream_get_resample_ratio_v1, + funcParent_kodi_audioengine_stream_set_resample_ratio_v1, +} funcParent_audio_engine_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_get_current_sink_format(struct AUDIO_ENGINE_FMT* fmt) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_get_current_sink_format_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_is_planar_format(enum AudioEngineDataFormat format) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_is_planar_format_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_AE_HDL kodi_audioengine_stream_make(const struct AUDIO_ENGINE_FMT* fmt, unsigned int options) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_make_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_make_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_free(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_free_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_free_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_space(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_space_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_add_data(KODI_AE_HDL hdl, uint8_t* const* data, size_t planes, size_t data_size, unsigned int offset, unsigned int frames, unsigned int frame_size, double pts, bool hasDownmix, double centerMixLevel) __INTRODUCED_IN_KODI(1); +typedef std::tuple>, size_t, size_t, unsigned int, unsigned int, unsigned int, double, bool, double> msgParent__IN_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_add_data_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_delay(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_delay_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_buffering(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_buffering_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_time(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_time_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_cache_total(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_cache_total_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_pause(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_pause_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_pause_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_resume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_resume_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_resume_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_drain(KODI_AE_HDL hdl, bool wait) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_drain_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_drain_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_draining(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_draining_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_audioengine_stream_is_drained(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_is_drained_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_flush(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_flush_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_flush_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_volume(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_volume_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_volume(KODI_AE_HDL hdl, float volume) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_volume_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_audioengine_stream_get_amplification(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_amplification_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_amplification(KODI_AE_HDL hdl, float amplify) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_amplification_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_frame_size(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_frame_size_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_channel_count(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_channel_count_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_audioengine_stream_get_sample_rate(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_sample_rate_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT enum AudioEngineDataFormat kodi_audioengine_stream_get_data_format( KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_data_format_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_audioengine_stream_get_resample_ratio(KODI_AE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_get_resample_ratio_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_audioengine_stream_set_resample_ratio(KODI_AE_HDL hdl, double ratio) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_audioengine_stream_set_resample_ratio_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_audio_engine_h : int +{ + funcChild_audio_engine_h_dummy +} funcChild_audio_engine_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/filesystem.h b/xbmc/addons/kodi-dev-kit/src/shared/api/filesystem.h new file mode 100644 index 0000000000000..68a52a571f599 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/filesystem.h @@ -0,0 +1,735 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/filesystem.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_CURLOptiontype +#define MSGPACK_ADD_ENUM_CURLOptiontype +MSGPACK_ADD_ENUM(CURLOptiontype); +#endif +#ifndef MSGPACK_ADD_ENUM_FilePropertyTypes +#define MSGPACK_ADD_ENUM_FilePropertyTypes +MSGPACK_ADD_ENUM(FilePropertyTypes); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_CURL_CREATE_V1)(void*, const char*); +typedef KODI_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_OPEN_FOR_WRITE_V1)(void*, + const char*, + bool); +typedef KODI_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_OPEN_V1)(void*, + const char*, + unsigned int); +typedef KODI_HTTP_HEADER_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_OPEN_V1)(void*, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_CAN_OPEN_DIRECTORY_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_COPY_FILE_V1)(void*, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_CREATE_DIRECTORY_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_DELETE_FILE_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_DIRECTORY_EXISTS_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_AT_END_V1)(void*, KODI_FILE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_CURL_ADD_OPTION_V1)( + void*, KODI_FILE_HDL, enum CURLOptiontype, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_CURL_OPEN_V1)(void*, + KODI_FILE_HDL, + unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_EXISTS_V1)(void*, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_IO_CTL_GET_CACHE_STATUS_V1)( + void*, KODI_FILE_HDL, struct VFS_CACHE_STATUS*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_IO_CTL_GET_SEEK_POSSIBLE_V1)(void*, + KODI_FILE_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_IO_CTL_SET_CACHE_RATE_V1)(void*, + KODI_FILE_HDL, + unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_IO_CTL_SET_RETRY_V1)(void*, + KODI_FILE_HDL, + bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_READ_LINE_V1)(void*, + KODI_FILE_HDL, + char*, + size_t); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_CONTENT_TYPE_V1)(void*, + const char*, + char**, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_COOKIES_V1)(void*, const char*, char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_DIRECTORY_V1)( + void*, const char*, const char*, struct VFS_DIR_ENTRY**, size_t*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_DISK_SPACE_V1)( + void*, const char*, uint64_t*, uint64_t*, uint64_t*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_MIME_TYPE_V1)(void*, + const char*, + char**, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_IS_INTERNET_STREAM_V1)(void*, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_IS_LOCAL_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_IS_ON_LAN_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_IS_REMOTE_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_IS_URL_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_REMOVE_DIRECTORY_RECURSIVE_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_REMOVE_DIRECTORY_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_RENAME_FILE_V1)(void*, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_STAT_FILE_V1)(void*, + const char*, + struct VFS_STAT_STRUCTURE*); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_PROPERTY_VALUE_V1)(void*, + KODI_FILE_HDL, + enum FilePropertyTypes, + const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_CACHE_THUMB_NAME_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_GET_FILE_MD5_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_CHARSET_V1)(void*, + KODI_HTTP_HEADER_HDL); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_HEADER_V1)(void*, + KODI_HTTP_HEADER_HDL); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_MIME_TYPE_V1)(void*, KODI_HTTP_HEADER_HDL); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_PROTO_LINE_V1)(void*, KODI_HTTP_HEADER_HDL); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_VALUE_V1)(void*, + KODI_HTTP_HEADER_HDL, + const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_MAKE_LEGAL_FILENAME_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_MAKE_LEGAL_PATH_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_TRANSLATE_SPECIAL_PROTOCOL_V1)(void*, + const char*); +typedef char**( + ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_PROPERTY_VALUES_V1)(void*, + KODI_FILE_HDL, + enum FilePropertyTypes, + const char*, + size_t*); +typedef char**(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_GET_VALUES_V1)(void*, + KODI_HTTP_HEADER_HDL, + const char*, + size_t*); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_DOWNLOAD_SPEED_V1)(void*, + KODI_FILE_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_CHUNK_SIZE_V1)(void*, KODI_FILE_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_TRUNCATE_V1)(void*, KODI_FILE_HDL, int64_t); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_LENGTH_V1)(void*, KODI_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_GET_POSITION_V1)(void*, KODI_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_SEEK_V1)(void*, + KODI_FILE_HDL, + int64_t, + int); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_READ_V1)(void*, + KODI_FILE_HDL, + uint8_t*, + size_t); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_WRITE_V1)(void*, + KODI_FILE_HDL, + const uint8_t*, + size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_CLOSE_V1)(void*, KODI_FILE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_FILE_FLUSH_V1)(void*, KODI_FILE_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_VFS_HTTP_HEADER_CLOSE_V1)(void*, KODI_HTTP_HEADER_HDL); + +struct directFuncToKodi_filesystem_h +{ + void* thisClassHdl; + /* Function "kodi_vfs_free_directory" only used inside dev-kit library only */ + PFN_INT_KODI_VFS_CAN_OPEN_DIRECTORY_V1 kodi_vfs_can_open_directory_v1; + PFN_INT_KODI_VFS_COPY_FILE_V1 kodi_vfs_copy_file_v1; + PFN_INT_KODI_VFS_CREATE_DIRECTORY_V1 kodi_vfs_create_directory_v1; + PFN_INT_KODI_VFS_DELETE_FILE_V1 kodi_vfs_delete_file_v1; + PFN_INT_KODI_VFS_DIRECTORY_EXISTS_V1 kodi_vfs_directory_exists_v1; + PFN_INT_KODI_VFS_FILE_AT_END_V1 kodi_vfs_file_at_end_v1; + PFN_INT_KODI_VFS_FILE_CLOSE_V1 kodi_vfs_file_close_v1; + PFN_INT_KODI_VFS_FILE_CURL_ADD_OPTION_V1 kodi_vfs_file_curl_add_option_v1; + PFN_INT_KODI_VFS_FILE_CURL_CREATE_V1 kodi_vfs_file_curl_create_v1; + PFN_INT_KODI_VFS_FILE_CURL_OPEN_V1 kodi_vfs_file_curl_open_v1; + PFN_INT_KODI_VFS_FILE_EXISTS_V1 kodi_vfs_file_exists_v1; + PFN_INT_KODI_VFS_FILE_FLUSH_V1 kodi_vfs_file_flush_v1; + PFN_INT_KODI_VFS_FILE_GET_CHUNK_SIZE_V1 kodi_vfs_file_get_chunk_size_v1; + PFN_INT_KODI_VFS_FILE_GET_DOWNLOAD_SPEED_V1 kodi_vfs_file_get_download_speed_v1; + PFN_INT_KODI_VFS_FILE_GET_LENGTH_V1 kodi_vfs_file_get_length_v1; + PFN_INT_KODI_VFS_FILE_GET_POSITION_V1 kodi_vfs_file_get_position_v1; + PFN_INT_KODI_VFS_FILE_GET_PROPERTY_VALUES_V1 kodi_vfs_file_get_property_values_v1; + PFN_INT_KODI_VFS_FILE_GET_PROPERTY_VALUE_V1 kodi_vfs_file_get_property_value_v1; + PFN_INT_KODI_VFS_FILE_IO_CTL_GET_CACHE_STATUS_V1 kodi_vfs_file_io_ctl_get_cache_status_v1; + PFN_INT_KODI_VFS_FILE_IO_CTL_GET_SEEK_POSSIBLE_V1 kodi_vfs_file_io_ctl_get_seek_possible_v1; + PFN_INT_KODI_VFS_FILE_IO_CTL_SET_CACHE_RATE_V1 kodi_vfs_file_io_ctl_set_cache_rate_v1; + PFN_INT_KODI_VFS_FILE_IO_CTL_SET_RETRY_V1 kodi_vfs_file_io_ctl_set_retry_v1; + PFN_INT_KODI_VFS_FILE_OPEN_FOR_WRITE_V1 kodi_vfs_file_open_for_write_v1; + PFN_INT_KODI_VFS_FILE_OPEN_V1 kodi_vfs_file_open_v1; + PFN_INT_KODI_VFS_FILE_READ_LINE_V1 kodi_vfs_file_read_line_v1; + PFN_INT_KODI_VFS_FILE_READ_V1 kodi_vfs_file_read_v1; + PFN_INT_KODI_VFS_FILE_SEEK_V1 kodi_vfs_file_seek_v1; + PFN_INT_KODI_VFS_FILE_TRUNCATE_V1 kodi_vfs_file_truncate_v1; + PFN_INT_KODI_VFS_FILE_WRITE_V1 kodi_vfs_file_write_v1; + PFN_INT_KODI_VFS_GET_CACHE_THUMB_NAME_V1 kodi_vfs_get_cache_thumb_name_v1; + PFN_INT_KODI_VFS_GET_CONTENT_TYPE_V1 kodi_vfs_get_content_type_v1; + PFN_INT_KODI_VFS_GET_COOKIES_V1 kodi_vfs_get_cookies_v1; + PFN_INT_KODI_VFS_GET_DIRECTORY_V1 kodi_vfs_get_directory_v1; + PFN_INT_KODI_VFS_GET_DISK_SPACE_V1 kodi_vfs_get_disk_space_v1; + PFN_INT_KODI_VFS_GET_FILE_MD5_V1 kodi_vfs_get_file_md5_v1; + PFN_INT_KODI_VFS_GET_MIME_TYPE_V1 kodi_vfs_get_mime_type_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_CLOSE_V1 kodi_vfs_http_header_close_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_CHARSET_V1 kodi_vfs_http_header_get_charset_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_HEADER_V1 kodi_vfs_http_header_get_header_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_MIME_TYPE_V1 kodi_vfs_http_header_get_mime_type_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_PROTO_LINE_V1 kodi_vfs_http_header_get_proto_line_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_VALUES_V1 kodi_vfs_http_header_get_values_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_GET_VALUE_V1 kodi_vfs_http_header_get_value_v1; + PFN_INT_KODI_VFS_HTTP_HEADER_OPEN_V1 kodi_vfs_http_header_open_v1; + PFN_INT_KODI_VFS_IS_INTERNET_STREAM_V1 kodi_vfs_is_internet_stream_v1; + PFN_INT_KODI_VFS_IS_LOCAL_V1 kodi_vfs_is_local_v1; + PFN_INT_KODI_VFS_IS_ON_LAN_V1 kodi_vfs_is_on_lan_v1; + PFN_INT_KODI_VFS_IS_REMOTE_V1 kodi_vfs_is_remote_v1; + PFN_INT_KODI_VFS_IS_URL_V1 kodi_vfs_is_url_v1; + PFN_INT_KODI_VFS_MAKE_LEGAL_FILENAME_V1 kodi_vfs_make_legal_filename_v1; + PFN_INT_KODI_VFS_MAKE_LEGAL_PATH_V1 kodi_vfs_make_legal_path_v1; + PFN_INT_KODI_VFS_REMOVE_DIRECTORY_RECURSIVE_V1 kodi_vfs_remove_directory_recursive_v1; + PFN_INT_KODI_VFS_REMOVE_DIRECTORY_V1 kodi_vfs_remove_directory_v1; + PFN_INT_KODI_VFS_RENAME_FILE_V1 kodi_vfs_rename_file_v1; + PFN_INT_KODI_VFS_STAT_FILE_V1 kodi_vfs_stat_file_v1; + PFN_INT_KODI_VFS_TRANSLATE_SPECIAL_PROTOCOL_V1 kodi_vfs_translate_special_protocol_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_filesystem_h +{ + void* thisClassHdl; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_VFS_PROPERTY +{ + IFC_VFS_PROPERTY() = default; + IFC_VFS_PROPERTY(const VFS_PROPERTY* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->name) + name = c_data->name; + if (c_data->val) + val = c_data->val; + } + + static inline void CleanCStructure(VFS_PROPERTY* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->name) + { + free(c_data->name); + c_data->name = nullptr; + } + if (c_data->val) + { + free(c_data->val); + c_data->val = nullptr; + } + } + + void SetCStructure(VFS_PROPERTY* c_data) + { + if (c_data == nullptr) + return; + + if (!name.empty()) + c_data->name = strdup(name.c_str()); + if (!val.empty()) + c_data->val = strdup(val.c_str()); + } + + std::string name; + std::string val; + + MSGPACK_DEFINE(name, val); +}; + +struct IFC_VFS_DIR_ENTRY +{ + IFC_VFS_DIR_ENTRY() = default; + IFC_VFS_DIR_ENTRY(const VFS_DIR_ENTRY* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->label) + label = c_data->label; + if (c_data->title) + title = c_data->title; + if (c_data->path) + path = c_data->path; + num_props = c_data->num_props; + if (c_data->properties && c_data->num_props != 0) + { + for (size_t i = 0; i < c_data->num_props; ++i) + properties.emplace_back(&c_data->properties[i]); + } + date_time = c_data->date_time; + folder = c_data->folder; + size = c_data->size; + } + + static inline void CleanCStructure(VFS_DIR_ENTRY* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->label) + { + free(c_data->label); + c_data->label = nullptr; + } + if (c_data->title) + { + free(c_data->title); + c_data->title = nullptr; + } + if (c_data->path) + { + free(c_data->path); + c_data->path = nullptr; + } + if (c_data->properties) + { + IFC_VFS_PROPERTY helper; + for (size_t i = 0; i < c_data->num_props; ++i) + helper.CleanCStructure(&c_data->properties[i]); + free(c_data->properties); + c_data->properties = nullptr; + } + } + + void SetCStructure(VFS_DIR_ENTRY* c_data) + { + if (c_data == nullptr) + return; + + if (!label.empty()) + c_data->label = strdup(label.c_str()); + if (!title.empty()) + c_data->title = strdup(title.c_str()); + if (!path.empty()) + c_data->path = strdup(path.c_str()); + c_data->num_props = num_props; + if (!properties.empty()) + { + c_data->properties = + static_cast(malloc(sizeof(VFS_PROPERTY) * properties.size())); + for (size_t i = 0; i < properties.size(); ++i) + properties[i].SetCStructure(&c_data->properties[i]); + } + c_data->date_time = date_time; + c_data->folder = folder; + c_data->size = size; + } + + std::string label; + std::string title; + std::string path; + size_t num_props; + std::vector properties; + time_t date_time; + bool folder; + uint64_t size; + + MSGPACK_DEFINE(label, title, path, num_props, properties, date_time, folder, size); +}; + +struct IFC_VFS_STAT_STRUCTURE +{ + IFC_VFS_STAT_STRUCTURE() = default; + IFC_VFS_STAT_STRUCTURE(const VFS_STAT_STRUCTURE* c_data) + { + if (c_data == nullptr) + return; + + deviceId = c_data->deviceId; + size = c_data->size; + accessTime = c_data->accessTime; + modificationTime = c_data->modificationTime; + statusTime = c_data->statusTime; + isDirectory = c_data->isDirectory; + isSymLink = c_data->isSymLink; + isBlock = c_data->isBlock; + isCharacter = c_data->isCharacter; + isFifo = c_data->isFifo; + isRegular = c_data->isRegular; + isSocket = c_data->isSocket; + fileSerialNumber = c_data->fileSerialNumber; + } + + void SetCStructure(VFS_STAT_STRUCTURE* c_data) + { + if (c_data == nullptr) + return; + + c_data->deviceId = deviceId; + c_data->size = size; + c_data->accessTime = accessTime; + c_data->modificationTime = modificationTime; + c_data->statusTime = statusTime; + c_data->isDirectory = isDirectory; + c_data->isSymLink = isSymLink; + c_data->isBlock = isBlock; + c_data->isCharacter = isCharacter; + c_data->isFifo = isFifo; + c_data->isRegular = isRegular; + c_data->isSocket = isSocket; + c_data->fileSerialNumber = fileSerialNumber; + } + + uint32_t deviceId; + uint64_t size; + time_t accessTime; + time_t modificationTime; + time_t statusTime; + bool isDirectory; + bool isSymLink; + bool isBlock; + bool isCharacter; + bool isFifo; + bool isRegular; + bool isSocket; + uint64_t fileSerialNumber; + + MSGPACK_DEFINE(deviceId, + size, + accessTime, + modificationTime, + statusTime, + isDirectory, + isSymLink, + isBlock, + isCharacter, + isFifo, + isRegular, + isSocket, + fileSerialNumber); +}; + +struct IFC_VFS_CACHE_STATUS +{ + IFC_VFS_CACHE_STATUS() = default; + IFC_VFS_CACHE_STATUS(const VFS_CACHE_STATUS* c_data) + { + if (c_data == nullptr) + return; + + forward = c_data->forward; + maxrate = c_data->maxrate; + currate = c_data->currate; + lowspeed = c_data->lowspeed; + } + + void SetCStructure(VFS_CACHE_STATUS* c_data) + { + if (c_data == nullptr) + return; + + c_data->forward = forward; + c_data->maxrate = maxrate; + c_data->currate = currate; + c_data->lowspeed = lowspeed; + } + + uint64_t forward; + unsigned int maxrate; + unsigned int currate; + bool lowspeed; + + MSGPACK_DEFINE(forward, maxrate, currate, lowspeed); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_filesystem_h : int +{ + funcParent_kodi_vfs_can_open_directory_v1, + funcParent_kodi_vfs_create_directory_v1, + funcParent_kodi_vfs_remove_directory_v1, + funcParent_kodi_vfs_remove_directory_recursive_v1, + funcParent_kodi_vfs_directory_exists_v1, + funcParent_kodi_vfs_get_directory_v1, + funcParent_kodi_vfs_free_directory_v1, + funcParent_kodi_vfs_file_exists_v1, + funcParent_kodi_vfs_stat_file_v1, + funcParent_kodi_vfs_delete_file_v1, + funcParent_kodi_vfs_rename_file_v1, + funcParent_kodi_vfs_copy_file_v1, + funcParent_kodi_vfs_get_file_md5_v1, + funcParent_kodi_vfs_get_cache_thumb_name_v1, + funcParent_kodi_vfs_make_legal_filename_v1, + funcParent_kodi_vfs_make_legal_path_v1, + funcParent_kodi_vfs_translate_special_protocol_v1, + funcParent_kodi_vfs_is_internet_stream_v1, + funcParent_kodi_vfs_is_on_lan_v1, + funcParent_kodi_vfs_is_remote_v1, + funcParent_kodi_vfs_is_local_v1, + funcParent_kodi_vfs_is_url_v1, + funcParent_kodi_vfs_get_mime_type_v1, + funcParent_kodi_vfs_get_content_type_v1, + funcParent_kodi_vfs_get_cookies_v1, + funcParent_kodi_vfs_get_disk_space_v1, + funcParent_kodi_vfs_http_header_open_v1, + funcParent_kodi_vfs_http_header_close_v1, + funcParent_kodi_vfs_http_header_get_value_v1, + funcParent_kodi_vfs_http_header_get_values_v1, + funcParent_kodi_vfs_http_header_get_header_v1, + funcParent_kodi_vfs_http_header_get_mime_type_v1, + funcParent_kodi_vfs_http_header_get_charset_v1, + funcParent_kodi_vfs_http_header_get_proto_line_v1, + funcParent_kodi_vfs_file_open_v1, + funcParent_kodi_vfs_file_open_for_write_v1, + funcParent_kodi_vfs_file_curl_create_v1, + funcParent_kodi_vfs_file_curl_add_option_v1, + funcParent_kodi_vfs_file_curl_open_v1, + funcParent_kodi_vfs_file_close_v1, + funcParent_kodi_vfs_file_read_v1, + funcParent_kodi_vfs_file_read_line_v1, + funcParent_kodi_vfs_file_write_v1, + funcParent_kodi_vfs_file_flush_v1, + funcParent_kodi_vfs_file_seek_v1, + funcParent_kodi_vfs_file_truncate_v1, + funcParent_kodi_vfs_file_get_position_v1, + funcParent_kodi_vfs_file_get_length_v1, + funcParent_kodi_vfs_file_at_end_v1, + funcParent_kodi_vfs_file_get_download_speed_v1, + funcParent_kodi_vfs_file_get_chunk_size_v1, + funcParent_kodi_vfs_file_io_ctl_get_seek_possible_v1, + funcParent_kodi_vfs_file_io_ctl_get_cache_status_v1, + funcParent_kodi_vfs_file_io_ctl_set_cache_rate_v1, + funcParent_kodi_vfs_file_io_ctl_set_retry_v1, + funcParent_kodi_vfs_file_get_property_value_v1, + funcParent_kodi_vfs_file_get_property_values_v1, +} funcParent_filesystem_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_can_open_directory(const char* url) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_can_open_directory_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_can_open_directory_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_create_directory(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_create_directory_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_create_directory_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_remove_directory_recursive(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_remove_directory_recursive_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_directory_exists(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_directory_exists_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_directory_exists_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_directory(const char* path, const char* mask, struct VFS_DIR_ENTRY** items, size_t* num_items) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_directory_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_get_directory_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_vfs_free_directory(struct VFS_DIR_ENTRY* items, size_t num_items) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_vfs_free_directory - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_vfs_free_directory - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_exists(const char* filename, bool useCache) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_exists_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_exists_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_stat_file(const char* filename, struct VFS_STAT_STRUCTURE* buffer) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_stat_file_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_stat_file_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_delete_file(const char* filename) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_delete_file_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_delete_file_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_rename_file(const char* filename, const char* newFileName) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_rename_file_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_rename_file_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_copy_file(const char* filename, const char* dest) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_copy_file_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_copy_file_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_file_md5(const char* filename) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_file_md5_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_file_md5_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_get_cache_thumb_name(const char* filename) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_cache_thumb_name_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_filename(const char* filename) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_filename_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_make_legal_path(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_make_legal_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_make_legal_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_translate_special_protocol(const char* strSource) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_translate_special_protocol_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_internet_stream(const char* path, bool strictCheck) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_is_internet_stream_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_on_lan(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_is_on_lan_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_is_on_lan_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_remote(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_is_remote_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_is_remote_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_local(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_is_local_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_is_local_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_is_url(const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_is_url_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_is_url_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_mime_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_mime_type_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_mime_type_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_content_type(const char* url, char** content, const char* useragent) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_content_type_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_content_type_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_cookies(const char* url, char** cookies) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_cookies_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_cookies_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_get_disk_space(const char* path, uint64_t* capacity, uint64_t* free, uint64_t* available) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_get_disk_space_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_get_disk_space_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_HTTP_HEADER_HDL kodi_vfs_http_header_open(const char* url) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_open_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_vfs_http_header_close(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_close_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_close_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_value(KODI_HTTP_HEADER_HDL hdl, const char* param) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char** kodi_vfs_http_header_get_values(KODI_HTTP_HEADER_HDL hdl, const char* param, size_t* length) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_http_header_get_values_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_header(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_header_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_mime_type(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_mime_type_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_charset(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_charset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_http_header_get_proto_line(KODI_HTTP_HEADER_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_http_header_get_proto_line_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open(const char* filename, unsigned int flags) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_open_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_open_for_write(const char* filename, bool overwrite) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_open_for_write_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_FILE_HDL kodi_vfs_file_curl_create(const char* url) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_curl_create_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_create_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_add_option(KODI_FILE_HDL hdl, enum CURLOptiontype type, const char* name, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_add_option_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_curl_open(KODI_FILE_HDL hdl, unsigned int flags) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_curl_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_curl_open_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_close(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_close_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_close_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_read(KODI_FILE_HDL hdl, uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_read_v1; /* Autogenerated */ +typedef std::tuple> msgParent_OUT_kodi_vfs_file_read_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_read_line(KODI_FILE_HDL hdl, char* szLine, size_t lineLength) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_read_line_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_read_line_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT ssize_t kodi_vfs_file_write(KODI_FILE_HDL hdl, const uint8_t* ptr, size_t size) __INTRODUCED_IN_KODI(1); +typedef std::tuple, size_t> msgParent__IN_kodi_vfs_file_write_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_write_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_vfs_file_flush(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_flush_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_flush_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_seek(KODI_FILE_HDL hdl, int64_t position, int whence) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_seek_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_seek_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_truncate(KODI_FILE_HDL hdl, int64_t size) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_truncate_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_truncate_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_position(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_get_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int64_t kodi_vfs_file_get_length(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_length_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_get_length_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_at_end(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_at_end_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_at_end_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_vfs_file_get_download_speed(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_get_download_speed_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_vfs_file_get_chunk_size(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_get_chunk_size_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_seek_possible(KODI_FILE_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_seek_possible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_get_cache_status(KODI_FILE_HDL hdl, struct VFS_CACHE_STATUS* status) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_get_cache_status_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, unsigned int rate) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_cache_rate_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_retry(KODI_FILE_HDL hdl, bool retry) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_io_ctl_set_retry_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_vfs_file_get_property_value(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_vfs_file_get_property_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char** kodi_vfs_file_get_property_values(KODI_FILE_HDL hdl, enum FilePropertyTypes type, const char* name, size_t* length) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgParent_OUT_kodi_vfs_file_get_property_values_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_filesystem_h : int +{ + funcChild_filesystem_h_dummy +} funcChild_filesystem_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/general.h b/xbmc/addons/kodi-dev-kit/src/shared/api/general.h new file mode 100644 index 0000000000000..8c2b1fdcc418e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/general.h @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/general.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_LangFormats +#define MSGPACK_ADD_ENUM_LangFormats +MSGPACK_ADD_ENUM(LangFormats); +#endif +#ifndef MSGPACK_ADD_ENUM_QueueMsg +#define MSGPACK_ADD_ENUM_QueueMsg +MSGPACK_ADD_ENUM(QueueMsg); +#endif +#ifndef MSGPACK_ADD_ENUM_DigestType +#define MSGPACK_ADD_ENUM_DigestType +MSGPACK_ADD_ENUM(DigestType); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_CHANGE_KEYBOARD_LAYOUT_V1)(void*, char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_KEYBOARD_LAYOUT_V1)(void*, + int, + char**, + struct AddonKeyboardKeyTable*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_IS_ADDON_AVILABLE_V1)(void*, + const char*, + char**, + bool*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_CURRENT_SKIN_ID_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_DIGEST_V1)(void*, enum DigestType, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_LANGUAGE_V1)(void*, enum LangFormats, bool); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_LOCALIZED_STRING_V1)(void*, long); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_REGION_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_UNKNOWN_TO_UTF8_V1)(void*, const char*, bool*, bool); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_GLOBAL_IDLE_TIME_V1)(void*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GET_FREE_MEM_V1)(void*, long*, long*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_PLAY_SFX_V1)(void*, const char*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_QUEUE_NOTIFICATION_V1)( + void*, enum QueueMsg, const char*, const char*, const char*, unsigned int, bool, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_STOP_SFX_V1)(void*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_VERSION_V1)( + void*, char**, int*, int*, char**, char**, char**); + +struct directFuncToKodi_general_h +{ + void* thisClassHdl; + PFN_INT_KODI_CHANGE_KEYBOARD_LAYOUT_V1 kodi_change_keyboard_layout_v1; + PFN_INT_KODI_GET_CURRENT_SKIN_ID_V1 kodi_get_current_skin_id_v1; + PFN_INT_KODI_GET_DIGEST_V1 kodi_get_digest_v1; + PFN_INT_KODI_GET_FREE_MEM_V1 kodi_get_free_mem_v1; + PFN_INT_KODI_GET_GLOBAL_IDLE_TIME_V1 kodi_get_global_idle_time_v1; + PFN_INT_KODI_GET_KEYBOARD_LAYOUT_V1 kodi_get_keyboard_layout_v1; + PFN_INT_KODI_GET_LANGUAGE_V1 kodi_get_language_v1; + PFN_INT_KODI_GET_LOCALIZED_STRING_V1 kodi_get_localized_string_v1; + PFN_INT_KODI_GET_REGION_V1 kodi_get_region_v1; + PFN_INT_KODI_IS_ADDON_AVILABLE_V1 kodi_is_addon_avilable_v1; + PFN_INT_KODI_PLAY_SFX_V1 kodi_play_sfx_v1; + PFN_INT_KODI_QUEUE_NOTIFICATION_V1 kodi_queue_notification_v1; + PFN_INT_KODI_STOP_SFX_V1 kodi_stop_sfx_v1; + PFN_INT_KODI_UNKNOWN_TO_UTF8_V1 kodi_unknown_to_utf8_v1; + PFN_INT_KODI_VERSION_V1 kodi_version_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_general_h +{ + void* thisClassHdl; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_AddonKeyboardKeyTable +{ + IFC_AddonKeyboardKeyTable() = default; + IFC_AddonKeyboardKeyTable(const AddonKeyboardKeyTable* c_data) + { + if (c_data == nullptr) + return; + + for (unsigned int i = 0; i < STD_KB_BUTTONS_MAX_ROWS; ++i) + { + for (unsigned int j = 0; j < STD_KB_BUTTONS_PER_ROW; ++j) + { + keys[i][j] = c_data->keys[i][j] ? c_data->keys[i][j] : ""; + } + } + } + + void SetCStructure(AddonKeyboardKeyTable* c_data) + { + if (c_data == nullptr) + return; + + for (unsigned int i = 0; i < STD_KB_BUTTONS_MAX_ROWS; ++i) + { + for (unsigned int j = 0; j < STD_KB_BUTTONS_PER_ROW; ++j) + { + if (c_data->keys[i][j]) + free(c_data->keys[i][j]); + c_data->keys[i][j] = strdup(keys[i][j].c_str()); + } + } + } + + std::array, STD_KB_BUTTONS_MAX_ROWS> keys; + + MSGPACK_DEFINE(keys); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_general_h : int +{ + funcParent_kodi_get_localized_string_v1, + funcParent_kodi_get_free_mem_v1, + funcParent_kodi_unknown_to_utf8_v1, + funcParent_kodi_get_language_v1, + funcParent_kodi_queue_notification_v1, + funcParent_kodi_get_digest_v1, + funcParent_kodi_get_region_v1, + funcParent_kodi_get_global_idle_time_v1, + funcParent_kodi_is_addon_avilable_v1, + funcParent_kodi_version_v1, + funcParent_kodi_get_current_skin_id_v1, + funcParent_kodi_get_keyboard_layout_v1, + funcParent_kodi_change_keyboard_layout_v1, + funcParent_kodi_play_sfx_v1, + funcParent_kodi_stop_sfx_v1, +} funcParent_general_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT char* kodi_get_localized_string(long label_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_localized_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_localized_string_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_get_free_mem(long* free, long* total, bool as_bytes) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_free_mem_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_free_mem_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_unknown_to_utf8(const char* source, bool* ret, bool failOnBadChar) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_unknown_to_utf8_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_unknown_to_utf8_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_get_language(enum LangFormats format, bool region) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_language_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_language_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_queue_notification(enum QueueMsg type, const char* header, const char* message, const char* imageFile, unsigned int displayTime, bool withSound, unsigned int messageTime) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_queue_notification_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_queue_notification_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_get_digest(enum DigestType type, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_digest_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_digest_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_get_region(const char* id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_region_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_region_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_get_global_idle_time() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_global_idle_time_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_global_idle_time_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_is_addon_avilable(const char* id, char** version, bool* enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_is_addon_avilable_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_is_addon_avilable_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_version( char** compile_name, int* major, int* minor, char** revision, char** tag, char** tagversion) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_version_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_version_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_get_current_skin_id() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_current_skin_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_current_skin_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_get_keyboard_layout(int modifier_key, char** layout_name, struct AddonKeyboardKeyTable* layout) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_get_keyboard_layout_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_get_keyboard_layout_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_change_keyboard_layout(char** layout_name) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_change_keyboard_layout_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_change_keyboard_layout_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_play_sfx(const char* filename, bool use_cached) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_play_sfx_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_play_sfx_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_stop_sfx() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_stop_sfx_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_stop_sfx_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_general_h : int +{ + funcChild_general_h_dummy +} funcChild_general_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/button.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/button.h new file mode 100644 index 0000000000000..1b946a93d1e8d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/button.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/button.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_GET_LABEL2_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_GET_LABEL_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_LABEL2_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_button_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_GET_LABEL2_V1 kodi_gui_controls_button_get_label2_v1; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_GET_LABEL_V1 kodi_gui_controls_button_get_label_v1; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_ENABLED_V1 kodi_gui_controls_button_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_LABEL2_V1 kodi_gui_controls_button_set_label2_v1; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_LABEL_V1 kodi_gui_controls_button_set_label_v1; + PFN_INT_KODI_GUI_CONTROLS_BUTTON_SET_VISIBLE_V1 kodi_gui_controls_button_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_button_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_button_h : int +{ + funcParent_kodi_gui_controls_button_set_visible_v1, + funcParent_kodi_gui_controls_button_set_enabled_v1, + funcParent_kodi_gui_controls_button_set_label_v1, + funcParent_kodi_gui_controls_button_get_label_v1, + funcParent_kodi_gui_controls_button_set_label2_v1, + funcParent_kodi_gui_controls_button_get_label2_v1, +} funcParent_gui_controls_button_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_button_set_label2(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_set_label2_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_button_get_label2(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_button_get_label2_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_button_h : int +{ + funcChild_gui_controls_button_h_dummy +} funcChild_gui_controls_button_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h new file mode 100644 index 0000000000000..04da3f6cfab38 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/edit.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_LABEL_V1)(void*, KODI_GUI_CONTROL_HANDLE); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_TEXT_V1)(void*, KODI_GUI_CONTROL_HANDLE); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_CURSOR_POSITION_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_CURSOR_POSITION_V1)( + void*, KODI_GUI_CONTROL_HANDLE, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_INPUT_TYPE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_TEXT_V1)(void*, + KODI_GUI_CONTROL_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_edit_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_CURSOR_POSITION_V1 + kodi_gui_controls_edit_get_cursor_position_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_LABEL_V1 kodi_gui_controls_edit_get_label_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_GET_TEXT_V1 kodi_gui_controls_edit_get_text_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_CURSOR_POSITION_V1 + kodi_gui_controls_edit_set_cursor_position_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_ENABLED_V1 kodi_gui_controls_edit_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_INPUT_TYPE_V1 kodi_gui_controls_edit_set_input_type_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_LABEL_V1 kodi_gui_controls_edit_set_label_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_TEXT_V1 kodi_gui_controls_edit_set_text_v1; + PFN_INT_KODI_GUI_CONTROLS_EDIT_SET_VISIBLE_V1 kodi_gui_controls_edit_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_edit_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_edit_h : int +{ + funcParent_kodi_gui_controls_edit_set_visible_v1, + funcParent_kodi_gui_controls_edit_set_enabled_v1, + funcParent_kodi_gui_controls_edit_set_label_v1, + funcParent_kodi_gui_controls_edit_get_label_v1, + funcParent_kodi_gui_controls_edit_set_text_v1, + funcParent_kodi_gui_controls_edit_get_text_v1, + funcParent_kodi_gui_controls_edit_set_cursor_position_v1, + funcParent_kodi_gui_controls_edit_get_cursor_position_v1, + funcParent_kodi_gui_controls_edit_set_input_type_v1, +} funcParent_gui_controls_edit_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_edit_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_cursor_position(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_cursor_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT unsigned int kodi_gui_controls_edit_get_cursor_position( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_get_cursor_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_edit_set_input_type(KODI_GUI_CONTROL_HANDLE handle, int type, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_edit_set_input_type_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_edit_h : int +{ + funcChild_gui_controls_edit_h_dummy +} funcChild_gui_controls_edit_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h new file mode 100644 index 0000000000000..8dd83afa4d629 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/fade_label.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_GET_LABEL_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_ADD_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_RESET_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_SET_SCROLLING_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_fade_label_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_ADD_LABEL_V1 kodi_gui_controls_fade_label_add_label_v1; + PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_GET_LABEL_V1 kodi_gui_controls_fade_label_get_label_v1; + PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_RESET_V1 kodi_gui_controls_fade_label_reset_v1; + PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_SET_SCROLLING_V1 + kodi_gui_controls_fade_label_set_scrolling_v1; + PFN_INT_KODI_GUI_CONTROLS_FADE_LABEL_SET_VISIBLE_V1 kodi_gui_controls_fade_label_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_fade_label_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_fade_label_h : int +{ + funcParent_kodi_gui_controls_fade_label_set_visible_v1, + funcParent_kodi_gui_controls_fade_label_add_label_v1, + funcParent_kodi_gui_controls_fade_label_get_label_v1, + funcParent_kodi_gui_controls_fade_label_set_scrolling_v1, + funcParent_kodi_gui_controls_fade_label_reset_v1, +} funcParent_gui_controls_fade_label_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_add_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_add_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_fade_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_get_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_set_scrolling(KODI_GUI_CONTROL_HANDLE handle, bool scroll) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_set_scrolling_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_fade_label_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_fade_label_reset_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_fade_label_h : int +{ + funcChild_gui_controls_fade_label_h_dummy +} funcChild_gui_controls_fade_label_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/image.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/image.h new file mode 100644 index 0000000000000..15fda17d87816 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/image.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/image.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_COLOR_DIFFUSE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, uint32_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_FILENAME_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_image_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_COLOR_DIFFUSE_V1 kodi_gui_controls_image_set_color_diffuse_v1; + PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_FILENAME_V1 kodi_gui_controls_image_set_filename_v1; + PFN_INT_KODI_GUI_CONTROLS_IMAGE_SET_VISIBLE_V1 kodi_gui_controls_image_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_image_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_image_h : int +{ + funcParent_kodi_gui_controls_image_set_visible_v1, + funcParent_kodi_gui_controls_image_set_filename_v1, + funcParent_kodi_gui_controls_image_set_color_diffuse_v1, +} funcParent_gui_controls_image_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_filename(KODI_GUI_CONTROL_HANDLE handle, const char* filename, bool use_cache) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_filename_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_image_set_color_diffuse(KODI_GUI_CONTROL_HANDLE handle, uint32_t color_diffuse) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_image_set_color_diffuse_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_image_h : int +{ + funcChild_gui_controls_image_h_dummy +} funcChild_gui_controls_image_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/label.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/label.h new file mode 100644 index 0000000000000..4176d76d85a37 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/label.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/label.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_LABEL_GET_LABEL_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_LABEL_SET_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_LABEL_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_label_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_LABEL_GET_LABEL_V1 kodi_gui_controls_label_get_label_v1; + PFN_INT_KODI_GUI_CONTROLS_LABEL_SET_LABEL_V1 kodi_gui_controls_label_set_label_v1; + PFN_INT_KODI_GUI_CONTROLS_LABEL_SET_VISIBLE_V1 kodi_gui_controls_label_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_label_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_label_h : int +{ + funcParent_kodi_gui_controls_label_set_visible_v1, + funcParent_kodi_gui_controls_label_set_label_v1, + funcParent_kodi_gui_controls_label_get_label_v1, +} funcParent_gui_controls_label_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_label_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_label_set_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_label_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_label_get_label_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_label_h : int +{ + funcChild_gui_controls_label_h_dummy +} funcChild_gui_controls_label_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h new file mode 100644 index 0000000000000..5a39cc52746a7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/progress.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_PROGRESS_GET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_PROGRESS_SET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_PROGRESS_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_progress_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_PROGRESS_GET_PERCENTAGE_V1 kodi_gui_controls_progress_get_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_PROGRESS_SET_PERCENTAGE_V1 kodi_gui_controls_progress_set_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_PROGRESS_SET_VISIBLE_V1 kodi_gui_controls_progress_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_progress_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_progress_h : int +{ + funcParent_kodi_gui_controls_progress_set_visible_v1, + funcParent_kodi_gui_controls_progress_set_percentage_v1, + funcParent_kodi_gui_controls_progress_get_percentage_v1, +} funcParent_gui_controls_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_progress_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_set_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_progress_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_progress_get_percentage_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_progress_h : int +{ + funcChild_gui_controls_progress_h_dummy +} funcChild_gui_controls_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h new file mode 100644 index 0000000000000..0a4ce9bd19ae2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/radio_button.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_IS_SELECTED_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef char*(ATTR_INT_APIENTRYP + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_GET_LABEL_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_SELECTED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_radio_button_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_GET_LABEL_V1 kodi_gui_controls_radio_button_get_label_v1; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_IS_SELECTED_V1 + kodi_gui_controls_radio_button_is_selected_v1; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_ENABLED_V1 + kodi_gui_controls_radio_button_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_LABEL_V1 kodi_gui_controls_radio_button_set_label_v1; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_SELECTED_V1 + kodi_gui_controls_radio_button_set_selected_v1; + PFN_INT_KODI_GUI_CONTROLS_RADIO_BUTTON_SET_VISIBLE_V1 + kodi_gui_controls_radio_button_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_radio_button_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_radio_button_h : int +{ + funcParent_kodi_gui_controls_radio_button_set_visible_v1, + funcParent_kodi_gui_controls_radio_button_set_enabled_v1, + funcParent_kodi_gui_controls_radio_button_set_label_v1, + funcParent_kodi_gui_controls_radio_button_get_label_v1, + funcParent_kodi_gui_controls_radio_button_set_selected_v1, + funcParent_kodi_gui_controls_radio_button_is_selected_v1, +} funcParent_gui_controls_radio_button_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_label(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_radio_button_get_label(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_get_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_button_set_selected(KODI_GUI_CONTROL_HANDLE handle, bool selected) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_set_selected_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_controls_radio_button_is_selected(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_button_is_selected_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_radio_button_h : int +{ + funcChild_gui_controls_radio_button_h_dummy +} funcChild_gui_controls_radio_button_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h new file mode 100644 index 0000000000000..ac00909810fe4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/rendering.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_RADIO_RENDERING_DESTROY_V1)( + void*, KODI_GUI_CONTROL_HANDLE); + +struct directFuncToKodi_gui_controls_rendering_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_RADIO_RENDERING_DESTROY_V1 kodi_gui_controls_radio_rendering_destroy_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_rendering_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_rendering_h : int +{ + funcParent_kodi_gui_controls_radio_rendering_destroy_v1, +} funcParent_gui_controls_rendering_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_radio_rendering_destroy(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_radio_rendering_destroy_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_rendering_h : int +{ + funcChild_gui_controls_rendering_h_dummy +} funcChild_gui_controls_rendering_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h new file mode 100644 index 0000000000000..03273a5f428c8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/settings_slider.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_RESET_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_INTERVAL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_INTERVAL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_TEXT_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_settings_slider_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_FLOAT_VALUE_V1 + kodi_gui_controls_settings_slider_get_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_INT_VALUE_V1 + kodi_gui_controls_settings_slider_get_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_GET_PERCENTAGE_V1 + kodi_gui_controls_settings_slider_get_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_RESET_V1 kodi_gui_controls_settings_slider_reset_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_ENABLED_V1 + kodi_gui_controls_settings_slider_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_INTERVAL_V1 + kodi_gui_controls_settings_slider_set_float_interval_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_RANGE_V1 + kodi_gui_controls_settings_slider_set_float_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_FLOAT_VALUE_V1 + kodi_gui_controls_settings_slider_set_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_INTERVAL_V1 + kodi_gui_controls_settings_slider_set_int_interval_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_RANGE_V1 + kodi_gui_controls_settings_slider_set_int_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_INT_VALUE_V1 + kodi_gui_controls_settings_slider_set_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_PERCENTAGE_V1 + kodi_gui_controls_settings_slider_set_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_TEXT_V1 + kodi_gui_controls_settings_slider_set_text_v1; + PFN_INT_KODI_GUI_CONTROLS_SETTINGS_SLIDER_SET_VISIBLE_V1 + kodi_gui_controls_settings_slider_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_settings_slider_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_settings_slider_h : int +{ + funcParent_kodi_gui_controls_settings_slider_set_visible_v1, + funcParent_kodi_gui_controls_settings_slider_set_enabled_v1, + funcParent_kodi_gui_controls_settings_slider_set_text_v1, + funcParent_kodi_gui_controls_settings_slider_reset_v1, + funcParent_kodi_gui_controls_settings_slider_set_int_range_v1, + funcParent_kodi_gui_controls_settings_slider_set_int_value_v1, + funcParent_kodi_gui_controls_settings_slider_get_int_value_v1, + funcParent_kodi_gui_controls_settings_slider_set_int_interval_v1, + funcParent_kodi_gui_controls_settings_slider_set_percentage_v1, + funcParent_kodi_gui_controls_settings_slider_get_percentage_v1, + funcParent_kodi_gui_controls_settings_slider_set_float_range_v1, + funcParent_kodi_gui_controls_settings_slider_set_float_value_v1, + funcParent_kodi_gui_controls_settings_slider_get_float_value_v1, + funcParent_kodi_gui_controls_settings_slider_set_float_interval_v1, +} funcParent_gui_controls_settings_slider_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_reset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_range( KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_value( KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_settings_slider_get_int_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_int_interval( KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_int_interval_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_percentage( KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_percentage( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_range( KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_value( KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_settings_slider_get_float_value( KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_get_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_settings_slider_set_float_interval( KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_settings_slider_set_float_interval_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_settings_slider_h : int +{ + funcChild_gui_controls_settings_slider_h_dummy +} funcChild_gui_controls_settings_slider_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h new file mode 100644 index 0000000000000..88e6f6be00bad --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/slider.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*(ATTR_INT_APIENTRYP + PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_DESCRIPTION_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_RESET_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_INTERVAL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_INTERVAL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_PERCENTAGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_slider_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_DESCRIPTION_V1 kodi_gui_controls_slider_get_description_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_FLOAT_VALUE_V1 kodi_gui_controls_slider_get_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_INT_VALUE_V1 kodi_gui_controls_slider_get_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_GET_PERCENTAGE_V1 kodi_gui_controls_slider_get_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_RESET_V1 kodi_gui_controls_slider_reset_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_ENABLED_V1 kodi_gui_controls_slider_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_INTERVAL_V1 + kodi_gui_controls_slider_set_float_interval_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_RANGE_V1 kodi_gui_controls_slider_set_float_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_FLOAT_VALUE_V1 kodi_gui_controls_slider_set_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_INTERVAL_V1 kodi_gui_controls_slider_set_int_interval_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_RANGE_V1 kodi_gui_controls_slider_set_int_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_INT_VALUE_V1 kodi_gui_controls_slider_set_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_PERCENTAGE_V1 kodi_gui_controls_slider_set_percentage_v1; + PFN_INT_KODI_GUI_CONTROLS_SLIDER_SET_VISIBLE_V1 kodi_gui_controls_slider_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_slider_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_slider_h : int +{ + funcParent_kodi_gui_controls_slider_set_visible_v1, + funcParent_kodi_gui_controls_slider_set_enabled_v1, + funcParent_kodi_gui_controls_slider_reset_v1, + funcParent_kodi_gui_controls_slider_get_description_v1, + funcParent_kodi_gui_controls_slider_set_int_range_v1, + funcParent_kodi_gui_controls_slider_set_int_value_v1, + funcParent_kodi_gui_controls_slider_get_int_value_v1, + funcParent_kodi_gui_controls_slider_set_int_interval_v1, + funcParent_kodi_gui_controls_slider_set_percentage_v1, + funcParent_kodi_gui_controls_slider_get_percentage_v1, + funcParent_kodi_gui_controls_slider_set_float_range_v1, + funcParent_kodi_gui_controls_slider_set_float_value_v1, + funcParent_kodi_gui_controls_slider_get_float_value_v1, + funcParent_kodi_gui_controls_slider_set_float_interval_v1, +} funcParent_gui_controls_slider_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_reset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_slider_get_description(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_description_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_slider_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_int_interval(KODI_GUI_CONTROL_HANDLE handle, int interval) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_int_interval_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_percentage(KODI_GUI_CONTROL_HANDLE handle, float percent) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_percentage(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_slider_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_get_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_slider_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_slider_set_float_interval_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_slider_h : int +{ + funcChild_gui_controls_slider_h_dummy +} funcChild_gui_controls_slider_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h new file mode 100644 index 0000000000000..56a2c3947cc38 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/spin.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_STRING_VALUE_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_ADD_INT_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_ADD_STRING_LABEL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_RESET_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_ENABLED_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_INTERVAL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_INT_RANGE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_INT_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_STRING_VALUE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_TEXT_V1)(void*, + KODI_GUI_CONTROL_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_TYPE_V1)(void*, + KODI_GUI_CONTROL_HANDLE, + int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_spin_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_SPIN_ADD_INT_LABEL_V1 kodi_gui_controls_spin_add_int_label_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_ADD_STRING_LABEL_V1 kodi_gui_controls_spin_add_string_label_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_FLOAT_VALUE_V1 kodi_gui_controls_spin_get_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_INT_VALUE_V1 kodi_gui_controls_spin_get_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_GET_STRING_VALUE_V1 kodi_gui_controls_spin_get_string_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_RESET_V1 kodi_gui_controls_spin_reset_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_ENABLED_V1 kodi_gui_controls_spin_set_enabled_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_INTERVAL_V1 kodi_gui_controls_spin_set_float_interval_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_RANGE_V1 kodi_gui_controls_spin_set_float_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_FLOAT_VALUE_V1 kodi_gui_controls_spin_set_float_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_INT_RANGE_V1 kodi_gui_controls_spin_set_int_range_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_INT_VALUE_V1 kodi_gui_controls_spin_set_int_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_STRING_VALUE_V1 kodi_gui_controls_spin_set_string_value_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_TEXT_V1 kodi_gui_controls_spin_set_text_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_TYPE_V1 kodi_gui_controls_spin_set_type_v1; + PFN_INT_KODI_GUI_CONTROLS_SPIN_SET_VISIBLE_V1 kodi_gui_controls_spin_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_spin_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_spin_h : int +{ + funcParent_kodi_gui_controls_spin_set_visible_v1, + funcParent_kodi_gui_controls_spin_set_enabled_v1, + funcParent_kodi_gui_controls_spin_set_text_v1, + funcParent_kodi_gui_controls_spin_reset_v1, + funcParent_kodi_gui_controls_spin_set_type_v1, + funcParent_kodi_gui_controls_spin_add_string_label_v1, + funcParent_kodi_gui_controls_spin_set_string_value_v1, + funcParent_kodi_gui_controls_spin_get_string_value_v1, + funcParent_kodi_gui_controls_spin_add_int_label_v1, + funcParent_kodi_gui_controls_spin_set_int_range_v1, + funcParent_kodi_gui_controls_spin_set_int_value_v1, + funcParent_kodi_gui_controls_spin_get_int_value_v1, + funcParent_kodi_gui_controls_spin_set_float_range_v1, + funcParent_kodi_gui_controls_spin_set_float_value_v1, + funcParent_kodi_gui_controls_spin_get_float_value_v1, + funcParent_kodi_gui_controls_spin_set_float_interval_v1, +} funcParent_gui_controls_spin_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_enabled(KODI_GUI_CONTROL_HANDLE handle, bool enabled) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_enabled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_reset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_type(KODI_GUI_CONTROL_HANDLE handle, int type) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_type_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_string_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_string_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_string_value(KODI_GUI_CONTROL_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_string_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_spin_get_string_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_string_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_add_int_label(KODI_GUI_CONTROL_HANDLE handle, const char* label, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_add_int_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_range(KODI_GUI_CONTROL_HANDLE handle, int start, int end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_int_value(KODI_GUI_CONTROL_HANDLE handle, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_controls_spin_get_int_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_int_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_range(KODI_GUI_CONTROL_HANDLE handle, float start, float end) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_range_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_value(KODI_GUI_CONTROL_HANDLE handle, float value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_controls_spin_get_float_value(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_get_float_value_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_spin_set_float_interval(KODI_GUI_CONTROL_HANDLE handle, float interval) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_spin_set_float_interval_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_spin_h : int +{ + funcChild_gui_controls_spin_h_dummy +} funcChild_gui_controls_spin_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h new file mode 100644 index 0000000000000..318a528a14ae9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/controls/text_box.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_GET_TEXT_V1)(void*, + KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_RESET_V1)( + void*, KODI_GUI_CONTROL_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SCROLL_V1)( + void*, KODI_GUI_CONTROL_HANDLE, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_AUTO_SCROLLING_V1)( + void*, KODI_GUI_CONTROL_HANDLE, int, int, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_TEXT_V1)( + void*, KODI_GUI_CONTROL_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_VISIBLE_V1)( + void*, KODI_GUI_CONTROL_HANDLE, bool); + +struct directFuncToKodi_gui_controls_text_box_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_GET_TEXT_V1 kodi_gui_controls_text_box_get_text_v1; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_RESET_V1 kodi_gui_controls_text_box_reset_v1; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SCROLL_V1 kodi_gui_controls_text_box_scroll_v1; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_AUTO_SCROLLING_V1 + kodi_gui_controls_text_box_set_auto_scrolling_v1; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_TEXT_V1 kodi_gui_controls_text_box_set_text_v1; + PFN_INT_KODI_GUI_CONTROLS_TEXT_BOX_SET_VISIBLE_V1 kodi_gui_controls_text_box_set_visible_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_controls_text_box_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_controls_text_box_h : int +{ + funcParent_kodi_gui_controls_text_box_set_visible_v1, + funcParent_kodi_gui_controls_text_box_reset_v1, + funcParent_kodi_gui_controls_text_box_set_text_v1, + funcParent_kodi_gui_controls_text_box_get_text_v1, + funcParent_kodi_gui_controls_text_box_scroll_v1, + funcParent_kodi_gui_controls_text_box_set_auto_scrolling_v1, +} funcParent_gui_controls_text_box_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_visible(KODI_GUI_CONTROL_HANDLE handle, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_reset(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_reset_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_text(KODI_GUI_CONTROL_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_controls_text_box_get_text(KODI_GUI_CONTROL_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_get_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_scroll(KODI_GUI_CONTROL_HANDLE handle, unsigned int position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_scroll_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_controls_text_box_set_auto_scrolling( KODI_GUI_CONTROL_HANDLE handle, int delay, int time, int repeat) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_controls_text_box_set_auto_scrolling_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_controls_text_box_h : int +{ + funcChild_gui_controls_text_box_h_dummy +} funcChild_gui_controls_text_box_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h new file mode 100644 index 0000000000000..35e3a4abc5b6e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/context_menu.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_CONTEXT_MENU_OPEN_V1)(void*, + const char*, + const char*[], + size_t); + +struct directFuncToKodi_gui_dialogs_context_menu_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_CONTEXT_MENU_OPEN_V1 kodi_gui_dialogs_context_menu_open_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_context_menu_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_context_menu_h : int +{ + funcParent_kodi_gui_dialogs_context_menu_open_v1, +} funcParent_gui_dialogs_context_menu_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_context_menu_open(const char* heading, const char* entries[], size_t size) __INTRODUCED_IN_KODI(1); +typedef std::tuple, size_t> msgParent__IN_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_context_menu_open_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_context_menu_h : int +{ + funcChild_gui_dialogs_context_menu_h_dummy +} funcChild_gui_dialogs_context_menu_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h new file mode 100644 index 0000000000000..9fd9c57724733 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/extended_progress.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_GUI_HANDLE( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_NEW_DIALOG_V1)(void*, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_IS_FINISHED_V1)( + void*, KODI_GUI_HANDLE); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TEXT_V1)(void*, + KODI_GUI_HANDLE); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TITLE_V1)(void*, + KODI_GUI_HANDLE); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_PERCENTAGE_V1)( + void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_DELETE_DIALOG_V1)( + void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_MARK_FINISHED_V1)( + void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PERCENTAGE_V1)( + void*, KODI_GUI_HANDLE, float); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PROGRESS_V1)( + void*, KODI_GUI_HANDLE, int, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TEXT_V1)( + void*, KODI_GUI_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TITLE_V1)( + void*, KODI_GUI_HANDLE, const char*); + +struct directFuncToKodi_gui_dialogs_extended_progress_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_DELETE_DIALOG_V1 + kodi_gui_dialogs_extended_progress_delete_dialog_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_PERCENTAGE_V1 + kodi_gui_dialogs_extended_progress_get_percentage_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TEXT_V1 + kodi_gui_dialogs_extended_progress_get_text_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_GET_TITLE_V1 + kodi_gui_dialogs_extended_progress_get_title_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_IS_FINISHED_V1 + kodi_gui_dialogs_extended_progress_is_finished_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_MARK_FINISHED_V1 + kodi_gui_dialogs_extended_progress_mark_finished_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_NEW_DIALOG_V1 + kodi_gui_dialogs_extended_progress_new_dialog_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PERCENTAGE_V1 + kodi_gui_dialogs_extended_progress_set_percentage_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_PROGRESS_V1 + kodi_gui_dialogs_extended_progress_set_progress_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TEXT_V1 + kodi_gui_dialogs_extended_progress_set_text_v1; + PFN_INT_KODI_GUI_DIALOGS_EXTENDED_PROGRESS_SET_TITLE_V1 + kodi_gui_dialogs_extended_progress_set_title_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_extended_progress_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_extended_progress_h : int +{ + funcParent_kodi_gui_dialogs_extended_progress_new_dialog_v1, + funcParent_kodi_gui_dialogs_extended_progress_delete_dialog_v1, + funcParent_kodi_gui_dialogs_extended_progress_get_title_v1, + funcParent_kodi_gui_dialogs_extended_progress_set_title_v1, + funcParent_kodi_gui_dialogs_extended_progress_get_text_v1, + funcParent_kodi_gui_dialogs_extended_progress_set_text_v1, + funcParent_kodi_gui_dialogs_extended_progress_is_finished_v1, + funcParent_kodi_gui_dialogs_extended_progress_mark_finished_v1, + funcParent_kodi_gui_dialogs_extended_progress_get_percentage_v1, + funcParent_kodi_gui_dialogs_extended_progress_set_percentage_v1, + funcParent_kodi_gui_dialogs_extended_progress_set_progress_v1, +} funcParent_gui_dialogs_extended_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_extended_progress_new_dialog(const char* title) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_new_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_delete_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_title(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_title_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_title(KODI_GUI_HANDLE handle, const char* title) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_title_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_dialogs_extended_progress_get_text(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_text(KODI_GUI_HANDLE handle, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_extended_progress_is_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_is_finished_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_mark_finished(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_mark_finished_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_dialogs_extended_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_get_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_percentage(KODI_GUI_HANDLE handle, float percentage) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_extended_progress_set_progress(KODI_GUI_HANDLE handle, int currentItem, int itemCount) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_extended_progress_set_progress_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_extended_progress_h : int +{ + funcChild_gui_dialogs_extended_progress_h_dummy +} funcChild_gui_dialogs_extended_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h new file mode 100644 index 0000000000000..606a2be28204d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/filebrowser.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_DIRECTORY_V1)( + void*, const char*, const char*, const char*, char**, bool); +typedef bool( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_FROM_DIR_V1)( + void*, const char*, const char*, const char*, const char*, char**, bool, bool, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_LIST_V1)( + void*, const char*, const char*, const char*, char***, size_t*, bool, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_V1)( + void*, const char*, const char*, const char*, const char*, char**, bool, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_LIST_V1)( + void*, const char*, const char*, char***, size_t*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_V1)( + void*, const char*, const char*, const char*, char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_SOURCE_V1)( + void*, const char*, char**, bool, const char*, const char*); + +struct directFuncToKodi_gui_dialogs_filebrowser_h +{ + void* thisClassHdl; + /* Function "kodi_gui_dialogs_file_browser_clear_file_list" only used inside dev-kit library only */ + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_DIRECTORY_V1 + kodi_gui_dialogs_file_browser_show_and_get_directory_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_FROM_DIR_V1 + kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_LIST_V1 + kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_FILE_V1 + kodi_gui_dialogs_file_browser_show_and_get_file_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_LIST_V1 + kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_IMAGE_V1 + kodi_gui_dialogs_file_browser_show_and_get_image_v1; + PFN_INT_KODI_GUI_DIALOGS_FILE_BROWSER_SHOW_AND_GET_SOURCE_V1 + kodi_gui_dialogs_file_browser_show_and_get_source_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_filebrowser_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_filebrowser_h : int +{ + funcParent_kodi_gui_dialogs_file_browser_show_and_get_directory_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_source_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_v1, + funcParent_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1, + funcParent_kodi_gui_dialogs_file_browser_clear_file_list_v1, +} funcParent_gui_dialogs_filebrowser_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_directory( const char* shares, const char* heading, const char* path_in, char** path_out, bool write_only) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_directory_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file(const char* shares, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_from_dir( const char* directory, const char* mask, const char* heading, const char* path_in, char** path_out, bool use_thumbs, bool use_file_directories, bool single_list) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_from_dir_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_file_list( const char* shares, const char* mask, const char* heading, char*** file_list, size_t* entries, bool use_thumbs, bool use_file_directories) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_file_list_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_source( const char* path_in, char** path_out, bool allow_network_shares, const char* additional_share, const char* type) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_source_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image(const char* shares, const char* heading, const char* path_in, char** path_out) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_file_browser_show_and_get_image_list(const char* shares, const char* heading, char*** file_list, size_t* entries) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgParent_OUT_kodi_gui_dialogs_file_browser_show_and_get_image_list_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_file_browser_clear_file_list(char*** file_list, size_t entries) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_gui_dialogs_file_browser_clear_file_list - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_gui_dialogs_file_browser_clear_file_list - Override active to use inside dev-kit library only */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_filebrowser_h : int +{ + funcChild_gui_dialogs_filebrowser_h_dummy +} funcChild_gui_dialogs_filebrowser_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h new file mode 100644 index 0000000000000..e30bb6e1809de --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/keyboard.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_IS_KEYBOARD_ACTIVATED_V1)(void*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SEND_TEXT_TO_ACTIVE_KEYBOARD_V1)( + void*, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_FILTER_V1)( + void*, const char*, char**, bool, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_V1)( + void*, const char*, char**, bool, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_WITH_HEAD_V1)( + void*, const char*, char**, const char*, bool, bool, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_V1)( + void*, const char*, char**, unsigned int); +typedef bool( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_WITH_HEAD_V1)( + void*, const char*, char**, const char*, bool, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_V1)( + void*, char**, unsigned int); +typedef bool( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_WITH_HEAD_V1)( + void*, char**, const char*, bool, unsigned int); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_PASSWORD_V1)( + void*, const char*, char**, const char*, int, unsigned int); + +struct directFuncToKodi_gui_dialogs_keyboard_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_IS_KEYBOARD_ACTIVATED_V1 + kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SEND_TEXT_TO_ACTIVE_KEYBOARD_V1 + kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_FILTER_V1 + kodi_gui_dialogs_keyboard_show_and_get_filter_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_V1 + kodi_gui_dialogs_keyboard_show_and_get_input_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_INPUT_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_GET_NEW_PASSWORD_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_NEW_PASSWORD_WITH_HEAD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; + PFN_INT_KODI_GUI_DIALOGS_KEYBOARD_SHOW_AND_VERIFY_PASSWORD_V1 + kodi_gui_dialogs_keyboard_show_and_verify_password_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_keyboard_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_keyboard_h : int +{ + funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_input_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_verify_password_v1, + funcParent_kodi_gui_dialogs_keyboard_show_and_get_filter_v1, + funcParent_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1, + funcParent_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1, +} funcParent_gui_dialogs_keyboard_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input_with_head( const char* text_in, char** text_out, const char* heading, bool allow_empty_result, bool hidden_input, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_with_head_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_input(const char* text_in, char** text_out, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_input_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head( const char* password_in, char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_with_head_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_new_password( const char* password_in, char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_new_password_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head( char** password_out, const char* heading, bool allow_empty_result, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_with_head_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_verify_new_password( char** password_out, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_new_password_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_keyboard_show_and_verify_password(const char* password_in, char** password_out, const char* heading, int retries, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_verify_password_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_show_and_get_filter(const char* text_in, char** text_out, bool searching, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_show_and_get_filter_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_send_text_to_active_keyboard(const char* text, bool close_keyboard) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_send_text_to_active_keyboard_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_keyboard_is_keyboard_activated() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_keyboard_is_keyboard_activated_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_keyboard_h : int +{ + funcChild_gui_dialogs_keyboard_h_dummy +} funcChild_gui_dialogs_keyboard_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h new file mode 100644 index 0000000000000..1bf85bab45b50 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/numeric.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_DATE_V1)(void*, + struct tm*, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_IP_ADDRESS_V1)( + void*, const char*, char**, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_NUMBER_V1)( + void*, const char*, char**, const char*, unsigned int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_SECONDS_V1)( + void*, const char*, char**, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_TIME_V1)(void*, + struct tm*, + const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_INPUT_V1)( + void*, const char*, char**, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_NEW_PASSWORD_V1)( + void*, char**); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_PASSWORD_V1)( + void*, const char*, const char*, int); + +struct directFuncToKodi_gui_dialogs_numeric_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_DATE_V1 + kodi_gui_dialogs_numeric_show_and_get_date_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_IP_ADDRESS_V1 + kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_NUMBER_V1 + kodi_gui_dialogs_numeric_show_and_get_number_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_SECONDS_V1 + kodi_gui_dialogs_numeric_show_and_get_seconds_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_GET_TIME_V1 + kodi_gui_dialogs_numeric_show_and_get_time_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_INPUT_V1 + kodi_gui_dialogs_numeric_show_and_verify_input_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_NEW_PASSWORD_V1 + kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; + PFN_INT_KODI_GUI_DIALOGS_NUMERIC_SHOW_AND_VERIFY_PASSWORD_V1 + kodi_gui_dialogs_numeric_show_and_verify_password_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_numeric_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_numeric_h : int +{ + funcParent_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_verify_password_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_verify_input_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_get_time_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_get_date_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_get_number_v1, + funcParent_kodi_gui_dialogs_numeric_show_and_get_seconds_v1, +} funcParent_gui_dialogs_numeric_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_new_password(char** password) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_new_password_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_numeric_show_and_verify_password(const char* password, const char* heading, int retries) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_password_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_verify_input(const char* verify_in, char** verify_out, const char* heading, bool verify_input) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_verify_input_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_time(struct tm* time, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_time_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_date(struct tm* date, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_date_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_ip_address(const char* ip_address_in, char** ip_address_out, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_ip_address_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_number(const char* number_in, char** number_out, const char* heading, unsigned int auto_close_ms) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_number_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_numeric_show_and_get_seconds(const char* time_in, char** time_out, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_numeric_show_and_get_seconds_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_numeric_h : int +{ + funcChild_gui_dialogs_numeric_h_dummy +} funcChild_gui_dialogs_numeric_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h new file mode 100644 index 0000000000000..567c91b2d0f91 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/ok.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_LINE_TEXT_V1)( + void*, const char*, const char*, const char*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1)( + void*, const char*, const char*); + +struct directFuncToKodi_gui_dialogs_ok_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_LINE_TEXT_V1 + kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; + PFN_INT_KODI_GUI_DIALOGS_OK_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1 + kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_ok_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_ok_h : int +{ + funcParent_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1, + funcParent_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1, +} funcParent_gui_dialogs_ok_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_single_text(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_single_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_ok_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_ok_show_and_get_input_line_text_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_ok_h : int +{ + funcChild_gui_dialogs_ok_h_dummy +} funcChild_gui_dialogs_ok_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h new file mode 100644 index 0000000000000..2ab8d9f25df1e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/progress.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_GUI_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_NEW_DIALOG_V1)(void*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_ABORT_V1)(void*, KODI_GUI_HANDLE); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_IS_CANCELED_V1)(void*, + KODI_GUI_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_GET_PERCENTAGE_V1)( + void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_DELETE_DIALOG_V1)( + void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_OPEN_V1)(void*, KODI_GUI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_CAN_CANCEL_V1)( + void*, KODI_GUI_HANDLE, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_HEADING_V1)(void*, + KODI_GUI_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_LINE_V1)(void*, + KODI_GUI_HANDLE, + unsigned int, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PERCENTAGE_V1)( + void*, KODI_GUI_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_ADVANCE_V1)( + void*, KODI_GUI_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_MAX_V1)( + void*, KODI_GUI_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SHOW_PROGRESS_BAR_V1)( + void*, KODI_GUI_HANDLE, bool); + +struct directFuncToKodi_gui_dialogs_progress_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_ABORT_V1 kodi_gui_dialogs_progress_abort_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_DELETE_DIALOG_V1 kodi_gui_dialogs_progress_delete_dialog_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_GET_PERCENTAGE_V1 kodi_gui_dialogs_progress_get_percentage_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_IS_CANCELED_V1 kodi_gui_dialogs_progress_is_canceled_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_NEW_DIALOG_V1 kodi_gui_dialogs_progress_new_dialog_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_OPEN_V1 kodi_gui_dialogs_progress_open_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_CAN_CANCEL_V1 kodi_gui_dialogs_progress_set_can_cancel_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_HEADING_V1 kodi_gui_dialogs_progress_set_heading_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_LINE_V1 kodi_gui_dialogs_progress_set_line_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PERCENTAGE_V1 kodi_gui_dialogs_progress_set_percentage_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_ADVANCE_V1 + kodi_gui_dialogs_progress_set_progress_advance_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SET_PROGRESS_MAX_V1 + kodi_gui_dialogs_progress_set_progress_max_v1; + PFN_INT_KODI_GUI_DIALOGS_PROGRESS_SHOW_PROGRESS_BAR_V1 + kodi_gui_dialogs_progress_show_progress_bar_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_progress_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_progress_h : int +{ + funcParent_kodi_gui_dialogs_progress_new_dialog_v1, + funcParent_kodi_gui_dialogs_progress_delete_dialog_v1, + funcParent_kodi_gui_dialogs_progress_open_v1, + funcParent_kodi_gui_dialogs_progress_set_heading_v1, + funcParent_kodi_gui_dialogs_progress_set_line_v1, + funcParent_kodi_gui_dialogs_progress_set_can_cancel_v1, + funcParent_kodi_gui_dialogs_progress_is_canceled_v1, + funcParent_kodi_gui_dialogs_progress_set_percentage_v1, + funcParent_kodi_gui_dialogs_progress_get_percentage_v1, + funcParent_kodi_gui_dialogs_progress_show_progress_bar_v1, + funcParent_kodi_gui_dialogs_progress_set_progress_max_v1, + funcParent_kodi_gui_dialogs_progress_set_progress_advance_v1, + funcParent_kodi_gui_dialogs_progress_abort_v1, +} funcParent_gui_dialogs_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_HANDLE kodi_gui_dialogs_progress_new_dialog() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_new_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_delete_dialog(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_delete_dialog_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_open(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_open_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_heading(KODI_GUI_HANDLE handle, const char* heading) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_heading_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_line(KODI_GUI_HANDLE handle, unsigned int line_no, const char* line) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_line_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_can_cancel(KODI_GUI_HANDLE handle, bool can_cancel) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_can_cancel_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_is_canceled(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_is_canceled_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_percentage(KODI_GUI_HANDLE handle, int percentage) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_progress_get_percentage(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_get_percentage_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_show_progress_bar(KODI_GUI_HANDLE handle, bool on_off) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_show_progress_bar_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_max(KODI_GUI_HANDLE handle, int max) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_max_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_progress_set_progress_advance(KODI_GUI_HANDLE handle, int n_steps) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_set_progress_advance_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_progress_abort(KODI_GUI_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_progress_abort_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_progress_h : int +{ + funcChild_gui_dialogs_progress_h_dummy +} funcChild_gui_dialogs_progress_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h new file mode 100644 index 0000000000000..a5fe5b7631969 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/select.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_SELECT_OPEN_MULTI_SELECT_V1)( + void*, const char*, const char*[], const char*[], uint8_t[], size_t, unsigned int); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_SELECT_OPEN_V1)( + void*, const char*, const char*[], size_t, int, unsigned int); + +struct directFuncToKodi_gui_dialogs_select_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_SELECT_OPEN_MULTI_SELECT_V1 kodi_gui_dialogs_select_open_multi_select_v1; + PFN_INT_KODI_GUI_DIALOGS_SELECT_OPEN_V1 kodi_gui_dialogs_select_open_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_select_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_select_h : int +{ + funcParent_kodi_gui_dialogs_select_open_v1, + funcParent_kodi_gui_dialogs_select_open_multi_select_v1, +} funcParent_gui_dialogs_select_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_dialogs_select_open(const char* heading, const char* entries[], size_t size, int selected, unsigned int autoclose) __INTRODUCED_IN_KODI(1); +typedef std::tuple, size_t, int, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_select_open_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_select_open_multi_select(const char* heading, const char* entryIDs[], const char* entryNames[], uint8_t entriesSelected[], size_t size, unsigned int autoclose) __INTRODUCED_IN_KODI(1); +typedef std::tuple, std::vector, std::vector, size_t, unsigned int> msgParent__IN_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ +typedef std::tuple> msgParent_OUT_kodi_gui_dialogs_select_open_multi_select_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_select_h : int +{ + funcChild_gui_dialogs_select_h_dummy +} funcChild_gui_dialogs_select_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h new file mode 100644 index 0000000000000..af4ac5ba0f8c8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/text_viewer.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_TEXT_VIEWER_SHOW_V1)(void*, + const char*, + const char*); + +struct directFuncToKodi_gui_dialogs_text_viewer_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_TEXT_VIEWER_SHOW_V1 kodi_gui_dialogs_text_viewer_show_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_text_viewer_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_text_viewer_h : int +{ + funcParent_kodi_gui_dialogs_text_viewer_show_v1, +} funcParent_gui_dialogs_text_viewer_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_dialogs_text_viewer_show(const char* heading, const char* text) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_text_viewer_show_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_text_viewer_h : int +{ + funcChild_gui_dialogs_text_viewer_h_dummy +} funcChild_gui_dialogs_text_viewer_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h new file mode 100644 index 0000000000000..b1c74787d4ac3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../../include/kodi/c-api/gui/dialogs/yes_no.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_BUTTON_TEXT_V1)( + void*, const char*, const char*, const char*, const char*, bool*, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_TEXT_V1)( + void*, const char*, const char*, const char*, const char*, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1)( + void*, const char*, const char*, bool*, const char*, const char*); + +struct directFuncToKodi_gui_dialogs_yes_no_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_BUTTON_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; + PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_LINE_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; + PFN_INT_KODI_GUI_DIALOGS_YESNO_SHOW_AND_GET_INPUT_SINGLE_TEXT_V1 + kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_dialogs_yes_no_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_dialogs_yes_no_h : int +{ + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1, + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1, + funcParent_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1, +} funcParent_gui_dialogs_yes_no_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_single_text(const char* heading, const char* text, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_single_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_text(const char* heading, const char* line0, const char* line1, const char* line2, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_text_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_dialogs_yesno_show_and_get_input_line_button_text( const char* heading, const char* line0, const char* line1, const char* line2, bool* canceled, const char* noLabel, const char* yesLabel) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_dialogs_yesno_show_and_get_input_line_button_text_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_dialogs_yes_no_h : int +{ + funcChild_gui_dialogs_yes_no_h_dummy +} funcChild_gui_dialogs_yes_no_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/general.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/general.h new file mode 100644 index 0000000000000..ff789361ccdc2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/general.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/gui/general.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef ADDON_HARDWARE_CONTEXT2(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_HW_CONTEXT_V1)(void*); +typedef float(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_VIDEO_RESOLUTION_V1)(void*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_CURRENT_WINDOW_DIALOG_ID_V1)(void*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_CURRENT_WINDOW_ID_V1)(void*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_SCREEN_HEIGHT_V1)(void*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_GET_SCREEN_WIDTH_V1)(void*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LOCK_V1)(void*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_UNLOCK_V1)(void*); + +struct directFuncToKodi_gui_general_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_GET_CURRENT_WINDOW_DIALOG_ID_V1 kodi_gui_get_current_window_dialog_id_v1; + PFN_INT_KODI_GUI_GET_CURRENT_WINDOW_ID_V1 kodi_gui_get_current_window_id_v1; + PFN_INT_KODI_GUI_GET_HW_CONTEXT_V1 kodi_gui_get_hw_context_v1; + PFN_INT_KODI_GUI_GET_SCREEN_HEIGHT_V1 kodi_gui_get_screen_height_v1; + PFN_INT_KODI_GUI_GET_SCREEN_WIDTH_V1 kodi_gui_get_screen_width_v1; + PFN_INT_KODI_GUI_GET_VIDEO_RESOLUTION_V1 kodi_gui_get_video_resolution_v1; + PFN_INT_KODI_GUI_LOCK_V1 kodi_gui_lock_v1; + PFN_INT_KODI_GUI_UNLOCK_V1 kodi_gui_unlock_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_general_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_general_h : int +{ + funcParent_kodi_gui_lock_v1, + funcParent_kodi_gui_unlock_v1, + funcParent_kodi_gui_get_screen_height_v1, + funcParent_kodi_gui_get_screen_width_v1, + funcParent_kodi_gui_get_video_resolution_v1, + funcParent_kodi_gui_get_current_window_dialog_id_v1, + funcParent_kodi_gui_get_current_window_id_v1, + funcParent_kodi_gui_get_hw_context_v1, +} funcParent_gui_general_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_lock() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_lock_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_lock_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_unlock() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_unlock_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_unlock_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_height() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_screen_height_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_screen_height_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_get_screen_width() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_screen_width_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_screen_width_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT float kodi_gui_get_video_resolution() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_video_resolution_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_video_resolution_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_dialog_id() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_dialog_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_get_current_window_id() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_current_window_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_current_window_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT2 kodi_gui_get_hw_context() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_get_hw_context_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_get_hw_context_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_general_h : int +{ + funcChild_gui_general_h_dummy +} funcChild_gui_general_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h new file mode 100644 index 0000000000000..8bfd54af339f6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/gui/list_item.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_GUI_LISTITEM_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_CREATE_V1)( + void*, const char*, const char*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_IS_SELECTED_V1)(void*, + KODI_GUI_LISTITEM_HANDLE); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_GET_ART_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_GET_LABEL2_V1)(void*, + KODI_GUI_LISTITEM_HANDLE); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_GET_LABEL_V1)(void*, + KODI_GUI_LISTITEM_HANDLE); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_GET_PATH_V1)(void*, + KODI_GUI_LISTITEM_HANDLE); +typedef char*( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_GET_PROPERTY_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_DESTROY_V1)(void*, + KODI_GUI_LISTITEM_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SELECT_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SET_ART_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SET_LABEL2_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SET_LABEL_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SET_PATH_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_LISTITEM_SET_PROPERTY_V1)(void*, + KODI_GUI_LISTITEM_HANDLE, + const char*, + const char*); + +struct directFuncToKodi_gui_list_item_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_LISTITEM_CREATE_V1 kodi_gui_listitem_create_v1; + PFN_INT_KODI_GUI_LISTITEM_DESTROY_V1 kodi_gui_listitem_destroy_v1; + PFN_INT_KODI_GUI_LISTITEM_GET_ART_V1 kodi_gui_listitem_get_art_v1; + PFN_INT_KODI_GUI_LISTITEM_GET_LABEL2_V1 kodi_gui_listitem_get_label2_v1; + PFN_INT_KODI_GUI_LISTITEM_GET_LABEL_V1 kodi_gui_listitem_get_label_v1; + PFN_INT_KODI_GUI_LISTITEM_GET_PATH_V1 kodi_gui_listitem_get_path_v1; + PFN_INT_KODI_GUI_LISTITEM_GET_PROPERTY_V1 kodi_gui_listitem_get_property_v1; + PFN_INT_KODI_GUI_LISTITEM_IS_SELECTED_V1 kodi_gui_listitem_is_selected_v1; + PFN_INT_KODI_GUI_LISTITEM_SELECT_V1 kodi_gui_listitem_select_v1; + PFN_INT_KODI_GUI_LISTITEM_SET_ART_V1 kodi_gui_listitem_set_art_v1; + PFN_INT_KODI_GUI_LISTITEM_SET_LABEL2_V1 kodi_gui_listitem_set_label2_v1; + PFN_INT_KODI_GUI_LISTITEM_SET_LABEL_V1 kodi_gui_listitem_set_label_v1; + PFN_INT_KODI_GUI_LISTITEM_SET_PATH_V1 kodi_gui_listitem_set_path_v1; + PFN_INT_KODI_GUI_LISTITEM_SET_PROPERTY_V1 kodi_gui_listitem_set_property_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_list_item_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_list_item_h : int +{ + funcParent_kodi_gui_listitem_create_v1, + funcParent_kodi_gui_listitem_destroy_v1, + funcParent_kodi_gui_listitem_get_label_v1, + funcParent_kodi_gui_listitem_set_label_v1, + funcParent_kodi_gui_listitem_get_label2_v1, + funcParent_kodi_gui_listitem_set_label2_v1, + funcParent_kodi_gui_listitem_get_art_v1, + funcParent_kodi_gui_listitem_set_art_v1, + funcParent_kodi_gui_listitem_get_path_v1, + funcParent_kodi_gui_listitem_set_path_v1, + funcParent_kodi_gui_listitem_get_property_v1, + funcParent_kodi_gui_listitem_set_property_v1, + funcParent_kodi_gui_listitem_select_v1, + funcParent_kodi_gui_listitem_is_selected_v1, +} funcParent_gui_list_item_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_listitem_create(const char* label, const char* label2, const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_create_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_create_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_destroy(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_destroy_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_destroy_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_label2(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_label2_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_label2(KODI_GUI_LISTITEM_HANDLE handle, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_label2_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_get_art_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_art_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_art(KODI_GUI_LISTITEM_HANDLE handle, const char* type, const char* image) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_set_art_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_art_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_path(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_get_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_path(KODI_GUI_LISTITEM_HANDLE handle, const char* path) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_set_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_listitem_get_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_get_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_get_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_set_property(KODI_GUI_LISTITEM_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_set_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_set_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_listitem_select(KODI_GUI_LISTITEM_HANDLE handle, bool select) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_select_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_select_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_listitem_is_selected(KODI_GUI_LISTITEM_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_listitem_is_selected_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_list_item_h : int +{ + funcChild_gui_list_item_h_dummy +} funcChild_gui_list_item_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/gui/window.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/window.h new file mode 100644 index 0000000000000..6e6e9572d12a7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/window.h @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../../include/kodi/c-api/gui/window.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_BUTTON_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_EDIT_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_FADE_LABEL_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_IMAGE_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_LABEL_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_PROGRESS_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_RADIO_BUTTON_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + int); +typedef KODI_GUI_CONTROL_HANDLE( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_RENDER_ADDON_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + int); +typedef KODI_GUI_CONTROL_HANDLE( + ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SETTINGS_SLIDER_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SLIDER_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SPIN_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_CONTROL_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_TEXT_BOX_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_LISTITEM_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_LIST_ITEM_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef KODI_GUI_WINDOW_HANDLE(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_CREATE_V1)( + void*, KODI_HANDLE, const char*, const char*, bool, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_CLOSE_V1)(void*, KODI_GUI_WINDOW_HANDLE); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_DO_MODAL_V1)(void*, KODI_GUI_WINDOW_HANDLE); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_BOOL_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_FOCUS_ID_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SHOW_V1)(void*, KODI_GUI_WINDOW_HANDLE); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + const char*); +typedef double(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_DOUBLE_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CURRENT_CONTAINER_ID_V1)( + void*, KODI_GUI_WINDOW_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_CURRENT_LIST_POSITION_V1)( + void*, KODI_GUI_WINDOW_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_FOCUS_ID_V1)(void*, + KODI_GUI_WINDOW_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_LIST_SIZE_V1)(void*, + KODI_GUI_WINDOW_HANDLE); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_INT_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_ADD_LIST_ITEM_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + KODI_GUI_LISTITEM_HANDLE, + int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_CLEAR_ITEM_LIST_V1)(void*, + KODI_GUI_WINDOW_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_CLEAR_PROPERTIES_V1)( + void*, KODI_GUI_WINDOW_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_CLEAR_PROPERTY_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_DESTROY_V1)(void*, KODI_GUI_WINDOW_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_MARK_DIRTY_REGION_V1)( + void*, KODI_GUI_WINDOW_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_FROM_POSITION_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_V1)( + void*, KODI_GUI_WINDOW_HANDLE, KODI_GUI_LISTITEM_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CONTAINER_CONTENT_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CONTAINER_PROPERTY_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_LABEL_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_SELECTED_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_VISIBLE_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_CURRENT_LIST_POSITION_V1)( + void*, KODI_GUI_WINDOW_HANDLE, int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_BOOL_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_DOUBLE_V1)( + void*, KODI_GUI_WINDOW_HANDLE, const char*, double); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_INT_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + const char*, + int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_V1)(void*, + KODI_GUI_WINDOW_HANDLE, + const char*, + const char*); + +struct directFuncToKodi_gui_window_h +{ + void* thisClassHdl; + PFN_INT_KODI_GUI_WINDOW_ADD_LIST_ITEM_V1 kodi_gui_window_add_list_item_v1; + PFN_INT_KODI_GUI_WINDOW_CLEAR_ITEM_LIST_V1 kodi_gui_window_clear_item_list_v1; + PFN_INT_KODI_GUI_WINDOW_CLEAR_PROPERTIES_V1 kodi_gui_window_clear_properties_v1; + PFN_INT_KODI_GUI_WINDOW_CLEAR_PROPERTY_V1 kodi_gui_window_clear_property_v1; + PFN_INT_KODI_GUI_WINDOW_CLOSE_V1 kodi_gui_window_close_v1; + PFN_INT_KODI_GUI_WINDOW_CREATE_V1 kodi_gui_window_create_v1; + PFN_INT_KODI_GUI_WINDOW_DESTROY_V1 kodi_gui_window_destroy_v1; + PFN_INT_KODI_GUI_WINDOW_DO_MODAL_V1 kodi_gui_window_do_modal_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_BUTTON_V1 kodi_gui_window_get_control_button_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_EDIT_V1 kodi_gui_window_get_control_edit_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_FADE_LABEL_V1 kodi_gui_window_get_control_fade_label_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_IMAGE_V1 kodi_gui_window_get_control_image_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_LABEL_V1 kodi_gui_window_get_control_label_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_PROGRESS_V1 kodi_gui_window_get_control_progress_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_RADIO_BUTTON_V1 kodi_gui_window_get_control_radio_button_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_RENDER_ADDON_V1 kodi_gui_window_get_control_render_addon_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SETTINGS_SLIDER_V1 + kodi_gui_window_get_control_settings_slider_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SLIDER_V1 kodi_gui_window_get_control_slider_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_SPIN_V1 kodi_gui_window_get_control_spin_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CONTROL_TEXT_BOX_V1 kodi_gui_window_get_control_text_box_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CURRENT_CONTAINER_ID_V1 kodi_gui_window_get_current_container_id_v1; + PFN_INT_KODI_GUI_WINDOW_GET_CURRENT_LIST_POSITION_V1 kodi_gui_window_get_current_list_position_v1; + PFN_INT_KODI_GUI_WINDOW_GET_FOCUS_ID_V1 kodi_gui_window_get_focus_id_v1; + PFN_INT_KODI_GUI_WINDOW_GET_LIST_ITEM_V1 kodi_gui_window_get_list_item_v1; + PFN_INT_KODI_GUI_WINDOW_GET_LIST_SIZE_V1 kodi_gui_window_get_list_size_v1; + PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_BOOL_V1 kodi_gui_window_get_property_bool_v1; + PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_DOUBLE_V1 kodi_gui_window_get_property_double_v1; + PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_INT_V1 kodi_gui_window_get_property_int_v1; + PFN_INT_KODI_GUI_WINDOW_GET_PROPERTY_V1 kodi_gui_window_get_property_v1; + PFN_INT_KODI_GUI_WINDOW_MARK_DIRTY_REGION_V1 kodi_gui_window_mark_dirty_region_v1; + PFN_INT_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_FROM_POSITION_V1 + kodi_gui_window_remove_list_item_from_position_v1; + PFN_INT_KODI_GUI_WINDOW_REMOVE_LIST_ITEM_V1 kodi_gui_window_remove_list_item_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CONTAINER_CONTENT_V1 kodi_gui_window_set_container_content_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CONTAINER_PROPERTY_V1 kodi_gui_window_set_container_property_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_LABEL_V1 kodi_gui_window_set_control_label_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_SELECTED_V1 kodi_gui_window_set_control_selected_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CONTROL_VISIBLE_V1 kodi_gui_window_set_control_visible_v1; + PFN_INT_KODI_GUI_WINDOW_SET_CURRENT_LIST_POSITION_V1 kodi_gui_window_set_current_list_position_v1; + PFN_INT_KODI_GUI_WINDOW_SET_FOCUS_ID_V1 kodi_gui_window_set_focus_id_v1; + PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_BOOL_V1 kodi_gui_window_set_property_bool_v1; + PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_DOUBLE_V1 kodi_gui_window_set_property_double_v1; + PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_INT_V1 kodi_gui_window_set_property_int_v1; + PFN_INT_KODI_GUI_WINDOW_SET_PROPERTY_V1 kodi_gui_window_set_property_v1; + PFN_INT_KODI_GUI_WINDOW_SHOW_V1 kodi_gui_window_show_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_gui_window_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_gui_window_h : int +{ + funcParent_kodi_gui_window_create_v1, + funcParent_kodi_gui_window_destroy_v1, + funcParent_kodi_gui_window_show_v1, + funcParent_kodi_gui_window_close_v1, + funcParent_kodi_gui_window_do_modal_v1, + funcParent_kodi_gui_window_set_focus_id_v1, + funcParent_kodi_gui_window_get_focus_id_v1, + funcParent_kodi_gui_window_set_control_label_v1, + funcParent_kodi_gui_window_set_control_visible_v1, + funcParent_kodi_gui_window_set_control_selected_v1, + funcParent_kodi_gui_window_set_property_v1, + funcParent_kodi_gui_window_set_property_int_v1, + funcParent_kodi_gui_window_set_property_bool_v1, + funcParent_kodi_gui_window_set_property_double_v1, + funcParent_kodi_gui_window_get_property_v1, + funcParent_kodi_gui_window_get_property_int_v1, + funcParent_kodi_gui_window_get_property_bool_v1, + funcParent_kodi_gui_window_get_property_double_v1, + funcParent_kodi_gui_window_clear_properties_v1, + funcParent_kodi_gui_window_clear_property_v1, + funcParent_kodi_gui_window_clear_item_list_v1, + funcParent_kodi_gui_window_add_list_item_v1, + funcParent_kodi_gui_window_remove_list_item_from_position_v1, + funcParent_kodi_gui_window_remove_list_item_v1, + funcParent_kodi_gui_window_get_list_item_v1, + funcParent_kodi_gui_window_set_current_list_position_v1, + funcParent_kodi_gui_window_get_current_list_position_v1, + funcParent_kodi_gui_window_get_list_size_v1, + funcParent_kodi_gui_window_set_container_property_v1, + funcParent_kodi_gui_window_set_container_content_v1, + funcParent_kodi_gui_window_get_current_container_id_v1, + funcParent_kodi_gui_window_mark_dirty_region_v1, + funcParent_kodi_gui_window_get_control_button_v1, + funcParent_kodi_gui_window_get_control_edit_v1, + funcParent_kodi_gui_window_get_control_fade_label_v1, + funcParent_kodi_gui_window_get_control_image_v1, + funcParent_kodi_gui_window_get_control_label_v1, + funcParent_kodi_gui_window_get_control_progress_v1, + funcParent_kodi_gui_window_get_control_radio_button_v1, + funcParent_kodi_gui_window_get_control_render_addon_v1, + funcParent_kodi_gui_window_get_control_settings_slider_v1, + funcParent_kodi_gui_window_get_control_slider_v1, + funcParent_kodi_gui_window_get_control_spin_v1, + funcParent_kodi_gui_window_get_control_text_box_v1, +} funcParent_gui_window_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_WINDOW_HANDLE kodi_gui_window_create(KODI_HANDLE kodiBase, const char* xml_filename, const char* default_skin, bool as_dialog, bool is_media) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_create_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_create_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_destroy(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_destroy_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_destroy_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_show(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_show_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_show_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_close(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_close_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_close_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_do_modal(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_do_modal_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_do_modal_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_set_focus_id(KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_focus_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_focus_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_focus_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_label(KODI_GUI_WINDOW_HANDLE handle, int control_id, const char* label) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_control_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_visible(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool visible) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_visible_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_control_selected(KODI_GUI_WINDOW_HANDLE handle, int control_id, bool selected) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_control_selected_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_property_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key, bool value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key, double value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_property_double_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_property_double_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_gui_window_get_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_property_int(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_property_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_gui_window_get_property_bool(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT double kodi_gui_window_get_property_double(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_property_double_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_property_double_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_properties(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_clear_properties_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_clear_properties_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_property(KODI_GUI_WINDOW_HANDLE handle, const char* key) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_clear_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_clear_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_clear_item_list(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_clear_item_list_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_add_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item, int list_position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_add_list_item_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_add_list_item_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item_from_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_from_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_remove_list_item(KODI_GUI_WINDOW_HANDLE handle, KODI_GUI_LISTITEM_HANDLE item) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_remove_list_item_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_LISTITEM_HANDLE kodi_gui_window_get_list_item(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_list_item_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_item_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_current_list_position(KODI_GUI_WINDOW_HANDLE handle, int list_position) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_current_list_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_list_position(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_list_position_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_list_size(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_list_size_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_list_size_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_property(KODI_GUI_WINDOW_HANDLE handle, const char* key, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_container_property_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_property_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_set_container_content(KODI_GUI_WINDOW_HANDLE handle, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_set_container_content_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_set_container_content_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT int kodi_gui_window_get_current_container_id(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_current_container_id_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_gui_window_mark_dirty_region(KODI_GUI_WINDOW_HANDLE handle) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_mark_dirty_region_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_button_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_button_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_edit( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_edit_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_fade_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_fade_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_image( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_image_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_image_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_label( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_label_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_label_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_progress( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_progress_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_radio_button( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_radio_button_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_render_addon( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_render_addon_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_settings_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_settings_slider_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_slider( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_slider_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_spin( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_spin_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT KODI_GUI_CONTROL_HANDLE kodi_gui_window_get_control_text_box( KODI_GUI_WINDOW_HANDLE handle, int control_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_gui_window_get_control_text_box_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_gui_window_h : int +{ + funcChild_gui_window_h_dummy +} funcChild_gui_window_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/monitor.h b/xbmc/addons/kodi-dev-kit/src/shared/api/monitor.h new file mode 100644 index 0000000000000..46a76f672d6a2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/monitor.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/monitor.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + + +struct directFuncToKodi_monitor_h +{ + void* thisClassHdl; + /* Function "kodi_monitor_abort_requested" only used inside dev-kit library only */ + /* Function "kodi_monitor_wait_for_abort" only used inside dev-kit library only */ +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_monitor_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_monitor_h : int +{ + funcParent_kodi_monitor_wait_for_abort_v1, + funcParent_kodi_monitor_abort_requested_v1, +} funcParent_monitor_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_monitor_wait_for_abort(double timeout) __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_monitor_wait_for_abort - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_monitor_wait_for_abort - Override active to use inside dev-kit library only */ +// Original API call: ATTR_DLL_EXPORT bool kodi_monitor_abort_requested() __INTRODUCED_IN_KODI(1); +/* NOTE: msgParent__IN_kodi_monitor_abort_requested - Override active to use inside dev-kit library only */ +/* NOTE: msgParent_OUT_kodi_monitor_abort_requested - Override active to use inside dev-kit library only */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_monitor_h : int +{ + funcChild_monitor_h_dummy +} funcChild_monitor_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/network.h b/xbmc/addons/kodi-dev-kit/src/shared/api/network.h new file mode 100644 index 0000000000000..39a95a1632426 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/network.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2005-2021 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ + +#pragma once + +#include "../../../include/kodi/c-api/network.h" +#include "src/shared/SharedGroups.h" + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +// Code here relates to direct API calls without use of shared mem from addon to Kodi. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_IS_HOST_ON_LAN_V1)(void*, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_IS_LOCAL_HOST_V1)(void*, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_WAKE_ON_LAN_V1)(void*, const char*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_DNS_LOOKUP_V1)(void*, const char*, bool*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_GET_HOSTNAME_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_GET_IP_ADDRESS_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_GET_USER_AGENT_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_NETWORK_URL_ENCODE_V1)(void*, const char*); + +struct directFuncToKodi_network_h +{ + void* thisClassHdl; + PFN_INT_KODI_NETWORK_DNS_LOOKUP_V1 kodi_network_dns_lookup_v1; + PFN_INT_KODI_NETWORK_GET_HOSTNAME_V1 kodi_network_get_hostname_v1; + PFN_INT_KODI_NETWORK_GET_IP_ADDRESS_V1 kodi_network_get_ip_address_v1; + PFN_INT_KODI_NETWORK_GET_USER_AGENT_V1 kodi_network_get_user_agent_v1; + PFN_INT_KODI_NETWORK_IS_HOST_ON_LAN_V1 kodi_network_is_host_on_lan_v1; + PFN_INT_KODI_NETWORK_IS_LOCAL_HOST_V1 kodi_network_is_local_host_v1; + PFN_INT_KODI_NETWORK_URL_ENCODE_V1 kodi_network_url_encode_v1; + PFN_INT_KODI_NETWORK_WAKE_ON_LAN_V1 kodi_network_wake_on_lan_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + + +struct directFuncToAddon_network_h +{ + void* thisClassHdl; +}; + +//}}} + +typedef enum funcParent_network_h : int +{ + funcParent_kodi_network_wake_on_lan_v1, + funcParent_kodi_network_get_ip_address_v1, + funcParent_kodi_network_dns_lookup_v1, + funcParent_kodi_network_url_encode_v1, + funcParent_kodi_network_get_hostname_v1, + funcParent_kodi_network_is_local_host_v1, + funcParent_kodi_network_is_host_on_lan_v1, + funcParent_kodi_network_get_user_agent_v1, +} funcParent_network_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT bool kodi_network_wake_on_lan(const char* mac) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_wake_on_lan_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_wake_on_lan_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_network_get_ip_address() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_get_ip_address_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_get_ip_address_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_network_dns_lookup(const char* url, bool* ret) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_dns_lookup_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_dns_lookup_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_network_url_encode(const char* url) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_url_encode_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_url_encode_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_network_get_hostname() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_get_hostname_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_get_hostname_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_network_is_local_host(const char* hostname) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_is_local_host_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_is_local_host_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_network_is_host_on_lan(const char* hostname, bool offLineCheck) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_is_host_on_lan_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_is_host_on_lan_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT char* kodi_network_get_user_agent() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_network_get_user_agent_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_network_get_user_agent_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_network_h : int +{ + funcChild_network_h_dummy +} funcChild_network_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/api/processor.h b/xbmc/addons/kodi-dev-kit/src/shared/api/processor.h new file mode 100644 index 0000000000000..23606f38dc287 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/processor.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "../SharedGroups.h" + +#include +#include + +/* + * WARNING: + * This file is not touched by autogeneration! + * + * As this here is for internal crosstalk between Kodi and addon dev-kit library + * must it be set by hand as autogeneration can't know what todo. + */ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_KILL_CHILD_V1)(void*, const char*); + +struct directFuncToAddon_processor_h +{ + void* thisClassHdl; + PFN_INT_KODI_KILL_CHILD_V1 kodi_kill_child; +}; + +typedef enum funcParent_Processor_h : int +{ + kodi_processor_CreateForNewThread = 100, + kodi_processor_CreateForNewProcess = 101, + kodi_processor_NewProcessStarted = 102, +} funcParent_Processor_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +typedef std::tuple msgParent__IN_kodi_processor_CreateForNewThread; +typedef std::tuple msgParent_OUT_kodi_processor_CreateForNewThread; +typedef std::tuple msgParent__IN_kodi_processor_CreateForNewProcess; +typedef std::tuple msgParent_OUT_kodi_processor_CreateForNewProcess; +typedef std::tuple msgParent__IN_kodi_processor_NewProcessStarted; +typedef std::tuple msgParent_OUT_kodi_processor_NewProcessStarted; +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_Processor_h +{ + kodi_processor_CreateForNewChildThread = 200, + kodi_processor_KillChild, +} funcChild_Processor_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +typedef std::tuple msgChild__IN_kodi_processor_KillChild; +typedef std::tuple msgChild_OUT_kodi_processor_KillChild; +typedef std::tuple msgChild__IN_kodi_processor_CreateForNewThread; +typedef std::tuple msgChild_OUT_kodi_processor_CreateForNewThread; +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py new file mode 100755 index 0000000000000..d7dbf0890ea94 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 + +global kodi_dir +global force +kodi_dir = "../../../../../" + +from src.interface_code_generator import * +from src.find_callback_use_places import * +from src.library_dl_generator import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H import generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES import * +from src.generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES import * +from src.generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES import * +from src.generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP import * +from src.generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H import * +from src.generate__SOURCE__xbmc_addons_interface_api_ALL_FILES import * + +from src.generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES import * +from src.generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT import * +from src.generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES import * +from src.generate__CMAKE__xbmc_addons_interface_ALL_FILES import * +from src.generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT import * +from src.generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT import * + +from optparse import OptionParser +import glob +import io +import os +import re +import sys + +#=============================================================================== +def GenerateSourceParts(options, data): + print('.-------------------------------------------------------------------------------') + print('· Generate source code parts ...') + + # Generate xbmc/addons/kodi-dev-kit/src/shared/DirectData.h + generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H(options) + + ## Generate automatic code inside xbmc/addons/interface/interface.cpp and .h + generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H(options.force) + + ## Generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp + generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP(options.force) + + # This generate automatic code inside xbmc/addons/kodi-dev-kit/src/shared/Instances.h + generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H(options) + + # Update xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h + generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H(options.force) + + + + + + + + + + + + + ## This generate all automatic code inside xbmc/addons/kodi-dev-kit/src/shared/kodi/ + #generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(options.force) + + ## Generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/api_in + #generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES(options.force) + + ## Generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/api_out + #generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES(options.force) + + ## Generate automatic code inside xbmc/addons/interface/api_in + #generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES(options.force) + + ## Generate automatic code inside xbmc/addons/interface/api_out + #generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES(options.force) + + + ## Generate or update all files in xbmc/addons/interface/api + ## WARNING This must be called last as it scan other created dirs + #generate__SOURCE__xbmc_addons_interface_api_ALL_FILES(options.force) + +#=============================================================================== +def GenerateCMakeParts(options): + print('.-------------------------------------------------------------------------------') + print('· Generate cmake parts ...') + + # Generate all the "CMakeLists.txt" files in xbmc/addons/kodi-dev-kit/include/kodi + generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES(options.force) + + # Generate the "CMakeLists.txt" in xbmc/addons/kodi-dev-kit/src/shared + generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT(options.force) + + # Generate all the "CMakeLists.txt" files in xbmc/addons/kodi-dev-kit/src/addon + generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES(options.force) + + # This call generate the "CMakeLists.txt" in xbmc/addons/interface + generate__CMAKE__xbmc_addons_interface_ALL_FILES(options.force) + + # Generate Kodi's cmake system related include files to find related parts + generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT(options.force) + generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT(options.force) + +#=============================================================================== +def print_error(msg): + print('Error: %s\nSee --help for usage.' % msg) + +#=============================================================================== +if __name__ == "__main__": + # parse command-line options + disc = """ + This utility autogenerate the interface between Kodi and addon. + """ + parser = OptionParser(description=disc) + parser.add_option( + '-f', + '--force', + action='store_true', + dest='force', + default=False, + help='force the generation of auto code') + parser.add_option( + '-d', + '--debug', + action='store_true', + dest='debug', + default=False, + help='Add debug indendifiers to generated files') + (options, args) = parser.parse_args() + + print('Auto generation of addon interface code started ...') + + if os.path.isdir('./tmp'): + shutil.rmtree('./tmp') + + GetHighestUsedAPI() # Init it + ScanAllHdlVoidPointer() + ScanAllEnums() + + callbacks = find_callback_use_places(options) + data = interface_code_generator(options, callbacks) + + api = 1 + while True: + dl_gen = LibraryDLGenerator(options, api) + if not dl_gen.Generate(): + break + api += 1 + + #----------------------------------------------------------------------------- + # Source code generation + data = '' + GenerateSourceParts(options, data) + + ##----------------------------------------------------------------------------- + # CMake generation + #GenerateCMakeParts(options) + + + +#ScanAllHdlVoidPointer(kodi_dir) +#ScanAllFunctionAutoGenHelp(kodi_dir) + +#generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(kodi_dir, force) +####generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_addoninstance_INSTANCES_H(kodi_dir, force) +#generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in__ALL_FILES(kodi_dir, force) + + + + + + + + +#generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_addon_control_cpp(kodi_dir, force) +#generate__SOURCE__xbmc_addons_interface_api(kodi_dir, force) +#generate__SOURCE__api_autogen(kodi_dir, force) + +##generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi(kodi_dir, force) + + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/ignored_api_structs.txt b/xbmc/addons/kodi-dev-kit/tools/code-generator/ignored_api_structs.txt new file mode 100644 index 0000000000000..aade5d8652b33 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/ignored_api_structs.txt @@ -0,0 +1 @@ +KODI_INSTANCE_HDL diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/direct_func_table_generator.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/direct_func_table_generator.py new file mode 100644 index 0000000000000..d6beb8c5c1a6b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/direct_func_table_generator.py @@ -0,0 +1,283 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +from hashlib import sha256 + +import glob +import os +import re +import filecmp +import shutil + +class DirectFuncTableGenerator: + def __init__(self, options): + self.options = options + self.api_list_init_code = [] + self.api_list_typedef = [] + self.api_list_struct = [] + + def Generate(self): + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + scan_dir = search_dir + '/**/' + + highest_found_api = 0 + + includes_h = '' + includes_c = '' + structs = '' + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=True)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + api_list_typedef = [] + api_list_struct = [] + api_list_init_code = [] + with open(src_part) as f: + file_text = f.read() + f.close() + + header_group_id = TranslatePathToCUsableString(src_part, search_dir) + + function_addon = '' + for line in file_text.splitlines(): + if 'ATTR_DLL_EXPORT' in line \ + and not '#define' in line: + line = line.strip() + if line.startswith('//') or line.startswith('/*'): + continue + function_addon = line; + elif function_addon != '': + function_addon += line; + if function_addon != '' and ';' in line: + function_addon = " ".join(function_addon.split()) + + scanner = RegexScanExport(function_addon, self.options) + scanner.ScanFunction() + + if scanner.api_added > highest_found_api: + highest_found_api = scanner.api_added; + + if scanner.api_added > highest_found_api: + highest_found_api = scanner.api_added; + + func_values = '' + current_value = 1 + for value in scanner.values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + + include = '#include "../{}"\n'.format(src_part.replace(search_dir, '')) + check_type = value_type.replace('*', '').replace('[]', '').replace('const', '').strip() + if not check_type in known_STANDARD_C_TYPES \ + and check_type != 'char' \ + and check_type != 'void': + if 'struct ' in value_type: + struct = '{};\n'.format(check_type) + if not struct in structs: + structs += struct + else: + if not include in includes_h: + includes_h += include + else: + value_name = '' + value_type = '...' + + func_values += value_type + (', ' if current_value < len(scanner.values) else '') + current_value += 1 + + include = '#include "../{}"\n'.format(src_part.replace(search_dir, '')) + check_type = scanner.retval.replace('*', '').replace('[]', '').replace('const', '').strip() + if not check_type in known_STANDARD_C_TYPES \ + and check_type != 'char' \ + and check_type != 'void': + if 'struct ' in scanner.retval: + struct = '{};\n'.format(check_type) + if not struct in structs: + structs += struct + else: + if not include in includes_h: + includes_h += include + include_c = include.replace('"../', '"include/kodi/c-api/') + if not include_c in includes_c and not include in includes_h: + includes_c += include_c + + entry = (' addonIfc->to_kodi.{}.{} = {};' + .format(header_group_id, + scanner.funcname, + scanner.funcname)) + api_list_init_code.append(entry) + + entry = ('typedef {}(ATTR_INT_APIENTRYP PFN_INT_{}_V{})({});' + .format(scanner.retval, + scanner.funcname.upper(), + scanner.api_added, + func_values)) + api_list_typedef.append(entry) + + entry = (' PFN_INT_{}_V{} {};' + .format(scanner.funcname.upper(), + scanner.api_added, + scanner.funcname)) + api_list_struct.append(entry) + function_addon = ''; + continue + + if api_list_struct and api_list_typedef: + self.api_list_typedef.append('// {}'.format(src_part.replace(search_dir, ''))) + self.api_list_typedef += sorted(api_list_typedef) + self.api_list_typedef.append('') + + self.api_list_struct.append('struct {}'.format(header_group_id)) + self.api_list_struct.append('{') + self.api_list_struct.append(' void* thisClassHdl;') + self.api_list_struct += sorted(api_list_struct) + self.api_list_struct.append('};\n') + + code_struct = '' + code_struct += '#ifndef ATTR_INT_APIENTRYP\n' + code_struct += '#define ATTR_INT_APIENTRYP ATTR_APIENTRYP\n' + code_struct += '#endif\n' + code_struct += '\n' + code_struct += '#ifndef ATTR_INT_DLL_EXPORT\n' + code_struct += '#define ATTR_INT_DLL_EXPORT ATTR_DLL_EXPORT\n' + code_struct += '#endif\n' + code_struct += '\n' + code_struct += '\n'.join(sorted(api_list_typedef)) + code_struct += '\n' + code_struct += '\n' + code_struct += 'struct directFunc_{}\n'.format(header_group_id) + code_struct += '{\n' + code_struct += ' void* thisClassHdl;\n' + code_struct += '\n'.join(sorted(api_list_struct)) + code_struct += '\n};\n' + code_struct += '\n' + + code_func = '' + code_func += 'void CHdl_kodi_{}::Init(directFunc_Interface* addonIfc)\n'.format(header_group_id) + code_func += '{\n' + code_func += '\n'.join(sorted(api_list_init_code)) + code_func += '\n}\n' + + print(code_struct) + exit() + + + + + self.api_list_init_code.append(' // {}'.format(src_part.replace(search_dir, ''))) + self.api_list_init_code += sorted(api_list_init_code) + self.api_list_init_code.append('') + + code_part = '' + for entry in self.api_list_typedef: + code_part += ' {}\n'.format(entry) + + code_part += ' struct direct_func_table\n' + code_part += ' {\n' + for entry in self.api_list_struct: + code_part += ' {}\n'.format(entry) + code_part += ' };\n' + + #print(code_part) + + #hashedWord = sha256(code_part.encode('utf-8')).hexdigest() + + #code_h = header_file_copyright + #code_h += '\n' + #code_h += '/* API_HASH<{}> */\n'.format(hashedWord) + #code_h += '\n' + #code_h += '#ifndef C_API_DL_API_{}_H\n'.format(self.api) + #code_h += '#define C_API_DL_API_{}_H\n'.format(self.api) + #code_h += '\n' + #code_h += '#include "../addon_base.h"\n' + #code_h += includes_h + #code_h += '\n' + #code_h += '#ifndef ATTR_DL_APIENTRYP\n' + #code_h += '#define ATTR_DL_APIENTRYP ATTR_APIENTRYP\n' + #code_h += '#endif\n' + #code_h += '\n' + #code_h += '#ifndef ATTR_DL_DLL_EXPORT\n' + #code_h += '#define ATTR_DL_DLL_EXPORT ATTR_DLL_EXPORT\n' + #code_h += '#endif\n' + #code_h += '\n' + #code_h += '#ifdef __cplusplus\n' + #code_h += 'extern "C"\n' + #code_h += '{\n' + #code_h += '#endif /* __cplusplus */\n' + #code_h += '\n' + #code_h += ' struct kodi_api_{};\n'.format(self.api) + #code_h += '\n' + #code_h += ' ATTR_DL_DLL_EXPORT bool load_kodi_api_{}(struct kodi_api_{}* api);\n'.format(self.api, self.api) + #code_h += '\n' + #code_h += structs + #code_h += '\n' + #code_h += code_part + #code_h += '\n' + #code_h += '#ifdef __cplusplus\n' + #code_h += '} /* extern "C" */\n' + #code_h += '#endif /* __cplusplus */\n' + #code_h += '\n' + #code_h += '#endif /* C_API_DL_API_{}_H */\n'.format(self.api) + + #temp_file = './tmp/tmp-auto-gen.h' + #os.makedirs(os.path.dirname(temp_file), exist_ok=True) + #f = open(temp_file, "w") + #f.write(code_h) + #f.close() + + #os.system('clang-format -style=file -i ' + temp_file) + + #target_file = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_{}.h'.format(kodi_dir, self.api) + #if self.options.force \ + #or not os.path.isfile(target_file) \ + #or not filecmp.cmp(target_file, temp_file): + #print(' - Updating ' + target_file) + #os.makedirs(os.path.dirname(target_file), exist_ok=True) + #shutil.copyfile(temp_file, target_file) + + #code_c = header_file_copyright + #code_c += '\n' + #code_c += '/* API_HASH<{}> */\n'.format(hashedWord) + #code_c += '\n' + #code_c += '#include "include/kodi/c-api/dl/kodi_api_{}.h"\n'.format(self.api) + #code_c += '\n' + #code_c += includes_c + #code_c += '\n' + #code_c += 'ATTR_DL_DLL_EXPORT bool load_kodi_api_{}(struct kodi_api_{}* api)\n'.format(self.api, self.api) + #code_c += '{\n' + #code_c += ' if (api == NULL)\n' + #code_c += ' {\n' + #code_c += ' return false;\n' + #code_c += ' }\n' + #code_c += '\n' + #code_c += '\n'.join(self.api_list_init_code) + #code_c += '\n' + #code_c += ' return true;\n' + #code_c += '}\n' + + #temp_file = './tmp/tmp-auto-gen.c' + #os.makedirs(os.path.dirname(temp_file), exist_ok=True) + #f = open(temp_file, "w") + #f.write(code_c) + #f.close() + + #os.system('clang-format -style=file -i ' + temp_file) + + #target_file = '{}xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_{}.c'.format(kodi_dir, self.api) + #if self.options.force \ + #or not os.path.isfile(target_file) \ + #or not filecmp.cmp(target_file, temp_file): + #print(' - Updating ' + target_file) + #os.makedirs(os.path.dirname(target_file), exist_ok=True) + #shutil.copyfile(temp_file, target_file) + + #return True if highest_found_api > self.api else False diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/find_callback_use_places.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/find_callback_use_places.py new file mode 100644 index 0000000000000..afa352aea5bea --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/find_callback_use_places.py @@ -0,0 +1,137 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re +import filecmp +import shutil + +class found_callback_function: + def __init__(self): + api_call = '' + complete = '' + function_name = '' + class_name = '' + call_class = '' + header = '' + +def find_callback_use_places(options): + print(' - Scanning for use places of callbacks in Kodi') + + ret_list = [] + + search_dir = '{}xbmc'.format(kodi_dir) + ignored_dir1 = '{}xbmc/addons/kodi-dev-kit'.format(kodi_dir) + ignored_dir2 = '{}xbmc/addons/interface'.format(kodi_dir) + scan_dir = search_dir + '/**/*.h' + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for path in dirs: + if path.startswith(ignored_dir1) or path.startswith(ignored_dir2): + continue + + with open(path) as f: + file_text = f.read() + f.close() + + if not '---AUTO_GEN_PARSE---\*\/$', line) + if m and m.group(1): + found = found_callback_function() + found.api_call = m.group(1) + found.complete = prev_line.split(';')[-2].strip() if line.startswith('/*') else line + found.header = path.replace(search_dir + '/', '') + + m = re.search('^.*\ (.*[a-zA-Z0-9_])(?:[\t ]*)\(', found.complete) + if m and m.group(1): + found.function_name = m.group(1) + + found.call_class = '' + for entry in last_count_type: + found.call_class += entry[1] + '::' + if found.call_class.endswith('::'): + found.call_class = found.call_class[:-2] + + ret_list.append(found) + + prev_line = line + + return ret_list diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT.py new file mode 100644 index 0000000000000..739f60f3a5d40 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT.py @@ -0,0 +1,39 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE_TREEDATA__common_ADDON_DEV_KIT_TXT(force): + """ + This function generate the "cmake/treedata/common/addon_dev_kit.txt" + by scan of related directories to use for addon interface build. + """ + gen_file = 'cmake/treedata/common/addon_dev_kit.txt' + + print(' - Check for ' + gen_file) + + scan_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/**/CMakeLists.txt' + + cmakelists = glob.glob(scan_dir, recursive=True) + parts = '# Auto generated ' + gen_file + '.\n'\ + '# See xbmc/addons/kodi-dev-kit/tools/code-generator.py.\n\n' + for entry in cmakelists: + cmake_dir = entry.replace(kodi_dir, '').replace('/CMakeLists.txt', '') + with open(entry) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^ *core_add_devkit_header\((.*)\)', line) + if m: + parts += cmake_dir + ' addons_kodi-dev-kit_include_' + m.group(1) + '\n' + break + parts += 'xbmc/addons/kodi-dev-kit/src/shared devkit_shared # Hardcoded entry, edit script for change!\n' + parts += 'xbmc/addons/kodi-dev-kit/src/addon kodidevkit # Hardcoded entry, edit script for change!\n' + file = kodi_dir + gen_file + if not os.path.isfile(file) or parts != open(file).read() or force: + print(' - Generated new ' + gen_file) + f = open(file, "w") + f.write(parts) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT.py new file mode 100644 index 0000000000000..4f1cd8c20944a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT.py @@ -0,0 +1,37 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE_TREEDATA__common_ADDON_INTERFACE_TXT(force): + """ + This function generate the "cmake/treedata/common/addon_interface.txt" + by scan of related directories to use for addon interface build. + """ + gen_file = 'cmake/treedata/common/addon_interface.txt' + + print(' - Check for ' + gen_file) + + scan_dir = kodi_dir + 'xbmc/addons/interface/**/CMakeLists.txt' + + cmakelists = glob.glob(scan_dir, recursive=True) + parts = '# Auto generated ' + gen_file + '.\n'\ + '# See xbmc/addons/kodi-dev-kit/tools/code-generator.py.\n\n' + for entry in cmakelists: + cmake_dir = entry.replace(kodi_dir, '').replace('/CMakeLists.txt', '') + with open(entry) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^ *core_add_library\((.*)\)', line) + if m: + parts += cmake_dir + ' ' + m.group(1) + '\n' + break + file = kodi_dir + gen_file + if not os.path.isfile(file) or parts != open(file).read() or force: + print(' - Generated new ' + gen_file) + f = open(kodi_dir + gen_file, "w") + f.write(parts) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_interface_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_interface_ALL_FILES.py new file mode 100644 index 0000000000000..16d27ba68e5f4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_interface_ALL_FILES.py @@ -0,0 +1,90 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE__xbmc_addons_interface_ALL_FILES(force): + """ + This function generate the "CMakeLists.txt" in xbmc/addons/interface + and sub dirs by scan of available files + """ + print(' - Generate CMakeLists.txt files in xbmc/addons/interface dirs') + + scan_dir = kodi_dir + 'xbmc/addons/interface/**/' + + found = False + dirs = glob.glob(scan_dir, recursive=True) + for dir in dirs: + source_dir = dir.replace(kodi_dir, '') + print(' - Check for ' + source_dir + 'CMakeLists.txt') + + # Scan for *.cpp + source_entry = [] + src_parts = sorted(glob.glob(dir + '*.cpp', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + source_entry.append('$<$:' + src_part.replace(dir, '') + '>') + found = True + break + if not found: + source_entry.append(src_part.replace(dir, '')) + found = False + + cmake_src_text = 'set(SOURCES\n' + for entry in source_entry: + cmake_src_text += ' ' + entry + '\n' + cmake_src_text += ')' + + # Scan for *.h + header_entry = [] + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + header_entry.append('$<$:' + src_part.replace(dir, '') + '>') + found = True + break + if not found: + header_entry.append(src_part.replace(dir, '')) + found = False + + cmake_hdr_text = 'set(HEADERS\n' + for entry in header_entry: + cmake_hdr_text += ' ' + entry + '\n' + cmake_hdr_text += ')' + + # Generate cmake sub part name + cmake_part = source_dir.lstrip('xbmc/').replace('/', '_').rstrip('_') + + # Make final CMakeLists.txt + cmake_file = '# Auto generated CMakeLists.txt.\n'\ + '# See xbmc/addons/kodi-dev-kit/tools/code-generator.py.\n'\ + '\n'\ + + cmake_src_text + '\n' +\ + '\n'\ + + cmake_hdr_text + '\n'\ + '\n'\ + 'if(NOT ENABLE_STATIC_LIBS OR SOURCES)\n'\ + ' core_add_library(' + cmake_part + ')\n'\ + 'endif()\n' + + file = dir + 'CMakeLists.txt' + if not os.path.isfile(file) or cmake_file != open(file).read() or force: + print(' - Generated new ' + source_dir + 'CMakeLists.txt') + f = open(file, "w") + f.write(cmake_file) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..bd0bd23eac245 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES.py @@ -0,0 +1,66 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE__xbmc_addons_kodidevkit_include_kodi_ALL_FILES(force): + """ + This function generate the "CMakeLists.txt" in xbmc/addons/kodi-dev-kit/include/kodi + and sub dirs by scan of available files + """ + print(' - Generate CMakeLists.txt files in xbmc/addons/kodi-dev-kit/include/kodi dirs') + + scan_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/**/' + + found = False + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(kodi_dir, '') + print(' - Check for ' + source_dir + 'CMakeLists.txt') + + # Scan for *.h + header_entry = [] + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(", "): + header_entry.append('$<$:' + src_part.replace(dir, '') + '>') + found = True + break + if not found: + header_entry.append(src_part.replace(dir, '')) + found = False + + + cmake_hdr_text = 'set(HEADERS\n' + for entry in header_entry: + cmake_hdr_text += ' ' + entry + '\n' + cmake_hdr_text += ')' + + # Generate cmake sub part name + cmake_part = source_dir[len('xbmc/addons/kodi-dev-kit/include_'):].replace('/', '_').rstrip('_') + + # Make final CMakeLists.txt + cmake_file = '# Auto generated CMakeLists.txt.\n'\ + '# See xbmc/addons/kodi-dev-kit/tools/code-generator.py.\n'\ + '\n'\ + + cmake_hdr_text + '\n'\ + '\n'\ + 'if(HEADERS)\n'\ + ' core_add_devkit_header(' + cmake_part + ')\n'\ + 'endif()\n' + + file = dir + 'CMakeLists.txt' + if not os.path.isfile(file) or cmake_file != open(file).read() or force: + print(' - Generated new ' + source_dir + 'CMakeLists.txt') + f = open(file, "w") + f.write(cmake_file) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES.py new file mode 100644 index 0000000000000..40c88615b6b5e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES.py @@ -0,0 +1,125 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE__xbmc_addons_kodidevkit_src_addon_ALL_FILES(force): + """ + This function generate the "CMakeLists.txt" in xbmc/addons/kodi-dev-kit/src/addon + and sub dirs by scan of available files + + The base CMakeLists.txt is not generated by him and need hand edit. + """ + print(' - Generate CMakeLists.txt files in xbmc/addons/kodi-dev-kit/src/addon dirs') + + scan_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/addon/**/*/' + + base_cmake_subdirs = '' + base_cmake_file = 'xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt' + if not os.path.exists(kodi_dir + base_cmake_file): + print('ERROR: Needed ' + base_cmake_file + ' not present!') + exit() + + found = False + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(kodi_dir, '') + print(' - Check for ' + source_dir + 'CMakeLists.txt') + + # Scan for *.cpp + source_entry = [] + src_parts = sorted(glob.glob(dir + '*.cpp', recursive=False)) + src_parts += sorted(glob.glob(dir + '*.c', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + source_entry.append('$<$:' + src_part.replace(dir, '') + '>') + found = True + break + if not found: + source_entry.append(src_part.replace(dir, '')) + found = False + + cmake_src_text = 'set(SOURCES\n' + for entry in source_entry: + cmake_src_text += ' ' + entry + '\n' + cmake_src_text += ')' + + # Scan for *.h + header_entry = [] + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + header_entry.append('$<$:' + src_part.replace(dir, '') + '>') + found = True + break + if not found: + header_entry.append(src_part.replace(dir, '')) + found = False + + cmake_hdr_text = 'set(HEADERS\n' + for entry in header_entry: + cmake_hdr_text += ' ' + entry + '\n' + cmake_hdr_text += ')' + + # Generate cmake sub part name + cmake_dir = source_dir[len('xbmc/addons/kodi-dev-kit/src/addon/'):-1] + cmake_part = cmake_dir.replace('/', '_').rstrip('_') + + # Make final CMakeLists.txt + cmake_file = '# Auto generated CMakeLists.txt.\n'\ + '# See xbmc/addons/kodi-dev-kit/tools/code-generator.py.\n'\ + '\n'\ + + cmake_src_text + '\n' +\ + '\n'\ + + cmake_hdr_text + '\n'\ + '\n'\ + 'if(SOURCES OR HEADERS)\n'\ + ' devkit_add_object(devkit_' + cmake_part + ')\n'\ + 'endif()\n' + + file = dir + 'CMakeLists.txt' + if not os.path.isfile(file) or cmake_file != open(file).read() or force: + print(' - Generated new ' + source_dir + 'CMakeLists.txt') + f = open(file, "w") + f.write(cmake_file) + f.close() + + base_cmake_subdirs += 'add_subdirectory(' + cmake_dir + ')\n' + + cmake_file = '' + f = open(kodi_dir + base_cmake_file, 'r') + data = f.read() + start = False + for line in data.splitlines(): + if '---AUTO_GEN_PARSE---' in line: + cmake_file += line + '\n' + start = True + elif '---AUTO_GEN_PARSE---' in line: + cmake_file += base_cmake_subdirs + cmake_file += line + '\n' + start = False + elif start: + continue + else: + cmake_file += line + '\n' + + if cmake_file != data or force: + print(' - Generated new ' + base_cmake_file) + f = open(kodi_dir + base_cmake_file, "w") + f.write(cmake_file) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT.py new file mode 100644 index 0000000000000..25193275fba5f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT.py @@ -0,0 +1,116 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__CMAKE__xbmc_addons_kodidevkit_src_shared_CMAKELISTS_TXT(force): + """ + This function generate the "CMakeLists.txt" in xbmc/addons/kodi-dev-kit/src/shared + and sub dirs by scan of available files + + The base CMakeLists.txt is not generated by him and need hand edit. + """ + print(' - Generate xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt') + + base_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/' + scan_dir = base_dir + '**/' + + base_cmake_file = 'xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt' + if not os.path.exists(kodi_dir + base_cmake_file): + print('ERROR: Needed ' + base_cmake_file + ' not present!') + exit() + + found = False + source_entry = [] + header_entry = [] + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(kodi_dir, '') + + # Scan for *.cpp + src_parts = sorted(glob.glob(dir + '*.cpp', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + source_entry.append('$<$:' + src_part.replace(base_dir, '${CMAKE_CURRENT_SOURCE_DIR}/') + '>') + found = True + break + if not found: + source_entry.append(src_part.replace(base_dir, '${CMAKE_CURRENT_SOURCE_DIR}/')) + found = False + + # Scan for *.h + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as search: + for line in search: + line = line.rstrip() # remove '\n' at end of line + m = re.search('^\/\*---AUTO_GEN_PARSE<\$\$(.*):(.*)>---\*\/', line) + if m: + if m.group(1) == 'CORE_SYSTEM_NAME': + for entry in m.group(2).split(","): + header_entry.append('$<$:' + src_part.replace(base_dir, '${CMAKE_CURRENT_SOURCE_DIR}/') + '>') + found = True + break + if not found: + header_entry.append(src_part.replace(base_dir, '${CMAKE_CURRENT_SOURCE_DIR}/')) + found = False + + CMAKE_SHARED_DEV_KIT_SOURCES = 'set(SOURCES\n' + for entry in source_entry: + CMAKE_SHARED_DEV_KIT_SOURCES += ' ' + entry + '\n' + CMAKE_SHARED_DEV_KIT_SOURCES += ')' + + CMAKE_SHARED_DEV_KIT_HEADERS = 'set(HEADERS\n' + for entry in header_entry: + CMAKE_SHARED_DEV_KIT_HEADERS += ' ' + entry + '\n' + CMAKE_SHARED_DEV_KIT_HEADERS += ')' + + source_file = '' + f = open(base_dir + 'CMakeLists.txt', 'r') + data = f.read() + start_1 = False + start_2 = False + for line in data.splitlines(): + # Header include + if '---AUTO_GEN_PARSE---' in line: + source_file += line + '\n' + source_file += '# Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py\n' + start_1 = True + elif '---AUTO_GEN_PARSE---' in line: + source_file += CMAKE_SHARED_DEV_KIT_SOURCES + '\n' + source_file += line + '\n' + start_1 = False + elif start_1: + continue + # Class creation + elif '---AUTO_GEN_PARSE---' in line: + source_file += line + '\n' + source_file += '# Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py\n' + start_2 = True + elif '---AUTO_GEN_PARSE---' in line: + source_file += CMAKE_SHARED_DEV_KIT_HEADERS + '\n' + source_file += line + '\n' + start_2 = False + elif start_2: + continue + else: + source_file += line + '\n' + + if start_1 or start_2: + print('ERROR: Needed CMAKE_SHARED_DEV_KIT_SOURCES_END or CMAKE_SHARED_DEV_KIT_HEADERS_END not present in' + base_dir + 'CMakeLists.txt') + exit() + + if source_file != data or force: + print(' - Updating ' + base_dir + 'CMakeLists.txt') + f = open(base_dir + 'CMakeLists.txt', "w") + f.write(source_file) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__dev_kit_instance_construct.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__dev_kit_instance_construct.py new file mode 100644 index 0000000000000..db95d17236cfe --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__dev_kit_instance_construct.py @@ -0,0 +1,208 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re +import filecmp +import shutil + +class Generate_kodi_addon_instance_construct: + """ + This class generate the code for following two interface functions within devkit lib. + - CHdl_kodi_addon_base_h::kodi_addon_create_instance + - CHdl_kodi_addon_base_h::kodi_addon_destroy_instance + + Becomes done to reduce hand work as for every instance type a copy of his function address + structure is needed. + + NOTE: Maybe improve the whole ways to prevent this here? + + As usable class values are: + - self.create_code for kodi_addon_create_instance + - self.destroy_code for kodi_addon_destroy_instance + """ + def __init__(self, options): + self.options = options + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/'.format(kodi_dir) + scan_dir = search_dir + '**/' + + instance_stucts = [] + src_parts = sorted(glob.glob(scan_dir + '*.h', recursive=True)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + with open(src_part) as f: + file_text = f.read() + f.close() + + if not '_CREATE_V' in file_text or not '_DESTROY_V' in file_text: # a bit ugly check now + continue + + instance_stucts.append(src_part.replace(search_dir, '').replace('.h', '').replace('-', '')) + + lowest_api = GetLowestUsedAPI() + highest_api = GetHighestUsedAPI() + + #--------------------------------------------------------------------------- + # Generate part for "CHdl_kodi_addon_base_h::kodi_addon_create_instance" + + code = 'ADDON_STATUS dummy()\n{\n' + code += ' // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes!\n' + code += ' ADDON_STATUS status;\n' + code += ' UnionAddonFunctions* data = reinterpret_cast(hdl);\n' + code += ' if (data->types.kodi_addon.v1.create_instance)\n' + code += ' {\n' + code += ' UnionAddonFunctions* instanceStruct = new UnionAddonFunctions();\n' + code += ' instanceStruct->type = instanceType;\n' + code += ' instanceStruct->kodi = instance;\n' + code += '\n' + code += ' KODI_INSTANCE_HDL addonIntInstance = {};\n' + code += ' addonIntInstance.type = instanceType;\n' + code += ' addonIntInstance.kodi = instance;\n' + code += ' addonIntInstance.kodi_first_instance = instance == thisClass->m_ifc->kodiFirstInstance;\n' + code += ' addonIntInstance.dummy = &instanceStruct->types.dummy;\n' + code += '\n' + code += ' status = data->types.kodi_addon.v1.create_instance(data->hdl, instanceType, instanceID.c_str(),\n' + code += ' &addonIntInstance, parent);\n' + code += ' if ((!addonIntInstance.dummy || addonIntInstance.type != instanceType) &&\n' + code += ' status == ADDON_STATUS_OK)\n' + code += ' {\n' + code += ' status = ADDON_STATUS_PERMANENT_FAILURE;\n' + code += ' }\n' + code += ' else if (addonIntInstance.dummy)\n' + code += ' {\n' + code += ' instanceStruct->type = instanceType;\n' + code += ' instanceStruct->addon_struct_ptr = addonIntInstance.dummy;\n' + + for entry in instance_stucts: + funcname = 'kodi_addon_{}'.format(entry) + filename = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/{}.h'.format(kodi_dir, entry) + + code += ' if (instanceType == ADDON_INSTANCE_{})\n'.format(entry.upper()) + code += ' {\n' + if IsHighestUsedFunctionVersion(filename, funcname + '_create', 'create', lowest_api): + code += (' if (&instanceStruct->types.{}.v{} != reinterpret_casttypes.{}.v{})*>(addonIntInstance.{}))\n' + .format(funcname, lowest_api, funcname, lowest_api, entry)) + code += (' instanceStruct->types.{}.v{} = *reinterpret_casttypes.{}.v{})*>(addonIntInstance.{});\n' + .format(funcname, lowest_api, funcname, lowest_api, entry)) + code += ' if (instanceStruct->types.{}.v{}.create)\n'.format(funcname, lowest_api) + code += ' instanceStruct->hdl = instanceStruct->types.{}.v{}.create(instance);\n'.format(funcname, lowest_api) + code += ' else\n' + code += ' instanceStruct->hdl = addonIntInstance.instance;\n' + code += ' goto done;\n' + else: + code += ' switch (AddonIfc::g_ifc->api)\n' + code += ' {\n' + for i in range(highest_api, lowest_api-1, -1): + code += ' case __KODI_API_{}__:\n'.format(i) + if not IsLowerToUsedFunctionVersion(filename, funcname + '_create', 'create', i): + code += ' {\n' + code += (' if (&instanceStruct->types.{}.v{} != reinterpret_casttypes.{}.v{})*>(addonIntInstance.{}))\n' + .format(funcname, i, funcname, i, entry)) + code += (' instanceStruct->types.{}.v{} = *reinterpret_casttypes.{}.v{})*>(addonIntInstance.{});\n' + .format(funcname, i, funcname, i, entry)) + code += ' if (instanceStruct->types.{}.v{}.create)\n'.format(funcname, i) + code += ' instanceStruct->hdl = instanceStruct->types.{}.v{}.create(instance);\n'.format(funcname, i) + code += ' else\n' + code += ' instanceStruct->hdl = addonIntInstance.instance;\n' + code += ' goto done;\n' + code += ' }\n' + code += ' default:\n' + code += ' break;\n' + code += ' }\n' + code += ' }\n' + code += ' done:\n' + code += ' *addonInstance = instanceStruct;\n' + code += ' return status;\n' + code += ' }\n' + code += '\n' + code += ' delete instanceStruct;\n' + code += ' }\n' + code += ' else\n' + code += ' status = ADDON_STATUS_NOT_IMPLEMENTED;\n' + code += '\n' + code += ' return status;\n' + code += '}\n' + + # Make temporary file for clang cleanup + temp_file = './tmp/addon-instance/Generate_kodi_addon_create_instance.cpp' + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + f = open(temp_file, "w") + f.write(code) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + f = open(temp_file, "r") + code = f.read() + f.close() + code = code.split("\n", 2)[2].rsplit("\n",2)[0] + + self.create_code = code + + #--------------------------------------------------------------------------- + # Generate part for "CHdl_kodi_addon_base_h::kodi_addon_destroy_instance" + + code = 'void dummy()\n{\n' + code += ' // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes!\n' + code += ' UnionAddonFunctions* data = reinterpret_cast(hdl);\n' + code += ' UnionAddonFunctions* instanceStruct = reinterpret_cast(instance);\n' + code += ' if (instanceStruct)\n' + code += ' {\n' + + for entry in instance_stucts: + print(entry) + funcname = 'kodi_addon_{}'.format(entry) + filename = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/{}.h'.format(kodi_dir, entry) + + code += ' if (instanceType == ADDON_INSTANCE_{})\n'.format(entry.upper()) + code += ' {\n' + if IsHighestUsedFunctionVersion(filename, funcname + '_destroy', 'destroy', lowest_api): + code += ' if (instanceStruct->types.{}.v{}.destroy)\n'.format(funcname, lowest_api) + code += ' instanceStruct->types.{}.v{}.destroy(instanceStruct->hdl);\n'.format(funcname, lowest_api) + code += ' goto done;\n' + else: + code += ' switch (AddonIfc::g_ifc->api)\n' + code += ' {\n' + for i in range(highest_api, lowest_api-1, -1): + code += ' case __KODI_API_{}__:\n'.format(i) + if not IsLowerToUsedFunctionVersion(filename, funcname + '_destroy', 'destroy', i): + code += ' {\n' + code += ' if (instanceStruct->types.{}.v{}.destroy)\n'.format(funcname, i) + code += ' instanceStruct->types.{}.v{}.destroy(instanceStruct->hdl);\n'.format(funcname, i) + code += ' goto done;\n' + code += ' }\n' + code += ' default:\n' + code += ' break;\n' + code += ' }\n' + code += ' }\n' + + code += ' done:\n' + code += ' if (data->types.kodi_addon.v1.destroy_instance)\n' + code += ' {\n' + code += ' KODI_INSTANCE_HDL addonInstance = {};\n' + code += ' addonInstance.kodi = instanceStruct->kodi;\n' + code += ' addonInstance.type = instanceType;\n' + code += ' addonInstance.instance = instanceStruct->hdl;\n' + code += ' addonInstance.dummy = instanceStruct->addon_struct_ptr;\n' + code += ' data->types.kodi_addon.v1.destroy_instance(data->hdl, instanceType, &addonInstance);\n' + code += ' }\n' + code += ' delete instanceStruct;\n' + code += ' }\n' + code += '}\n' + + # Make temporary file for clang cleanup + temp_file = './tmp/addon-instance/Generate_kodi_addon_destroy_instance.cpp' + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + f = open(temp_file, "w") + f.write(code) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + f = open(temp_file, "r") + code = f.read() + f.close() + code = code.split("\n", 2)[2].rsplit("\n",2)[0] + + self.destroy_code = code diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H.py new file mode 100644 index 0000000000000..d511b7c52ee98 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H.py @@ -0,0 +1,117 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os + +def generate__SOURCE__xbmc_addons_interface_INTERFACE_CPP_H(force): + print(' - Generate part changes in xbmc/addons/interface/Interface.cpp and xbmc/addons/interface/Interface.h') + + base_dir_cpp = kodi_dir + 'xbmc/addons/interface/Interface.cpp' + base_dir_h = kodi_dir + 'xbmc/addons/interface/Interface.h' + + if not os.path.exists(base_dir_cpp): + print('ERROR: Needed ' + base_dir_cpp + ' not present!') + exit() + if not os.path.exists(base_dir_h): + print('ERROR: Needed ' + base_dir_h + ' not present!') + exit() + + src_list_include = "" + src_list_set1 = "" + src_list_set2 = "" + hdr_list_set1 = "" + hdr_list_set2 = "" + search_dir = kodi_dir + 'xbmc/addons/interface/api/' + scan_dir = search_dir + '**/' + + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + src_list_include += '#include "api/{}"\n'.format(src_part.replace(search_dir, '')) + part_name = src_part.replace(search_dir, '').replace('.', '_').replace('/', '_').replace('-', '') + src_list_set1 += ' kodi_{} = new CHdl_kodi_{}(*this);\n'.format(part_name, part_name) + src_list_set1 += ' m_handlers[funcGroup_{}] = kodi_{};\n'.format(part_name, part_name) + + src_list_set2 += (' kodi_{}->InitDirect(&m_directIfc->to_kodi.{}, &m_directIfc->to_addon.{});\n' + .format(part_name, part_name, part_name)) + + hdr_list_set1 += 'class CHdl_kodi_{};\n'.format(part_name, part_name) + hdr_list_set2 += ' CHdl_kodi_{}* kodi_{};\n'.format(part_name, part_name) + + new_code = '' + with open(base_dir_cpp) as f: + data = f.read() + f.close() + + INTERFACE_CPP_SET_INCLUDE = False + INTERFACE_CPP_H_SET = False + for line in data.splitlines(): + if not INTERFACE_CPP_SET_INCLUDE and not INTERFACE_CPP_H_SET: + new_code += line + '\n' + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_SET_INCLUDE = True + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_SET_INCLUDE = False + new_code += src_list_include + new_code += line + '\n' + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET = True + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET = False + new_code += src_list_set1 + new_code += '\n' + new_code += ' if (m_directIfc != nullptr)\n' + new_code += ' {\n' + new_code += '{}'.format(src_list_set2) + new_code += ' }\n' + new_code += line + '\n' + + if data != new_code or force: + print(' - Updating {}'.format(base_dir_cpp.replace(kodi_dir, ''))) + f = open(base_dir_cpp, "w") + f.write(new_code) + f.close() + #os.system('clang-format -style=file -i ' + base_dir_cpp) + + new_code = '' + with open(base_dir_h) as f: + data = f.read() + f.close() + + INTERFACE_CPP_H_SET1 = False + INTERFACE_CPP_H_SET2 = False + for line in data.splitlines(): + if not INTERFACE_CPP_H_SET1 and not INTERFACE_CPP_H_SET2: + new_code += line + '\n' + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET1 = True + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET1 = False + new_code += hdr_list_set1 + new_code += line + '\n' + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET2 = True + + if '/*---AUTO_GEN_PARSE---*/' in line: + INTERFACE_CPP_H_SET2 = False + new_code += hdr_list_set2 + new_code += line + '\n' + + if data != new_code or force: + print(' - Updating {}'.format(base_dir_h.replace(kodi_dir, ''))) + f = open(base_dir_h, "w") + f.write(new_code) + f.close() + #os.system('clang-format -style=file -i ' + base_dir_h) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_ALL_FILES.py new file mode 100644 index 0000000000000..13fa01a9d3260 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_ALL_FILES.py @@ -0,0 +1,70 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os + +def generate__SOURCE__xbmc_addons_interface_api_ALL_FILES(force): + """ + This function generate dirs and files in xbmc/addons/interface/api. + + They are used only to make use in Kodi cleaner as the in and out not need to + include separate, also can the user add some hand edited code to there. + """ + print(' - Generate dirs and files in xbmc/addons/interface/api/') + + # If new generate his dir + target_dir = kodi_dir + 'xbmc/addons/interface/api/' + if not os.path.exists(target_dir): + os.makedirs(target_dir) + + search_dir = kodi_dir + 'xbmc/addons/interface/api_in/' + dirs = sorted(glob.glob(search_dir + '**/', recursive=True)) + for dir in dirs: + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + + # If new generate his dir + target = dir.replace('/api_in/', '/api/') + if not os.path.exists(target): + os.makedirs(target) + + for src_part in src_parts: + source_file = target_dir + src_part.replace(search_dir, '') + + src = header_file_copyright + src += '#pragma once\n' + src += '\n' + src += '#include "' + src_part.replace(kodi_dir + 'xbmc/', '') + '"\n' + + src_part = src_part.replace('/api_in/', '/api_out/') + if os.path.exists(src_part): + src += '#include "' + src_part.replace(kodi_dir + 'xbmc/', '') + '"\n' + + src += '\n' + src += '/* Code below becomes on auto generation reused, hand edited parts should included here */\n' + src += '/*---AUTO_GEN_PARSE---*/\n' + + hand_edited = '' + if os.path.exists(source_file): + f = open(source_file, 'r') + data = f.read() + start = False + for line in data.splitlines(): + if '/*---AUTO_GEN_PARSE---*/' in line: + start = True + elif '/*---AUTO_GEN_PARSE---*/' in line: + start = False + elif start: + hand_edited += line + '\n' + + src += hand_edited + src += '/*---AUTO_GEN_PARSE---*/\n' + + if not os.path.isfile(source_file) or src != open(source_file).read() or force: + print(' - Generated new or updated ' + source_file.replace(kodi_dir, '')) + f = open(source_file, 'w') + f.write(src) + f.close() + os.system('clang-format -style=file -i ' + source_file) + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..0534ebc6ee090 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES.py @@ -0,0 +1,14 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_interface_api_in_kodi_ALL_FILES(force): + """ + This function generate automatic code inside xbmc/addons/interface/api_in + """ + print(' - Generate files in xbmc/addons/interface/api_in') + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..7de3c22f5ca3f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES.py @@ -0,0 +1,14 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_interface_api_out_kodi_ALL_FILES(force): + """ + This function generate automatic code inside xbmc/addons/interface/api_out + """ + print(' - Generate files in xbmc/addons/interface/api_out') + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..1b979e792071d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES.py @@ -0,0 +1,14 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_in_kodi_ALL_FILES(force): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/api_in + """ + print(' - Generate files in xbmc/addons/kodi-dev-kit/src/addon/api_in/') + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..1ebaa0e64ed19 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES.py @@ -0,0 +1,13 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_kodidevkit_src_addon_api_out_kodi_ALL_FILES(force): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/api_out + """ + print(' - Generate files in xbmc/addons/kodi-dev-kit/src/addon/api_out/') diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP.py new file mode 100644 index 0000000000000..8a5d2492d8e84 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP.py @@ -0,0 +1,88 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_kodidevkit_src_addon_core_ADDON_CONTROL_CPP(force): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp. + + Currently it set there the include to all interface parts and his class creations. + Work code insde must be edited by hand. + """ + base_dir = 'xbmc/addons/kodi-dev-kit/src/addon/' + file_name = base_dir + 'core/addon_control.cpp' + print(' - Generate auto code in ' + file_name) + + scan_dir = kodi_dir + base_dir + 'api/**/' + + CONTROL_SOURCE_INCLUDE = '' + CONTROL_CLASS_CREATION = '' + CONTROL_CLASS_CREATION_2 = '' + for dir in sorted(glob.glob(scan_dir, recursive=True)): + # Scan for used headers + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + src_part = src_part.replace(kodi_dir + base_dir, '') + CONTROL_SOURCE_INCLUDE += '#include "' + src_part + '"\n' + + f = open(src_part.replace('api/', '../../include/kodi/c-api/'), 'r') + data = f.read() + f.close() + if not 'ATTR_APIENTRYP' in data: + continue + + src_part = src_part.replace('api/', '').replace('-', '').replace('/', '_').replace('.', '_') + CONTROL_CLASS_CREATION += ' CHdl_kodi_{}* {} = new CHdl_kodi_{}(m_ifc);\n'.format(src_part, src_part, src_part) + CONTROL_CLASS_CREATION += ' m_handlers[funcGroup_{}] = {};\n'.format(src_part, src_part) + + CONTROL_CLASS_CREATION_2 += ' {}->InitDirect(&m_ifc->direct->to_addon.{});\n'.format(src_part, src_part, src_part) + + source_file = '' + f = open(kodi_dir + file_name, 'r') + data = f.read() + start_1 = False + start_2 = False + for line in data.splitlines(): + # Header include + if '---AUTO_GEN_PARSE---' in line: + source_file += line + '\n' + source_file += '/* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */\n' + start_1 = True + elif '---AUTO_GEN_PARSE---' in line: + source_file += CONTROL_SOURCE_INCLUDE + source_file += line + '\n' + start_1 = False + elif start_1: + continue + # Class creation + elif '---AUTO_GEN_PARSE---' in line: + source_file += line + '\n' + source_file += ' /* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */\n' + start_2 = True + elif '---AUTO_GEN_PARSE---' in line: + source_file += CONTROL_CLASS_CREATION + source_file += '\n' + source_file += ' if (m_ifc->direct != nullptr)\n' + source_file += ' {\n' + source_file += CONTROL_CLASS_CREATION_2 + source_file += ' }\n' + source_file += line + '\n' + start_2 = False + elif start_2: + continue + else: + source_file += line + '\n' + + if start_1 or start_2: + print('ERROR: Needed CONTROL_CLASS_CREATION_END or CONTROL_SOURCE_INCLUDE_END not present in' + file_name) + exit() + + if source_file != data or force: + print(' - Updating ' + file_name) + f = open(kodi_dir + file_name, "w") + f.write(source_file) + f.close() diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H.py new file mode 100644 index 0000000000000..964cdc1e10fdd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H.py @@ -0,0 +1,97 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os + +def generate__SOURCE__xbmc_addons_kodidevkit_src_shared_DIRECTDATA_H(options): + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = '{}xbmc/addons/kodi-dev-kit/src/shared/api/'.format(kodi_dir) + scan_dir = search_dir + '/**/' + + code_include = [] + code_struct_to_kodi = [] + code_struct_to_addon = [] + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + src_parts = sorted(glob.glob(dir + '*.h', recursive=True)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + header_group_id = TranslatePathToCUsableString(src_part, search_dir) + code_struct_to_kodi.append(' directFuncToKodi_{} {};'.format(header_group_id, header_group_id)) + code_struct_to_addon.append(' directFuncToAddon_{} {};'.format(header_group_id, header_group_id)) + code_include.append('#include "{}"'.format(src_part.replace(search_dir, 'src/shared/api/'))) + + if len(code_struct_to_kodi) == 0: + code_struct_to_kodi.append(' int dummyValue;') + if len(code_struct_to_addon) == 0: + code_struct_to_addon.append(' int dummyValue;') + + file_text = header_file_copyright + """\ + +/* + * This header is used to allow direct api interface between addon and Kodi. + * Becomes used in case the addon is loaded as dynamic lib and without use of + * shared memory. + * + * This can be in case if higher performance needed or OS not support + * independent apps (e.g. iOS/tvos) + * + * The structure defined here is only used between library and Kodi not used + * inside addon itself, with this are changes here not critical. + */ + +#pragma once + +""" + '\n'.join(code_include) + """ +#include "src/shared/api/processor.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct DirectAddonIfcToKodi +{ +""" + '\n'.join(code_struct_to_kodi) + """ +}; + +struct DirectAddonIfcToAddon +{ +""" + '\n'.join(code_struct_to_addon) + """ + directFuncToAddon_processor_h processor_h; +}; + +struct DirectAddonIfc +{ + DirectAddonIfcToKodi to_kodi; + DirectAddonIfcToAddon to_addon; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ +""" + + # Make now the creation and copy of file + target_file = '../../../../../xbmc/addons/kodi-dev-kit/src/shared/DirectData.h' + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if options.force \ + or not os.path.isfile(target_file) \ + or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H.py new file mode 100644 index 0000000000000..6cc88db3bce52 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H.py @@ -0,0 +1,85 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os + +def generate__SOURCE__xbmc_addons_kodidevkit_src_shared_INSTANCES_H(force): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/shared/Instances.h + """ + print(' - Generate file xbmc/addons/kodi-dev-kit/src/shared/Instances.h') + + target_file = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/Instances.h' + if not os.path.exists(target_file): + print('FATAL: File ' + target_file + 'not exists!') + exit() + + USED_INCLUDES = '' + USED_UNIONS = ' uint32_t dummy;\n' + + search_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/api/' + scan_dir = search_dir + '**/' + + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + + with open(src_part, 'r') as f: + file_text = f.read() + f.close() + + found = '' + for line in file_text.splitlines(): + if 'union KODI_' in line: + found = line + + if not found: + continue + + USED_INCLUDES += '#include "src/shared/api/' + src_part.replace(search_dir, '') + '"\n' + name = src_part.replace(search_dir, 'kodi_').replace('.h', '').replace('/', '_').replace('addon-instance', 'addon') + print(name) + #exit() + USED_UNIONS += ' {} {};\n'.format(found, found.replace('union ', '').replace('_FUNC_UNION', '').lower()) + + f = open(target_file, 'r') + data = f.read() + f.close() + is_set_1 = False + is_set_2 = False + start_1 = False + start_2 = False + file_text = '' + for line in data.splitlines(): + if '/*---AUTO_GEN_PARSE---*/' in line: + start_1 = True + elif '/*---AUTO_GEN_PARSE---*/' in line: + is_set_1 = False + start_1 = False + elif start_1 and not is_set_1: + file_text += USED_INCLUDES + is_set_1 = True + continue + + if '/*---AUTO_GEN_PARSE---*/' in line: + start_2 = True + elif '/*---AUTO_GEN_PARSE---*/' in line: + is_set_2 = False + start_2 = False + elif start_2 and not is_set_2: + file_text += USED_UNIONS + is_set_2 = True + continue + + if not is_set_1 and not is_set_2: + file_text += line + '\n'; + + if file_text != data or force: + print(' - Updating ' + target_file.replace(kodi_dir, '')) + f = open(target_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + target_file) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H.py new file mode 100644 index 0000000000000..17a1c620811ae --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H.py @@ -0,0 +1,64 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os + +def generate__SOURCE__xbmc_addons_kodidevkit_src_shared_SHAREDGROUPS_H(force): + """ + This function generate the "SharedGroups.h in xbmc/addons/kodi-dev-kit/src/shared. + + The whole file not generated, only the related group enums becomes updated + """ + print(' - Generate used interface groups in xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h') + + search_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/' + scan_dir = search_dir + '**/' + new_source_insert = '' + + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(kodi_dir, '') + + # Scan for used interface headers + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + # Translate the dir to a C usable ident string + new_source_insert += ' funcGroup_' + TranslatePathToCUsableString(src_part, search_dir) + ',\n' + + source_file = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h' + + # Read SharedGroups.h and add wanted enums + new_source = '' + f = open(source_file, 'r') + data = f.read() + start = False + for line in data.splitlines(): + if '/*---AUTO_GEN_PARSE---*/' in line: + start = True + new_source += line + '\n' + new_source += ' /* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */\n' + new_source += new_source_insert + + if not start: + new_source += line + '\n' + + if '/*---AUTO_GEN_PARSE---*/' in line: + start = False + new_source += line + '\n' + if (start): + continue + + f.close() + + # If differences or force update the file + if not os.path.isfile(source_file) or new_source != open(source_file).read() or force: + print(' - Updated ' + source_file.replace(kodi_dir, '')) + f = open(source_file, 'w') + f.write(new_source) + f.close() + os.system('clang-format -style=file -i ' + source_file) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES.py new file mode 100644 index 0000000000000..4209f5e8a4659 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES.py @@ -0,0 +1,14 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +import glob +import os +import re + +def generate__SOURCE__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(force): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/shared/kodi + """ + print(' - Generate files in xbmc/addons/kodi-dev-kit/src/shared/kodi/') + diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/helpers.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/helpers.py new file mode 100644 index 0000000000000..df01cfbcfaa76 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/helpers.py @@ -0,0 +1,607 @@ +from code_generator import * +from datetime import datetime + +import glob +import re +import os + +global header_file_copyright +header_file_copyright = """\ +/* + * Copyright (C) 2005-""" + str(datetime.now().year) + """ Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +/* File autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py */ +""" + +lowest_api = -1 +highest_api = -1 +known_VOID_PTR_DEFINES = [] # List created by ScanAllHdlVoidPointer +known_ENUMS = [] # List created by ScanAllEnums +known_ENUMS_DEFAULT = [] # List created by ScanAllEnums +known_C_STRUCTURES = [ ] + +known_STANDARD_C_TYPES = [ 'unsigned int', + 'signed int', + 'int', + 'unsigned short', + 'signed short', + 'short', + 'unsigned long', + 'signed long', + 'long', + 'unsigned long long', + 'signed long long', + 'long long', + 'bool', + 'float', + 'double', + 'long double', + 'int64_t', + 'int32_t', + 'int16_t', + 'int8_t', + 'uint64_t', + 'uint32_t', + 'uint16_t', + 'uint8_t', + 'size_t', + 'ssize_t', + 'time_t' ] + +known_STANDARD_C_PTR_TYPES = [ 'void*', + 'unsigned int*', + 'signed int*', + 'int*', + 'unsigned short*', + 'signed short*', + 'short*', + 'unsigned long*', + 'signed long*', + 'long*', + 'unsigned long long*', + 'signed long long*', + 'long long*', + 'bool*', + 'float*', + 'double*', + 'long double*', + 'int64_t*', + 'int32_t*', + 'int16_t*', + 'int8_t*', + 'uint64_t*', + 'uint32_t*', + 'uint16_t*', + 'uint8_t*', + 'size_t*', + 'ssize_t*' ] + +known_STANDARD_C_TYPES_UNSIGNED = [ 'unsigned int', + 'unsigned short', + 'unsigned long', + 'unsigned long long', + 'uint64_t', + 'uint32_t', + 'uint16_t', + 'uint8_t', + 'size_t' ] + +known_STANDARD_C_TYPES_SIGNED = [ 'signed int', + 'int', + 'signed short', + 'short', + 'signed long', + 'long', + 'signed long long', + 'long long', + 'int64_t', + 'int32_t', + 'int16_t', + 'int8_t', + 'ssize_t', + 'time_t' ] + +ignored_FUNCTIONS = [ ] + +def ScanAllHdlVoidPointer(): + search_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/' + scan_dir = search_dir + '/**/' + + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as f: + data = f.read() + f.close() + + for line in data.splitlines(): + m = re.search('^.*?#define\ *([a-zA-Z[0-9_]*)\ *void\*', line) + if m and m.group(1): + known_VOID_PTR_DEFINES.append(m.group(1)) + continue + m = re.search('^.*typedef* void\** ([a-zA-Z[0-9_]*)\ *;$', line) + if m and m.group(1): + known_VOID_PTR_DEFINES.append(m.group(1)) + continue + +def ScanAllEnums(): + search_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/' + scan_dir = search_dir + '/**/' + + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + found_one = '' + found_use = '' + for src_part in src_parts: + with open(src_part) as f: + data = f.read() + f.close() + + for line in data.splitlines(): + if found_one: + if '{' in line: + found_use = found_one + if not found_one in known_ENUMS: + known_ENUMS.append(found_one) + found_one = '' + continue + if found_use: + if '//' in line or '/*' in line: + continue; + known_ENUMS_DEFAULT.append([found_use, line.strip().split(',')[0].split('=')[0].strip()]) + found_use = '' + + if not 'enum' in line: + continue + + m = re.search('^.*?enum\ *([a-zA-Z[0-9_]*)', line) + if m and m.group(1) and not m.group(1) in known_ENUMS: + found_one = m.group(1) + continue + +def CheckKnownEnum(value): + if len(value.split()) > 1: + m = re.search('^.*?enum\ *([a-zA-Z[0-9_]*)', value) + if m and m.group(1) and m.group(1) in known_ENUMS: + return True + elif value in known_ENUMS: + return True + return False + +class GetCStruct: + def __init__(self, name): + self.entry = '' + self.code = [] + self.path = '' + + name = name.replace('struct ', '') + + for entry, code, path in known_C_STRUCTURES: + if entry == name: + self.entry = entry + self.code = code + self.path = path + return + + search_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/' + scan_dir = search_dir + '/**/' + + code = [] + dirs = sorted(glob.glob(scan_dir, recursive=True)) + path = '' + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=False)) + for src_part in src_parts: + with open(src_part) as f: + data = f.read() + f.close() + + found = False + begin_found = False + for line in data.splitlines(): + if not found and not 'struct' in line: + continue + code_line = line.strip() + if not begin_found and code_line.startswith('{'): + begin_found = True + continue + if code_line == '' or code_line.startswith('//') or code_line.startswith('/*'): + continue + if not found: + m = re.search('^\ *(?:typedef)?\ *?struct *([a-zA-Z[0-9_]*)$', line) + if m and m.group(1) and m.group(1) == name: + found = True + path = src_part + else: + m = re.search('^\ *}\ *(\ *[a-zA-Z[0-9_]*)\;$', line) + if m: + break + code.append(code_line.split(';')[0] + ';') + if len(code) > 0: + known_C_STRUCTURES.append((name, code, path)) + self.entry = name + self.code = code + self.path = path + break + return + +def TranslatePathToCUsableString(path, search_dir): + return path.replace(search_dir, '').replace('.h', '_h').replace('/', '_').replace('-', '') + +def FileContainsInterfaceAPICalls(file_path): + with open(file_path) as f: + data = f.read() + f.close() + for line in data.splitlines(): + if ('ATTR_APIENTRYP' in line or 'ATTR_DLL_EXPORT' in line) and not '#define' in line: + return True + + return False + +def FileContainsInterfaceAPICallsToAddon(file_path): + with open(file_path) as f: + data = f.read() + f.close() + for line in data.splitlines(): + if 'ATTR_APIENTRYP' in line and not '#define' in line and not line.strip().startswith('//'): + return True + + return False + +def IsIgnoredFunction(name): + if name in ignored_FUNCTIONS: + return True + + return False + +def ContainsHdlVoidPointer(value): + value = value.replace('const ', '') + if value.split(' ', 1)[0] in known_VOID_PTR_DEFINES: + return True + return False + +def CodeGetField_AUTO_GEN_PARSE(target_file, field_name): + hand_edited = '' + if os.path.exists(target_file): + f = open(target_file, 'r') + data = f.read() + f.close() + start = False + for line in data.splitlines(): + if '/*---AUTO_GEN_PARSE<' + field_name + '>---*/' in line: + start = True + elif '/*---AUTO_GEN_PARSE<' + field_name + '_END>---*/' in line: + start = False + elif start: + hand_edited += line + '\n' + + # Fallback for check without version + if hand_edited == '': + m = re.search('kodi_.*(_v[0-9]*)$', field_name) + if m and m.group(1): + field_name = field_name.replace(m.group(1), '') + start = False + for line in data.splitlines(): + if '/*---AUTO_GEN_PARSE<' + field_name + '>---*/' in line: + start = True + elif '/*---AUTO_GEN_PARSE<' + field_name + '_END>---*/' in line: + start = False + elif start: + hand_edited += line + '\n' + + return hand_edited + +def MakeSpaces(file_text): + text = '' + for x in range(len(file_text)+1): + text += ' ' + return text + +def FindDefaultEnumReturn(retval): + for enum in known_ENUMS_DEFAULT: + if retval == enum[0]: + return enum[1] + return ' 0' + +def GetDefaultReturn(retval, function_complete, file_text, scan_file = ''): + if retval == 'void': + return '' + elif 'bool' in retval: + return ' false' + elif '*' in retval: + return ' nullptr' + elif ContainsHdlVoidPointer(retval): + return ' nullptr' + elif 'float' in retval: + return ' 0.0f' + elif 'double' in retval: + return ' 0.0' + elif retval in known_STANDARD_C_TYPES_UNSIGNED: + return ' 0' + elif retval in known_STANDARD_C_TYPES_SIGNED: + return ' -1' + elif 'enum ' in retval: + return ' ' + FindDefaultEnumReturn(retval.replace('enum ', '')) + else: + for line in file_text.splitlines(): + if retval in line: + m = re.search('typedef .* \(\*' + retval + '\)\(.*\);', line) + if m: + return ' nullptr' + + print('FATAL: Can\'t get default return for:') + print(' \'{}\''.format(function_complete)) + if scan_file: + print(' On file {}'.format(scan_file)) + if not 'enum ' in retval and CheckKnownEnum('enum ' + retval): + print(' You must set for enum a "C" conform value where must begin with enum ("enum {}")'.format(retval)) + else: + print(' Detected non void return value and can\'t find a usable default about!') + raise + +def CheckCorrectFunctionValue(value): + value_reduced = value.replace('*', '').replace('const ', '').replace('long long ', 'long ').strip() + if '...' in value_reduced: + return '' + if len(value_reduced.split()) <= 1: + return 'No value name present on "{}"'.format(value) + if '&' in value_reduced: + return 'C++ pointer set in C function "{}"'.format(value) + + value_reduced = value_reduced.replace('enum ', '').replace('struct ', '') + if len(value_reduced.split()) <= 1: + return 'No value name present on "{}"'.format(value) + return '' + +class RegexScanImport: + def __init__(self, function, options): + self.function = function + self.options = options + self.retval = '' + self.funcname = '' + self.values = [] + self.api_added = -1 + self.api_deprecated = -1 + self.api_removed = -1 + + self.ifc_name_typdef = '' + self.ifc_name_func = '' + self.groupname = '' + self.funcname_api_lib = '' + + def ScanFunction(self, file_text = ''): + regex_code = '^typedef\ *(.*)\ ?\(\ *ATTR_APIENTRYP PFN_(.+?)\_V([0-9])\)(?=\()\((.*?)(?=\);|\) *__).+?(|(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))?.?(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))?.(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))(?:[ \t]*));$' + m = re.search(regex_code, self.function) + if not m or not m.group(1) or not m.group(2) or not m.group(3) \ + and not m.group(4) and not m.group(6) and not m.group(8): + print('ERROR: Function \'' + self.function + '\' not match wanted API!') + return False + + self.retval = m.group(1) + self.funcname = m.group(2).lower() + self.api_added = int(m.group(3)) + self.api_deprecated = -1 + self.api_removed = -1 + self.values = [] + for value in m.group(4).split(', '): + if value.strip() != '': + self.values.append(value.strip()) + + if m.group(6) and m.group(6) == 'INTRODUCED': + self.api_added = int(m.group(7)) + elif m.group(6) and m.group(6) == 'DEPRECATED': + self.api_deprecated = int(m.group(7)) + elif m.group(6) and m.group(6) == 'REMOVED': + self.api_removed = int(m.group(7)) + if m.group(8) and m.group(8) == 'INTRODUCED': + self.api_added = int(m.group(9)) + elif m.group(8) and m.group(8) == 'DEPRECATED': + self.api_deprecated = int(m.group(9)) + elif m.group(8) and m.group(8) == 'REMOVED': + self.api_removed = int(m.group(9)) + if m.group(10) and m.group(10) == 'INTRODUCED': + self.api_added = int(m.group(11)) + elif m.group(10) and m.group(10) == 'DEPRECATED': + self.api_deprecated = int(m.group(11)) + elif m.group(10) and m.group(10) == 'REMOVED': + self.api_removed = int(m.group(11)) + + self.ifc_name_typdef = 'PFN_{}_V{}'.format(m.group(2), self.api_added) + for line in file_text.splitlines(): + m = re.search('^\ *' + self.ifc_name_typdef + '\ *([a-z0-9_].*)\;', line) + if m and m.group(1): + self.ifc_name_func = m.group(1) + break + + if self.ifc_name_func != '': + self.groupname = self.funcname.replace('_' + self.ifc_name_func, '') + if not self.groupname: + print('FATAL: Can\'t get groupname and function name for:') + print(' \'{}\''.format(function)) + print(' Have you defined the use of typedef inside function structure?') + raise NameError('Dev kit scan failure') + + self.funcname_api_lib = '{}_v{}'.format(self.funcname, self.api_added) + + return True + +class RegexScanExport: + def __init__(self, function, options): + self.function = function + self.options = options + self.retval = '' + self.funcname = '' + self.values = [] + self.api_added = -1 + self.api_deprecated = -1 + self.api_removed = -1 + + def ScanFunction(self, file_text = ''): + regex_code = '^(?:[ \t]*)?ATTR_DLL_EXPORT[ \t]*(.*)[ \t](kodi.+?)(?=\()\((.*?)(?=\);|\). *__).+?(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))?.?(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))?.(?:__(DEPRECATED|INTRODUCED|REMOVED)_IN_KODI\(([0-9]+)\))(?:[ \t]*);$' + m = re.search(regex_code, self.function) + if not m or not m.group(1) or not m.group(2) or not m.group(3) \ + and not m.group(4) and not m.group(6) and not m.group(8): + print('ERROR: Function \'' + self.function + '\' not match wanted API!') + return False + + self.retval = m.group(1) + self.funcname = m.group(2) + self.values = [] + for value in m.group(3).split(', '): + if value.strip() != '': + self.values.append(value.strip()) + + self.api_added = -1 + self.api_deprecated = -1 + self.api_removed = -1 + if m.group(4) and m.group(4) == 'INTRODUCED': + self.api_added = int(m.group(5)) + elif m.group(4) and m.group(4) == 'DEPRECATED': + self.api_deprecated = int(m.group(5)) + elif m.group(4) and m.group(4) == 'REMOVED': + self.api_removed = int(m.group(5)) + if m.group(6) and m.group(6) == 'INTRODUCED': + self.api_added = int(m.group(7)) + elif m.group(6) and m.group(6) == 'DEPRECATED': + self.api_deprecated = int(m.group(7)) + elif m.group(6) and m.group(6) == 'REMOVED': + self.api_removed = int(m.group(7)) + if m.group(8) and m.group(8) == 'INTRODUCED': + self.api_added = int(m.group(9)) + elif m.group(8) and m.group(8) == 'DEPRECATED': + self.api_deprecated = int(m.group(9)) + elif m.group(8) and m.group(8) == 'REMOVED': + self.api_removed = int(m.group(9)) + + return True + +def GetLowestUsedAPI(): + """ + This function return the lowest used API version from Kodi dev kit. + + On first call the "kodi/c-api/version.h" becomes checked, on every next call + the found value becomes reused. + + Returns: + integer: The lowest API used. + + Raises: + NameError: If something within scan goes wrong, error message comes before. + + Examples: + >>> api = GetLowestUsedAPI() + """ + global lowest_api + if lowest_api > 0: + return lowest_api + + # If not present start GetHighestUsedAPI where scan on init both + GetHighestUsedAPI() + return lowest_api + +def GetHighestUsedAPI(): + """ + This function return the highest used API version from Kodi dev kit. + + On first call the "kodi/c-api/version.h" becomes checked, on every next call + the found value becomes reused. + + Returns: + integer: The highest API used. + + Raises: + NameError: If something within scan goes wrong, error message comes before. + + Examples: + >>> api = GetHighestUsedAPI() + """ + global highest_api + if highest_api > 0: + return highest_api + + global lowest_api + + with open(kodi_dir + 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h', 'r') as f: + file_text = f.read() + f.close() + + version_list = [] + for line in file_text.splitlines(): + m = re.search('^#define\ __KODI_API_([0-9]*)__[ \t]*([0-9]*)?[ \t]*', line) + if m and m.group(1) and m.group(2): + if m.group(1) != m.group(2): + print('FATAL: Inside "kodi-dev-kit/include/kodi/c-api/version.h" for API {} define set with different number {}.'.format(m.group(1), m.group(2))) + print(' Both should equal!') + raise NameError('Dev kit scan failure') + if int(m.group(1)) > highest_api: + highest_api = int(m.group(1)) + version_list.append(highest_api) + if int(m.group(1)) < lowest_api or lowest_api < 0: + lowest_api = int(m.group(1)) + + start_api = lowest_api + for api in version_list: + if api != start_api: + print('FATAL: It seems between Kodi min API {} and max API {} is API {} missing!'.format(lowest_api, highest_api, start_api)) + print(' Is "kodi-dev-kit/include/kodi/c-api/version.h" set correct?') + raise NameError('Dev kit scan failure') + start_api += 1 + + if highest_api < 0: + print('FATAL: Failed to get currently highest used api version!') + print(' Is "kodi-dev-kit/include/kodi/c-api/version.h" available and set correct?') + raise NameError('Dev kit scan failure') + + print('- Highest on scan found and used Kodi API version: {}'.format(highest_api)) + print('- Lowest on scan found and used Kodi API version: {}'.format(lowest_api)) + return highest_api + +def IsHighestUsedFunctionVersion(file_name, function, ifc_name_func, api_added): + with open(file_name, 'r') as f: + file_text = f.read() + f.close() + + for line in file_text.splitlines(): + if line.strip().startswith('PFN_{}_V'.format(function.upper())): + api_max = GetHighestUsedAPI() + while api_max > int(api_added): + if line.strip().startswith('PFN_{}_V{} {};'.format(function.upper(), api_max, ifc_name_func)): + return False + + api_max -= 1 + + for line in file_text.splitlines(): + if line.strip().startswith('PFN_{}_V{} {};'.format(function.upper(), int(api_added), ifc_name_func)): + return True + + print('FATAL: Failed to find "{}"!'.format('PFN_{}_V{} {};'.format(function.upper(), int(api_added), ifc_name_func))) + print(' Is "{}" set correct?'.format(file_name)) + raise NameError('Dev kit scan failure') + +def IsLowerToUsedFunctionVersion(file_name, function, ifc_name_func, api_added): + + if api_added <= GetLowestUsedAPI(): + return False + + with open(file_name, 'r') as f: + file_text = f.read() + f.close() + + for line in file_text.splitlines(): + if line.strip().startswith('PFN_{}_V{} {};'.format(function.upper(), api_added, ifc_name_func)): + return False + + return True diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/interface_code_generator.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/interface_code_generator.py new file mode 100644 index 0000000000000..73d261e908e18 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/interface_code_generator.py @@ -0,0 +1,5737 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +from .generate__SOURCE__dev_kit_instance_construct import * + +import glob +import os +import re +import filecmp +import shutil + +ignored_structs = [] + +class APIEntryClass: + def __init__(self, entries): + self.entries = entries + +class APIEntryFunction: + def __init__(self): + self.from_api = -1 + self.to_api = -1 + self.equal_ptr_from = -1 + self.equal_ptr_to = -1 + self.name = '' + self.scan_code = None + +class GroupData: + def __init__(self, callbacks, options): + self.callbacks = callbacks + self.options = options + self.header_group_id = '' + self.interface_data_to_addon = [] + self.interface_data_to_kodi = [] + self.shared_structures = [] + self.shared_structures_other_file = [] + self.used_enums = [] + self.to_kodi_direct_func_table = [] + self.to_kodi_api_list_typedef = [] + self.to_addon_direct_func_table = [] + self.to_addon_api_list_typedef = [] + self.path = '' + self.kodi_ifc_includes = [] + self.additional_addon_lib_includes = [] + self.additional_shared_includes = [] + self.independent_to_addon_api_structs = '' + self.functions_equal_everywhere = [] + self.functions_api_list = [] + + + self.api_control_entries = [] + + self.override_use_direct_api_only = False + + self.last_struct_scan_1 = '' + self.last_struct_scan_2 = '' + + def GenerateToKodiInitDirectFunction(self): + """ + Generate a function to use inside Kodi to set function addresses about + direct calls from addon to Kodi. + + The function addresses are then used on addon dev kit library, due to + creation together with Kodi and not accessed by addon direct can be + parts here changed without destroy of addon API. + + The target source places are on *.cpp files on ./xbmc/addons/interface/api + + Returns: + string: Code text of generated function. + + WARNING: This addresses are not usable inside independent sandbox api, only + thought to use on direct loaded addon as dynamic library (e.g. needed on + iOS or tvOS). + + Produced code example: + ~~~~~~~~~~~~~~~~~ + void CHdl_kodi_addon_base_h::InitDirect(directFuncToKodi_addon_base_h* ifc) + { + ifc->thisClassHdl = this; + // Unused "kodi_check_main_shared", done only in addon lib + // Unused "kodi_init", done only in addon lib + // Unused "kodi_deinit", done only in addon lib + // Unused "kodi_process", done only in addon lib + ifc->kodi_log = kodi_log; + ifc->kodi_addon_get_lib_path = kodi_addon_get_lib_path; + ... + } + ~~~~~~~~~~~~~~~~~ + """ + ret = ('void CHdl_kodi_{}::InitDirect(directFuncToKodi_{}* ifcToKodi, directFuncToAddon_{}* ifcToAddon)\n' + .format(self.header_group_id, + self.header_group_id, + self.header_group_id, + self.header_group_id)) + ret += '{\n' + ret += ' ifcToKodi->thisClassHdl = this;\n' + ret += ' m_ifcToAddon = ifcToAddon;\n' + for data in self.interface_data_to_kodi: + if not data.use_internal_only: + ret += ' ifcToKodi->{} = {};\n'.format(data.funcname_ifc, data.funcname_ifc) + else: + ret += ' // Unused "{}", done only in addon lib\n'.format(data.funcname) + ret += '}\n' + return ret + + def GenerateToAddonInitDirectFunction(self): + ret = ('void CHdl_kodi_{}::InitDirect(directFuncToAddon_{}* ifcToAddon)\n' + .format(self.header_group_id, + self.header_group_id, + self.header_group_id, + self.header_group_id)) + ret += '{\n' + ret += ' ifcToAddon->thisClassHdl = this;\n' + for data in self.interface_data_to_addon: + ret += ' ifcToAddon->{} = {};\n'.format(data.funcname_ifc, data.funcname_ifc) + ret += '}\n' + return ret + + def GenerateToKodiDirectFuncTable(self): + ret = '// Code here relates to direct API calls without use of shared mem from addon to Kodi.\n' + ret += '//{{{\n' + ret += '\n' + ret += '\n'.join(sorted(self.to_kodi_api_list_typedef)) + ret += '\n' + ret += '\n' + ret += 'struct directFuncToKodi_{}\n'.format(self.header_group_id) + ret += '{\n' + ret += ' void* thisClassHdl;\n' + ret += '\n'.join(sorted(self.to_kodi_direct_func_table)) + ret += '\n};\n' + ret += '\n' + ret += '//}}}\n' + + return ret + + def GenerateToAddonDirectFuncTable(self): + ret = '// Code here relates to direct API calls without use of shared mem from Kodi to addon.\n' + ret += '//{{{\n' + ret += '\n' + ret += '\n'.join(sorted(self.to_addon_api_list_typedef)) + ret += '\n' + ret += '\n' + ret += 'struct directFuncToAddon_{}\n'.format(self.header_group_id) + ret += '{\n' + ret += ' void* thisClassHdl;\n' + ret += '\n'.join(sorted(self.to_addon_direct_func_table)) + ret += '\n};\n' + ret += '\n' + ret += '//}}}\n' + + return ret + + def GenerateIndependentAPIStructs(self): + class APIEntry: + def __init__(self, api_min, api_max, api_struct): + self.api_min = api_min + self.api_max = api_max + self.api_struct = api_struct + self.api_struct_with_note = [] + self.api_struct_with_note += self.api_struct + self.api_equal = [] + + if not FileContainsInterfaceAPICallsToAddon(self.path): + return + + lowest_api = GetLowestUsedAPI() + highest_api = GetHighestUsedAPI() + + function_kodi = '' + scans = [] + with open(self.path, 'r') as f: + file_text = f.read() + f.close() + + for line in file_text.splitlines(): + if 'ATTR_APIENTRYP' in line \ + and not line.strip().startswith('#'): + function_kodi = line; + elif function_kodi != '': + function_kodi += line; + if function_kodi != '' and ';' in line: + function_kodi = " ".join(function_kodi.split()) + + scan = RegexScanImport(function_kodi, self.options) + if not scan.ScanFunction(file_text): + function_kodi = '' + continue + + scans.append(scan) + function_kodi = '' + + if len(scans) == 0: + print('FATAL: File {} failed to get API typedefs!'.format(self.path)) + raise NameError('Dev kit scan failure') + + + struct_name = '{}_FUNC'.format(scans[0].groupname.upper()) + + found = 0 + in_doc = False + in_else = None + code = '' + + api_entries = [] + for i in range(highest_api-lowest_api+1): + api_entries.append([]) + + api_code_defs = [] + for line in file_text.splitlines(): + line = line.strip() + if len(line) == 0 or line.startswith('//'): + continue + if line.startswith('/*'): + in_doc = True + if in_doc and line.endswith('*/'): + in_doc = False + continue + if in_doc: + continue + + if found == 2: + if line.startswith('#if __KODI_API__ '): + api_code_defs.append(line.replace('#if __KODI_API__ ', '').split()) + continue + if line.startswith('#elif __KODI_API__ '): + in_else = api_code_defs[-1] + del api_code_defs[-1] + api_code_defs.append(line.replace('#elif __KODI_API__ ', '').split()) + continue + if line.startswith('#else'): + in_else = api_code_defs[-1] + del api_code_defs[-1] + continue + if line.startswith('#endif'): + if in_else == None: + del api_code_defs[-1] + in_else = None + continue + + if found == 0 and line.replace('typedef ', '').startswith('struct ' + struct_name): + if '{' in line: + found = 2 + else: + found = 1 + continue + if found == 1 and line.startswith('{'): + found = 2 + continue + if found == 2: + if line.startswith('}'): + break + + code += line + if not ';' in line: + continue + + code = " ".join(code.split()) + typedef = code.split()[0] + + scan_found = None + for scan in scans: + if scan.ifc_name_typdef == typedef: + scan_found = scan + break + + if scan_found == None: + print('FATAL: In struct \'{}\' is \'{}\', but typedef \'{}\' not found!'.format(struct_name, code, typedef)) + print(' File {}'.format(src_part)) + raise NameError('Dev kit scan failure') + + for i in range(highest_api-lowest_api+1): + api = i + lowest_api + + if scan_found.api_added < lowest_api: + print('FATAL: In struct \'{}\' is \'{}\', but lower as lowest API {}!'.format(struct_name, code, lowest_api)) + print(' File {}'.format(src_part)) + raise NameError('Dev kit scan failure') + + if scan_found.api_added <= api: + if len(api_code_defs) != 0: + if api_code_defs[-1][0] == '>=' and api >= int(api_code_defs[-1][1]): + if in_else != None: + if in_else[0] == '>=' and api >= int(in_else[1]): + continue + api_entries[i].append(scan_found) + elif api_code_defs[-1][0] == '<' and api < int(api_code_defs[-1][1]): + if in_else != None: + if in_else[0] == '<' and api < int(in_else[1]): + continue + api_entries[i].append(scan_found) + elif api_code_defs[-1][0] == '==' and api == int(api_code_defs[-1][1]): + if in_else != None: + if in_else[0] == '==' and api == int(in_else[1]): + continue + api_entries[i].append(scan_found) + elif in_else != None: + if in_else[0] == '>=' and api < int(in_else[1]): + api_entries[i].append(scan_found) + elif in_else[0] == '<' and api >= int(in_else[1]): + api_entries[i].append(scan_found) + elif in_else[0] == '==' and api != int(in_else[1]): + api_entries[i].append(scan_found) + else: + api_entries[i].append(scan_found) + + code = '' + + #api = lowest_api + #for i in range(highest_api-lowest_api+1): + #print('------: {}'.format(lowest_api+i)) + #control_entries = [] + #for entry in api_entries[i]: + #api_entry = APIEntryFunction() + #api_entry.scan_code = entry + + #control_entries.append(api_entry) + + #print(entry.funcname) + #print(' - ' + str(entry.api_added)) + #print() + #self.api_control_entries.append(APIEntryClass(control_entries)) + #api += 1 + #exit() + + + + + + + + + + + api = lowest_api + api_last_min = lowest_api + api_last_max = lowest_api + api_struct_before = [] + api_structs = [] + number = 0 + for api_entry in api_entries: + api_struct_current = [] + for entry in api_entry: + api_struct_current.append('{} {};'.format(entry.ifc_name_typdef, entry.ifc_name_func)) + + if api_struct_before != api_struct_current: + if len(api_structs) > 0: + api_last_min = api_structs[-1].api_min + api_last_max = api_structs[-1].api_max + api_structs[-1].api_max = api - 1 + + api_structs.append(APIEntry(api, highest_api, api_struct_current)) + api_struct_before = api_struct_current + api += 1 + + for api_entry in api_structs: + number = 0 + for struct_entry in api_entry.api_struct: + equal_from = -1 + equal_to = -1 + for api_entry_2 in api_structs: + if number < len(api_entry_2.api_struct) and api_entry_2.api_struct[number] == struct_entry: + if equal_from < 0: + equal_from = api_entry_2.api_min + if equal_to < 0 or api_entry_2.api_max > equal_to: + equal_to = api_entry_2.api_max + api_entry.api_struct_with_note[number] += ' /*---AUTO---*/\n'.format(equal_from, equal_to) + api_entry.api_equal.append([equal_from, equal_to]) + + value_name = struct_entry.split()[1].replace(';', '') + if equal_from == lowest_api and equal_to == highest_api and not value_name in self.functions_equal_everywhere: + self.functions_equal_everywhere.append(value_name) + + number += 1 + + api = lowest_api + api_unions = [] + while api <= highest_api: + min_api = -1 + max_api = -1 + last_struct = 0 + while len(api_structs) > last_struct: + if api >= api_structs[last_struct].api_min and api_structs[last_struct].api_max <= api+1: + min_api = api_structs[last_struct].api_min + max_api = api_structs[last_struct].api_max + last_struct += 1 + if min_api == -1: + min_api = lowest_api + if max_api == -1: + max_api = highest_api + + api_unions.append('struct {}_V{}_TO_V{} v{};\n'.format(struct_name, min_api, max_api, api)) + + api += 1 + + code = '' + for api_entry in api_structs: + code += '\n/* API struct from {} to {} */\n'.format(api_entry.api_min, api_entry.api_max) + code += 'typedef struct {}_V{}_TO_V{}\n'.format(struct_name, api_entry.api_min, api_entry.api_max) + code += '{\n ' + code += " ".join(api_entry.api_struct_with_note) + code += '} ' + '{}_V{}_TO_V{}'.format(struct_name, api_entry.api_min, api_entry.api_max) + ';\n' + + if code: + code += '\nunion ' + struct_name + '_UNION\n' + code += '{\n ' + code += " ".join(api_unions) + code += '};\n' + + self.independent_to_addon_api_structs = code + + + + #print(code) + + #if struct_name == 'KODI_ADDON_VISUALIZATION_FUNC': + #exit() + + def AddAdditionalAddonLibIncludes(self, include): + if not include in self.additional_addon_lib_includes: + self.additional_addon_lib_includes.append(include) + + def GetParentSharedTuples(self): + if self.override_use_direct_api_only: + return '/* NOTE: Ignored as direct api only is set! */\n' + + ret = '' + for data in self.interface_data_to_kodi: + ret += '// Original API call: ' + data.function_complete + '\n' + ret += data.parent_addon_c_lib_function_shared_tuple_in + '\n' + ret += data.parent_addon_c_lib_function_shared_tuple_out + '\n' + return ret + + def GetChildSharedTuples(self): + if self.override_use_direct_api_only: + return '/* NOTE: Ignored as direct api only is set! */\n' + + ret = '' + for data in self.interface_data_to_addon: + ret += '// Original API call: ' + data.function_complete + '\n' + ret += data.child_addon_c_lib_function_shared_tuple_in + '\n' + ret += data.child_addon_c_lib_function_shared_tuple_out + '\n' + return ret + + def GetSharedEnums(self): + if self.override_use_direct_api_only: + return '' + + enums_code = '\n' if len(self.used_enums) > 0 else '' + for enum in self.used_enums: + enums_code += '#ifndef MSGPACK_ADD_ENUM_' + enum + '\n' + enums_code += '#define MSGPACK_ADD_ENUM_' + enum + '\n' + enums_code += 'MSGPACK_ADD_ENUM(' + enum + ');\n' + enums_code += '#endif\n' + + return enums_code + + def GetSharedStructures(self): + if self.override_use_direct_api_only: + return '' + + ret = '' + if len(self.shared_structures): + ret += '/* Confirm after autogen the correctness here! */\n' + ret += '/*---AUTO_GEN_PARSE---*/\n' + for data in self.shared_structures: + ret += '\n' + data[1] + ret += '/*---AUTO_GEN_PARSE---*/\n' + ret += '\n' + return ret + + def GetAddonCLibFunctionsShared(self): + ret = '' + for data in self.interface_data_to_kodi: + ret += '\n' + data.parent_addon_c_lib_function_shared + return ret + + def GetAddonCLibFunctionsDirect(self): + ret = '' + for data in self.interface_data_to_kodi: + ret += '\n' + data.parent_addon_c_lib_function_direct + return ret + + def GetAddonCLibFunctionsDirectPtr(self): + ret = '' + for data in self.interface_data_to_kodi: + ret += data.parent_addon_c_lib_function_direct_ptr + return ret + + def GetKodiSwitchCase(self): + if not self.override_use_direct_api_only: + ret = '' + for data in self.interface_data_to_kodi: + ret += data.parent_kodi_cpp_function_switch_case + return ret + else: + return ' /* NOTE: Ignored as direct api only is set! */\n' + + def GetKodiSourcePart(self): + ret = '' + for data in self.interface_data_to_kodi: + if data.parent_kodi_cpp_function_source: + ret += '\n' + data.parent_kodi_cpp_function_source + if not ret: + ret = '/* NOTE: unused (no callbacks here) */\n' + return ret + + def GetDevKitKodiToAddonSourcePart(self): + ret = '' + for data in self.interface_data_to_addon: + if data.dev_kit_kodi_to_addon_source: + ret += '\n' + data.dev_kit_kodi_to_addon_source + if not ret: + ret = '/* NOTE: unused (no functions from Kodi to addon here) */\n' + return ret + + def GetKodiSourcePartChild(self): + ret = '' + for data in self.interface_data_to_addon: + if data.child_kodi_cpp_function_source: + ret += '\n' + data.child_kodi_cpp_function_source + if not ret: + ret = '/* NOTE: unused (no functions here) */\n' + return ret + + def GetKodiParentHeaderPart(self): + ret = '' + for data in self.interface_data_to_kodi: + if data.parent_kodi_cpp_function_header: + ret += data.parent_kodi_cpp_function_header + '\n' + return ret + + def GetKodiChildHeaderPart(self): + ret = '' + for data in self.interface_data_to_addon: + if data.child_kodi_cpp_function_header: + ret += data.child_kodi_cpp_function_header + '\n' + return ret + + def GetDevKitKodiToAddonHeaderPart(self): + ret = '' + for data in self.interface_data_to_addon: + if data.dev_kit_kodi_to_addon_header: + ret += data.dev_kit_kodi_to_addon_header + '\n' + return ret + + def GetKodiParentEnumList(self): + ret = 'typedef enum funcParent_' + self.header_group_id + ' : int\n' + ret += '{\n' + if len(self.interface_data_to_kodi) != 0 and not self.override_use_direct_api_only: + for data in self.interface_data_to_kodi: + ret += ' funcParent_' + data.funcname_ifc + ',\n' + else: + ret += ' funcParent_' + self.header_group_id + '_dummy\n' + ret += '} funcParent_' + self.header_group_id + ';\n' + return ret + + def GetKodiChildEnumList(self): + ret = 'typedef enum funcChild_' + self.header_group_id + ' : int\n' + ret += '{\n' + if len(self.interface_data_to_addon) != 0 and not self.override_use_direct_api_only: + for data in self.interface_data_to_addon: + ret += ' funcChild_' + data.funcname_ifc + ',\n' + else: + ret += ' funcChild_' + self.header_group_id + '_dummy\n' + ret += '} funcChild_' + self.header_group_id + ';\n' + return ret + + def KnownSharedStructure(self, struct_name): + m = re.search('^.*?struct\ *([a-zA-Z[0-9_]*)', struct_name) + if not m or not m.group(1): + return False + + struct_name = m.group(1) + + # Defined in OS and set hard on SharedGroups.h + if struct_name == 'tm': + return True + + for entry, code, path in self.shared_structures + self.shared_structures_other_file: + if entry == struct_name: + return True + return True + + def KnownSharedStructureWithClean(self, struct_name): + m = re.search('^.*?struct\ *([a-zA-Z[0-9_]*)', struct_name) + if not m or not m.group(1): + return False + + struct_name = m.group(1) + + # Defined in OS and set hard on SharedGroups.h + if struct_name == 'tm': + return False + + for entry, code, path in self.shared_structures + self.shared_structures_other_file: + if entry == struct_name and 'CleanCStructure' in code: + return True + return False + + def GenerateSharedStructure(self, struct_name): + if self.override_use_direct_api_only: + return True + + m = re.search('^.*?struct\ *([a-zA-Z[0-9_]*)', struct_name) + if not m or not m.group(1): + print('FATAL: Bad struct defined in ' + self.funcname) + raise + + struct_name = m.group(1) + + # Defined in OS and set hard on SharedGroups.h + if struct_name == 'tm': + return True + + if struct_name in ignored_structs: + return False + + for entry, code, path in self.shared_structures: + if entry == struct_name: + return True + + code_values = '' + set_code = '' + get_code = '' + clean_code = '' + msgpack = ' MSGPACK_DEFINE(' + + current = 0 + c_struct = GetCStruct(struct_name) + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = 'src/shared/api/' + target_file = c_struct.path.replace(search_dir, target_dir) + + # Check the structure is in same c-api file, if not add it to "additional_shared_includes" + # to scan on end and create shared include file separate for here + if self.path != c_struct.path: + path = '#include "{}"'.format(target_file) + + # Check include already used, if not add it to shared base header + if not path in self.additional_shared_includes: + self.additional_shared_includes.append('#include "{}"'.format(target_file)) + + # Check now the structure already defined, if yes prevent add again + for entry, code, path in self.shared_structures_other_file: + if entry == struct_name: + return True + + # Add here the additional structure to use in separate files + self.shared_structures_other_file.append((struct_name, c_struct.code, target_file)) + return True + + previous_entry = '' + for entry in c_struct.code: + if len(entry.split()) > 1: + m = re.search('^.*?enum\ *([a-zA-Z[0-9_]*)', entry) + if m and m.group(1) and m.group(1) in known_ENUMS and m.group(1) not in self.used_enums: + self.used_enums.append(m.group(1)) + + m = re.search('^\ *([a-zA-Z[0-9_].*)\ ([a-zA-Z[0-9_]+).*\[ *([a-zA-Z[0-9_]+) *\].*\[ *([a-zA-Z[0-9_]+) *\];$', entry) + if m and m.group(1) and m.group(2) and m.group(3) and m.group(4): + name = m.group(2) + is_string = 'char*' in m.group(1) + is_struct = 'struct ' in m.group(1) + if is_string: + value_type = 'std::string{}'.format(' /* CheckAPIUse_GenShare (0001) */' if self.options.debug else '') + elif is_struct: + print('TODO 2') + raise + else: + value_type = m.group(1) + code_values += ' std::array, {}> {};\n'.format(value_type, m.group(4), m.group(3), m.group(2)) + set_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + set_code += ' {\n' + set_code += ' for (unsigned int j = 0; j < ' + m.group(4) + '; ++j)\n' + set_code += ' {\n' + set_code += ' ' + m.group(2) + '[i][j] = ' + ('c_data->' + m.group(2) + '[i][j] ? ' if is_string else '') + 'c_data->' + m.group(2) + '[i][j]' + (' : "";\n' if is_string else ';\n') + set_code += ' }\n' + set_code += ' }\n' + get_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + get_code += ' {\n' + get_code += ' for (unsigned int j = 0; j < ' + m.group(4) + '; ++j)\n' + get_code += ' {\n' + if is_string: + get_code += ' if (c_data->' + m.group(2) + '[i][j])\n' + get_code += ' free(c_data->' + m.group(2) + '[i][j]);\n' + get_code += ' c_data->' + m.group(2) + '[i][j] = strdup(' + m.group(2) + '[i][j].c_str());\n' + else: + get_code += ' c_data->' + m.group(2) + '[i][j] = ' + m.group(2) + '[i][j];\n' + get_code += ' }\n' + get_code += ' }\n' + else: + m = re.search('^\ *([a-zA-Z[0-9_].*)\ ([a-zA-Z[0-9_]+).*\[ *([a-zA-Z[0-9_]+) *\];$', entry) + if m and m.group(1) and m.group(2) and m.group(3): + name = m.group(2) + is_string = 'char*' in m.group(1) + is_struct = 'struct ' in m.group(1) + if is_string: + value_type = 'std::string{}'.format(' /* CheckAPIUse_GenShare (0002) */' if self.options.debug else '') + elif is_struct: + value_type = ('IFC_{}{}' + .format(m.group(1).replace('struct ', ''), + ' /* CheckAPIUse_GenShare (0003) */' if self.options.debug else '')) + else: + value_type = ('{}{}' + .format(m.group(1), + ' /* CheckAPIUse_GenShare (0004) */' if self.options.debug else '')) + code_values += ' std::array<{}, {}> {};\n'.format(value_type, m.group(3), m.group(2)) + set_code += (' memcpy({}.data(), c_data->{}, {});\n' + .format(m.group(2), + m.group(2), + m.group(3))) + if is_string: + get_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + get_code += ' {\n' + get_code += ' if (c_data->' + m.group(2) + '[i])\n' + get_code += ' free(c_data->' + m.group(2) + '[i];\n' + get_code += ' c_data->' + m.group(2) + '[i] = strdup(' + m.group(2) + '[i].c_str());\n' + get_code += ' }\n' + else: + get_code += (' memcpy(c_data->{}, {}.data(), {});\n' + .format(m.group(2), + m.group(2), + m.group(3))) + else: + #print(entry) + name = entry.rstrip(';').split()[-1].strip() + value = entry.replace(name, '').replace(';', '').strip() + if value == 'const char*': + code_values += ' std::string {};\n'.format(name) + set_code += ' if (c_data->{})\n'.format(name) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' c_data->{} = {}.c_str();\n'.format(name, name) + elif value == 'char*': + code_values += ' std::string {};\n'.format(name) + set_code += ' if (c_data->{})\n'.format(name) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' if (!{}.empty())\n'.format(name) + get_code += ' c_data->{} = strdup({}.c_str());\n'.format(name, name) + clean_code += ' if (c_data->{})\n'.format(name) + clean_code += ' {\n' + clean_code += ' free(c_data->{});\n'.format(name) + clean_code += ' c_data->{} = nullptr;\n'.format(name) + clean_code += ' }\n' + elif ContainsHdlVoidPointer(value): + code_values += ' PtrValue {};\n'.format(name) + set_code += ' {} = PtrValue(c_data->{});\n'.format(name, name) + get_code += ' c_data->{} = reinterpret_cast<{}>({});\n'.format(name, value, name) + elif 'struct ' in value: + if value != self.last_struct_scan_1 and value != self.last_struct_scan_2: + self.last_struct_scan_2 = self.last_struct_scan_1 + self.last_struct_scan_1 = value + if self.last_struct_scan_2 != self.last_struct_scan_1: + self.GenerateSharedStructure(value) + + if value.count('*') == 1 and 'size_t ' in previous_entry: + new_struct_name = value.replace('struct ', '').replace('*', ''.strip()) + code_values += ' std::vector {};\n'.format(new_struct_name, name) + + previous_value_name = previous_entry.split()[-1].strip().replace(';', '') + + set_code += ' if (c_data->{} && c_data->{} != 0)\n'.format(name, previous_value_name) + set_code += ' {\n' + set_code += ' for (size_t i = 0; i < c_data->{}; ++i)\n'.format(previous_value_name) + set_code += ' {}.emplace_back(&c_data->{}[i]);\n'.format(name, name) + set_code += ' }\n' + + get_code += ' if (!{}.empty())\n'.format(name) + get_code += ' {\n' + get_code += ' c_data->{} = static_cast<{}*>(malloc(sizeof({}) * {}.size()));\n'.format(name, new_struct_name, new_struct_name, name) + get_code += ' for (size_t i = 0; i < {}.size(); ++i)\n'.format(name) + get_code += ' {}[i].SetCStructure(&c_data->{}[i]);\n'.format(name, name) + get_code += ' }\n' + + clean_code += ' if (c_data->{})\n'.format(name) + clean_code += ' {\n' + clean_code += ' IFC_{} helper;\n'.format(new_struct_name) + clean_code += ' for (size_t i = 0; i < c_data->{}; ++i)\n'.format(previous_value_name) + clean_code += ' helper.CleanCStructure(&c_data->{}[i]);\n'.format(name) + clean_code += ' free(c_data->{});\n'.format(name) + clean_code += ' c_data->{} = nullptr;\n'.format(name) + clean_code += ' }\n' + elif value.count('*') == 0: + new_struct_name = value.replace('struct ', '') + code_values += ' IFC_{}\n'.format(entry.replace('struct ', '')) + set_code += ' {} = IFC_{}(&c_data->{});\n'.format(name, new_struct_name, name) + get_code += ' {}.SetCStructure(&c_data->{});\n'.format(name, name) + clean_code += ' IFC_{}::CleanCStructure(&c_data->{});\n'.format(new_struct_name, name) + else: + code_values += ' {}\n'.format(entry) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' c_data->{} = {}; /* TODO!!! */\n'.format(name, name) + else: + code_values += ' {}\n'.format(entry) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' c_data->{} = {};\n'.format(name, name) + + if not current: + msgpack += name + (',\n' if len(c_struct.code) > 1 else '') + else: + msgpack += ' ' + name + (',\n' if current < len(c_struct.code)-1 else '') + current += 1 + + previous_entry = entry + + if not code_values: + return True + + clean_function = '' + if clean_code != '': + clean_function += """\ + + static inline void CleanCStructure(""" + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + clean_code + """\ + } +""" + + code = """\ +struct IFC_""" + struct_name + """ +{ + IFC_""" + struct_name + """() = default; + IFC_""" + struct_name + """(const """ + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + set_code + """\ + } +""" + clean_function + """ + void SetCStructure(""" + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + get_code + """\ + } + +""" + code_values + """ +""" + msgpack + """); +}; +""" + self.shared_structures.append((struct_name, code, target_file)) + return True + + def Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(self, force): + path = self.path.replace('{}xbmc/addons/kodi-dev-kit/'.format(kodi_dir), '') + include_path = '' + for i in range(path.count('/')): + include_path += '../' + include_path += path + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/api/' + target_file = self.path.replace(search_dir, target_dir) + + file_text = header_file_copyright + """\ + +#pragma once + +#include "src/shared/SharedGroups.h" +#include \"""" + include_path + """\" +""" + '\n'.join(self.additional_shared_includes) + """\ + +#include +#include +#include +#include +""" + self.independent_to_addon_api_structs + """\ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ +\ +""" + self.GetSharedEnums() + """\ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ +/*---AUTO_GEN_PARSE---*/ + +""" + self.GenerateToKodiDirectFuncTable() + """ +""" + self.GenerateToAddonDirectFuncTable() + """ +""" + self.GetSharedStructures() + """\ +""" + self.GetKodiParentEnumList() + """\ + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +""" + self.GetParentSharedTuples() + """\ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +""" + self.GetKodiChildEnumList() + """\ + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +""" + self.GetChildSharedTuples() + """\ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ +""" + + # Make now the creation and copy of file + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return file_text + + def ScanStructureInsideAdditional(self, force, structure, include_path_of_searcher): + c_struct = GetCStruct(structure) + + include = c_struct.path.replace('{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir), 'src/shared/api/') + include_path = '' + for i in range(include.count('/')): + include_path += '../' + include_path += include + + self.shared_structures_other_file.append((structure, c_struct.code, include)) + + return include_path, (structure, c_struct.code, include) + + def Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES_additional(self, force): + additional_shared_includes = [] + for entry in self.additional_shared_includes: + target_file = '{}xbmc/addons/kodi-dev-kit/{}'.format(kodi_dir, entry.replace('#include ', '').replace('"', '')) + temp_file = target_file.replace('{}xbmc/addons/kodi-dev-kit'.format(kodi_dir), './tmp') + + include = target_file.replace('{}xbmc/addons/kodi-dev-kit/src/shared/api/'.format(kodi_dir), 'include/kodi/c-api/') + include_path_complete = target_file.replace('src/shared/api/', 'include/kodi/c-api/') + + include_path = '' + for i in range(include.count('/')): + include_path += '../' + include_path += include + + # Check already exist + if os.path.isfile(temp_file): + continue + + struct_code = '' + for struct_name, code, path in self.shared_structures_other_file: + if not path in target_file or FileContainsInterfaceAPICalls(include_path_complete): + continue + + current = 0 + used_enums = [] + enums_code = '' + set_code = '' + get_code = '' + clean_code = '' + clean_function = '' + code_values = '' + msgpack = ' MSGPACK_DEFINE(' + + previous_entry = '' + for entry in code: + if len(entry.split()) > 1: + m = re.search('^.*?enum\ *([a-zA-Z[0-9_]*)', entry) + if m and m.group(1) and m.group(1) in known_ENUMS and m.group(1) not in used_enums: + used_enums.append(m.group(1)) + + m = re.search('^\ *([a-zA-Z[0-9_].*)\ ([a-zA-Z[0-9_]+).*\[ *([a-zA-Z[0-9_]+) *\].*\[ *([a-zA-Z[0-9_]+) *\];$', entry) + if m and m.group(1) and m.group(2) and m.group(3) and m.group(4): + name = m.group(2) + is_string = 'char*' in m.group(1) + is_struct = 'struct ' in m.group(1) + if is_string: + value_type = 'std::string' + elif is_struct: + print('TODO 1') + raise + else: + value_type = m.group(1) + code_values += ' std::array, {}> {};\n'.format(value_type, m.group(4), m.group(3), m.group(2)) + set_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + set_code += ' {\n' + set_code += ' for (unsigned int j = 0; j < ' + m.group(4) + '; ++j)\n' + set_code += ' {\n' + set_code += ' ' + m.group(2) + '[i][j] = ' + ('c_data->' + m.group(2) + '[i][j] ? ' if is_string else '') + 'c_data->' + m.group(2) + '[i][j]' + (' : "";\n' if is_string else ';\n') + set_code += ' }\n' + set_code += ' }\n' + get_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + get_code += ' {\n' + get_code += ' for (unsigned int j = 0; j < ' + m.group(4) + '; ++j)\n' + get_code += ' {\n' + if is_string: + get_code += ' if (c_data->' + m.group(2) + '[i][j])\n' + get_code += ' free(c_data->' + m.group(2) + '[i][j]);\n' + get_code += ' c_data->' + m.group(2) + '[i][j] = strdup(' + m.group(2) + '[i][j].c_str());\n' + else: + get_code += ' c_data->' + m.group(2) + '[i][j] = ' + m.group(2) + '[i][j];\n' + get_code += ' }\n' + get_code += ' }\n' + else: + m = re.search('^\ *([a-zA-Z[0-9_].*)\ ([a-zA-Z[0-9_]+).*\[ *([a-zA-Z[0-9_]+) *\];$', entry) + if m and m.group(1) and m.group(2) and m.group(3): + name = m.group(2) + is_string = 'char*' in m.group(1) + is_struct = 'struct ' in m.group(1) + if is_string: + value_type = 'std::string' + elif is_struct: + struct = m.group(1).replace('struct ', '') + include = self.ScanStructureInsideAdditional(force, struct, include_path_complete)[0] + value_type = 'IFC_{}'.format(struct) + include = '#include "{}"\n'.format(include) + if not include in additional_shared_includes: + additional_shared_includes.append(include) + else: + value_type = m.group(1) + code_values += ' std::array<{}, {}> {};\n'.format(value_type, m.group(3), m.group(2)) + set_code += (' memcpy({}.data(), c_data->{}, {});\n' + .format(m.group(2), + m.group(2), + m.group(3))) + if is_string: + get_code += ' for (unsigned int i = 0; i < ' + m.group(3) + '; ++i)\n' + get_code += ' {\n' + get_code += ' if (c_data->' + m.group(2) + '[i])\n' + get_code += ' free(c_data->' + m.group(2) + '[i];\n' + get_code += ' c_data->' + m.group(2) + '[i] = strdup(' + m.group(2) + '[i].c_str());\n' + get_code += ' }\n' + else: + get_code += (' memcpy(c_data->{}, {}.data(), {});\n' + .format(m.group(2), + m.group(2), + m.group(3))) + else: + #print(entry) + name = entry.rstrip(';').split()[-1].strip() + value = entry.replace(name, '').replace(';', '').strip() + if value == 'const char*': + code_values += ' std::string {};\n'.format(name) + set_code += ' if (c_data->{})\n'.format(name) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' c_data->{} = {}.c_str();\n'.format(name, name) + elif value == 'char*': + code_values += ' std::string {};\n'.format(name) + set_code += ' if (c_data->{})\n'.format(name) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' if (!{}.empty())\n'.format(name) + get_code += ' c_data->{} = strdup({}.c_str());\n'.format(name, name) + clean_code += ' if (c_data->{})\n'.format(name) + clean_code += ' {\n' + clean_code += ' free(c_data->{});\n'.format(name) + clean_code += ' c_data->{} = nullptr;\n'.format(name) + clean_code += ' }\n' + elif ContainsHdlVoidPointer(value): + code_values += ' PtrValue {};\n'.format(name) + set_code += ' {} = PtrValue(c_data->{});\n'.format(name, name) + get_code += ' c_data->{} = reinterpret_cast<{}>({});\n'.format(name, value, name) + elif 'struct ' in value: + raise + else: + code_values += ' {}\n'.format(entry) + set_code += ' {} = c_data->{};\n'.format(name, name) + get_code += ' c_data->{} = {};\n'.format(name, name) + + if not current: + msgpack += name + (',\n' if len(code) > 1 else '') + else: + msgpack += ' ' + name + (',\n' if current < len(code)-1 else '') + current += 1 + + previous_entry = entry + + if not code_values: + continue + + clean_function = '' + if clean_code != '': + clean_function += """\ + + static inline void CleanCStructure(""" + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + clean_code + """\ + } +""" + + code = """\ +struct IFC_""" + struct_name + """ +{ + IFC_""" + struct_name + """() = default; + IFC_""" + struct_name + """(const """ + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + set_code + """\ + } +""" + clean_function + """ + void SetCStructure(""" + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + get_code + """\ + } + +""" + code_values + """ +""" + msgpack + """); +}; +""" + + struct_code += """\ +struct IFC_""" + struct_name + """ +{ + IFC_""" + struct_name + """() = default; + IFC_""" + struct_name + """(const """ + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + set_code + """\ + } +""" + clean_function + """ + void SetCStructure(""" + struct_name + """* c_data) + { + if (c_data == nullptr) + return; + +""" + get_code + """\ + } + +""" + code_values + """ +""" + msgpack + """); +}; + +""" + enums_code += '\n' if len(used_enums) > 0 else '' + for enum in used_enums: + enums_code += '#ifndef MSGPACK_ADD_ENUM_' + enum + '\n' + enums_code += '#define MSGPACK_ADD_ENUM_' + enum + '\n' + enums_code += 'MSGPACK_ADD_ENUM(' + enum + ');\n' + enums_code += '#endif\n' + + file_text = header_file_copyright + """\ + +#pragma once + +#include "src/shared/SharedGroups.h" +#include \"""" + include_path + """\" +""" + '\n'.join(additional_shared_includes) + """\ + +#include +#include +#include +#include + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ +""" + enums_code + """\ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +""" + struct_code + """\ +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ +""" + + # Make now the creation and copy of file + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not os.path.isfile(target_file) or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + def Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_CPP(self, force): + path = self.path.replace('{}xbmc/addons/kodi-dev-kit/'.format(kodi_dir), '') + include_path = '' + for i in range(path.count('/')): + include_path += '../' + include_path += path + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/addon/api/' + target_file = self.path.replace(search_dir, target_dir).replace('.h', '.cpp') + + additional_includes = '' + for include in self.additional_addon_lib_includes: + additional_includes += '{}\n'.format(include) + + file_text = header_file_copyright + """ +#include \"""" + os.path.basename(self.path) + """\" +""" + additional_includes + """\ + +// Shared API +#include "src/shared/Instances.h" + +// Lib code +#include "core/addon_control.h" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ + +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI_ADDON::INTERNAL; + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ +/*---AUTO_GEN_PARSE---*/ + +""" + self.GenerateToAddonInitDirectFunction() + + if len(self.GetDevKitKodiToAddonHeaderPart()) > 0: + file_text += '\n' + file_text += '#ifndef KODI_INHIBIT_SHARED\n' + file_text += 'bool CHdl_kodi_{}::HandleMessage(int funcGroup,\n'.format(self.header_group_id) + spaces = MakeSpaces('bool CHdl_kodi_' + self.header_group_id + '::HandleMessage') + file_text += spaces + 'int func,\n' + file_text += spaces + 'const msgpack::unpacked& in,\n' + file_text += spaces + 'msgpack::sbuffer& out)\n' + file_text += '{\n' + file_text += ' if (funcGroup != funcGroup_{})\n'.format(self.header_group_id) + file_text += ' return false;\n' + file_text += '\n' + file_text += ' switch (func)\n' + file_text += ' {\n' + if not self.override_use_direct_api_only: + for data in self.interface_data_to_addon: + file_text += data.child_addon_c_lib_function_switch_case + else: + file_text += ' /* NOTE: Ignored as direct api only is set! */\n' + file_text += ' default:\n' + file_text += ' break;\n' + file_text += ' }\n' + file_text += ' return false;\n' + file_text += '}\n' + file_text += '#endif /* !KODI_INHIBIT_SHARED */\n' + + file_text += """ +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_3') + """\ +/*---AUTO_GEN_PARSE---*/ + +""" + self.GetDevKitKodiToAddonSourcePart() + """\ + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ +""" + + for data in self.interface_data_to_kodi: + file_text += '\n' + file_text += data.parent_addon_c_lib_function_shared + + file_text += """ +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_4') + """\ +/*---AUTO_GEN_PARSE---*/ +""" + + # Make now the creation and copy of file + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return file_text + + def Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_H(self, force): + path = self.path.replace('{}xbmc/addons/kodi-dev-kit/'.format(kodi_dir), '') + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/addon/api/' + target_file = self.path.replace(search_dir, target_dir) + + if len(self.GetDevKitKodiToAddonHeaderPart()) > 0: + handle_message = """\ +#ifndef KODI_INHIBIT_SHARED + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; +#endif /* !KODI_INHIBIT_SHARED */ + +""" + callbacks = '\n' + callbacks += ' // Calls from Kodi to addon\n' + callbacks += self.GetDevKitKodiToAddonHeaderPart() + else: + handle_message = '' + callbacks = '' + + file_text = header_file_copyright + """ +#pragma once + +#include "core/IMsgHdl.h" +#include "src/shared/api/""" + target_file.replace(target_dir, '').replace('.cpp', '.h') + """" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_""" + self.header_group_id + """; +struct directFuncToKodi_""" + self.header_group_id + """; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_""" + self.header_group_id + """ : public IMsgHdl +{ +public: + CHdl_kodi_""" + self.header_group_id + """(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_""" + self.header_group_id + """* ifcToAddon); + +""" + handle_message + """\ + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ + /*---AUTO_GEN_PARSE---*/ +""" + callbacks + """\ +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ +""" + + # Make now the creation and copy of file + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return file_text + + #------------------------------------------------------------------------------------------------- + + def Generate__xbmc_addons_interface_api_ALL_FILES_CPP(self, force): + path = self.path.replace('{}xbmc/addons/kodi-dev-kit/'.format(kodi_dir), '') + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = '{}xbmc/addons/interface/api/'.format(kodi_dir) + target_file = self.path.replace(search_dir, target_dir).replace('.h', '.cpp') + + function_name = 'bool CHdl_kodi_{}::HandleMessage'.format(self.header_group_id) + + file_text = header_file_copyright + """ +#include \"""" + os.path.basename(self.path) + """\" + +// Shared API +#include \"addons/kodi-dev-kit/""" + path.replace('include/kodi/c-api/', 'src/shared/api/') + """\" + +// Kodi +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" +""" + for include in self.kodi_ifc_includes: + file_text += '#include "{}"\n'.format(include) + + file_text += """\ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ +/*---AUTO_GEN_PARSE---*/ + +""" + self.GenerateToKodiInitDirectFunction() + """\ + +""" + function_name + """(int funcGroup, +""" + spaces = MakeSpaces(function_name) + file_text += '{}int func,\n'.format(spaces) + file_text += '{}const msgpack::unpacked& in,\n'.format(spaces) + file_text += '{}msgpack::sbuffer& out)\n'.format(spaces) + file_text += """\ +{ + if (funcGroup != funcGroup_""" + self.header_group_id + """) + return false; + + switch (func) + { +""" + self.GetKodiSwitchCase() + """\ + default: + CLog::Log(LOGERROR, + "CHdl_kodi_""" + self.header_group_id + """::{}: addon called with unknown function id '{}' on group '""" + self.header_group_id + """'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon +""" + self.GetKodiSourcePartChild() + """ +// Callbacks from addon to Kodi +""" + self.GetKodiSourcePart() + """ +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_3') + """\ +/*---AUTO_GEN_PARSE---*/ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ +""" + + # Make now the creation and copy of file + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return file_text + + #------------------------------------------------------------------------------------------------- + + def Generate__xbmc_addons_interface_api_ALL_FILES_H(self, force): + path = self.path.replace('{}xbmc/addons/kodi-dev-kit/'.format(kodi_dir), '') + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = '{}xbmc/addons/interface/api/'.format(kodi_dir) + target_file = self.path.replace(search_dir, target_dir) + + file_text = header_file_copyright + """ +#pragma once + +#include "addons/interface/IMsgHdl.h" + +// API include +#include \"addons/kodi-dev-kit/""" + path + """\" + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_1') + """\ +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct directFuncToAddon_""" + self.header_group_id + """; +struct directFuncToKodi_""" + self.header_group_id + """; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_2') + """\ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_""" + self.header_group_id + """ : public IMsgHdl +{ +public: + CHdl_kodi_""" + self.header_group_id + """(CInterface& interface) : IMsgHdl(interface) { } + + void InitDirect(directFuncToKodi_""" + self.header_group_id + """* ifcToKodi, + directFuncToAddon_""" + self.header_group_id + """* ifcToAddon); + + // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used) + bool HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) override; + + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_3') + """\ + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon +""" + self.GetKodiChildHeaderPart() + """\ + +private: + /* Code below becomes on auto generation reused, hand edited parts should included here */ + /*---AUTO_GEN_PARSE---*/ +""" + CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_4') + """\ + /*---AUTO_GEN_PARSE---*/ + + // Callbacks from addon to Kodi +""" + self.GetKodiParentHeaderPart() + """\ + + directFuncToAddon_""" + self.header_group_id + """* m_ifcToAddon{nullptr}; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ +""" + + # Make now the creation and copy of file + temp_file = target_file.replace('../../../../../xbmc/addons', './tmp') + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + + f = open(temp_file, "w") + f.write(file_text) + f.close() + os.system('clang-format -style=file -i ' + temp_file) + + if force or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return file_text + + +#=============================================================================== + +class InterfaceDataParent: + def __init__(self, callbacks, options): + self.callbacks = callbacks + self.options = options + + self.use_internal_only = False + self.header_group_id = '' + self.function_complete = '' + self.retval = '' + self.funcname = '' + self.funcname_ifc = '' + self.values = [] + self.api_added = -1 + self.api_deprecated = -1 + + self.parent_addon_c_lib_function_shared = '' + self.parent_addon_c_lib_function_shared_tuple_in = '' + self.parent_addon_c_lib_function_shared_tuple_in_list = [] + self.parent_addon_c_lib_function_shared_tuple_out = '' + self.parent_addon_c_lib_function_shared_tuple_out_list = [] + self.parent_addon_c_lib_function_direct = '' + self.parent_addon_c_lib_function_direct_ptr = '' + self.parent_kodi_cpp_function_switch_case = '' + self.parent_kodi_cpp_function_source = '' + self.parent_kodi_cpp_function_header = '' + + self.group_data = None # The Parent class GroupData + self.search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + + def RegexScanFunction(self, function): + regex_code = '^(?:[ \t]*)?ATTR_DLL_EXPORT[ \t]*(.*)[ \t](kodi.+?)(?=\()\((.*?)(?=\);|\). *__).+?(?:__(DEPRECATED|INTRODUCED)_IN_KODI\(([0-9]+)\))?.(?:__(DEPRECATED|INTRODUCED)_IN_KODI\(([0-9]+)\))(?:[ \t]*);$' + m = re.search(regex_code, function) + if not m or not m.group(1) or not m.group(2) or not m.group(3) and not m.group(4) and not m.group(6): + if not function.startswith('#define'): + print('ERROR: Function \'' + function + '\' not match wanted API!') + return False + #raise + + self.retval = m.group(1) + self.funcname = m.group(2) + self.values = [] + for value in m.group(3).split(', '): + if value.strip() != '': + self.values.append(value.strip()) + + self.api_added = -1 + self.api_deprecated = -1 + if m.group(4) and m.group(4) == 'INTRODUCED': + self.api_added = int(m.group(5)) + elif m.group(4) and m.group(4) == 'DEPRECATED': + self.api_deprecated = int(m.group(5)) + if m.group(6) and m.group(6) == 'INTRODUCED': + self.api_added = int(m.group(7)) + elif m.group(6) and m.group(6) == 'DEPRECATED': + self.api_deprecated = int(m.group(7)) + + self.funcname_ifc = '{}_v{}'.format(self.funcname, self.api_added) + return True + + def ContainsOutOnIn(self): + for value in self.values: + if not 'const' in value and ('*' in value or '[' in value): + return True + return False + + def GenerateSharedTuples(self, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt, value, value_list): + self.parent = parent + self.cnt = cnt + self.value = value + self.done = False + + check_error = CheckCorrectFunctionValue(value) + if check_error: + print('FATAL: Function "{}" not contains valid values (ERROR: {})'.format(parent.function_complete, check_error)) + raise + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.function_value = '' + + if '...' in self.value: + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.done = True + return + + m = re.search('^[\t ]*(?:const[\t ]*)?([a-zA-Z0-9_]*)[\t ]*\*[\t ]*(?:const[\t ]*)?\*', self.value) + if m and m.group(1) and m.group(1) in known_STANDARD_C_TYPES and 'size_t' in value_list[cnt+1] and 'size_t' in value_list[cnt+2]: + if 'const ' in self.value or 'const*' in self.value: + self.msgpack_in_value = 'std::vector>'.format(m.group(1)) + self.msgpack_out_value = '' + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples'.format(parent.function_complete)) + raise + return + + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))(?:[\t ]*)?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(5)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(5)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(5)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # Fixed array way 2 e.g. "enum AudioEngineChannel (*info)[AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))(?:[\t ]*)?(.*)\ ?(.*)\ \(\*([a-z0-9A-Z_]*?)\)\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(4)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(4)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(4)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # Fixed array way 3 e.g. "enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))\ ?(.*)\ ([a-z0-9A-Z_]*?)\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(4)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(4)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(4)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_6 (tuple) (parent) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1: + i = 0 + while i+cnt < len(value_list)-1: + if 'size_t' in value_list[i+cnt+1]: + self.msgpack_in_value = ('std::vector{}' + .format(' /* CheckAPIUse_WAY_6b (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + break + if '[]' in value_list[i+cnt+1] and value_list[i+cnt+1].count('[]') == 1: + i += 1 + continue + + print('FATAL (6b, 0006): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + else: + self.msgpack_in_value = ('std::string{}' + .format(' /* CheckAPIUse_WAY_6a (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_7 (tuple) (parent) + if self.value_type == 'char**': + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::string' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (tuple) (parent) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt < len(value_list)-1 \ + and 'size_t*' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector{}' + .format(' /* CheckAPIUse_WAY_8_1 (0006) */' if parent.options.debug else '')) + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type == 'char*' \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::string' + self.done = True + return + + # CheckAPIUse_WAY_9 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector<{}>{}' + .format(self.value_type.replace('*', ''), + ' /* CheckAPIUse_WAY_9 (0006) */' if parent.options.debug else '')) + self.done = True + return + + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_TYPES \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1 \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = ('std::vector<{}>{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_10 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = ('std::vector<{}>{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_10 (0006) */' if parent.options.debug else '')) + self.done = True + return + + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_TYPES: + self.msgpack_in_value = ('{}{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_11 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + if ContainsHdlVoidPointer(self.value_type): + self.msgpack_in_value = 'PtrValue' + self.msgpack_out_value = '' + self.done = True + return + + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = ('std::vector<{}>{}' + .format(self.value_type.replace('*', '').replace('const ', ''), + ' /* CheckAPIUse_WAY_11 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + if self.value_type in known_STANDARD_C_PTR_TYPES: + self.msgpack_in_value = self.value_type.replace('*', '') + self.msgpack_out_value = self.value_type.replace('*', '') + self.done = True + return + + if CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + + if not '*' in self.value_type: + self.msgpack_in_value = self.value_type + elif '*' in self.value_type and self.value_type.count('*') == 1 and not 'const' in self.value_type: + value = self.value_type.replace('*', '') + self.msgpack_in_value = value + self.msgpack_out_value = value + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples'.format(parent.function_complete)) + raise + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_15 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.GenerateSharedStructure(self.value_type): + value_type = self.value_type.replace('struct ', '').replace('*', '').strip() + if value_type == 'tm': + self.msgpack_in_value = 'IFC_{}'.format(value_type) + else: + self.msgpack_in_value = '' + self.msgpack_out_value = 'IFC_{}'.format(value_type) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_16 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('const struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = 'IFC_{}'.format(self.value_type.replace('const struct ', '').replace('*', '').strip()) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and 'size_t*' in value_list[cnt+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::vector'.format(self.value_type.replace('struct ', '').replace('*', '').strip()) + self.done = True + return + + self.done = False + + if self.group_data.override_use_direct_api_only: + return True + + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + self.parent_addon_c_lib_function_shared_tuple_in = '/* NOTE: msgParent__IN_{} - Override active to use inside dev-kit library only */'.format(self.funcname) + self.parent_addon_c_lib_function_shared_tuple_out = '/* NOTE: msgParent_OUT_{} - Override active to use inside dev-kit library only */'.format(self.funcname) + self.use_internal_only = True + return True + + haveIn = len(self.values) != 0 + haveOut = self.ContainsOutOnIn() or self.retval != 'void' + + cnt = 0 + tuple_in_values = '' + tuple_out_values = '' + api_use_list = [] + for value in self.values: + apiUse = CheckAPIUse(self, cnt, value, self.values) + api_use_list.append(apiUse) + cnt += 1 + + if apiUse.done: + tuple_in_values += apiUse.msgpack_in_value + (', ' if apiUse.msgpack_in_value else '') + tuple_out_values += apiUse.msgpack_out_value + (', ' if apiUse.msgpack_out_value else '') + else: + tuple_in_values += 'NEED_TODO_VALUES33('+value+')' + (', ' if apiUse.msgpack_in_value else '') + tuple_out_values += '????NEED_TODO_VALUES!!!!' + (', ' if apiUse.msgpack_in_value else '') + + while tuple_in_values.endswith(', '): + tuple_in_values = tuple_in_values[:-2] + while tuple_out_values.endswith(', '): + tuple_out_values = tuple_out_values[:-2] + + tuple_in = 'typedef std::tuple<' + tuple_out = 'typedef std::tuple<' + + ret_value = '' + if self.retval == 'char*': + ret_value += 'std::string' + elif self.retval in known_STANDARD_C_TYPES: + ret_value += self.retval + elif self.retval in known_VOID_PTR_DEFINES: + ret_value += 'PtrValue' + elif CheckKnownEnum(self.retval) and self.retval.count('*') == 0: + ret_value += self.retval.replace('enum ', '') + elif self.retval == 'char**' \ + and len(self.values) > 0 \ + and api_use_list[-1].value_type == 'size_t*' \ + and (not api_use_list[-2].value_type in known_STANDARD_C_PTR_TYPES if len(self.values) > 1 else True): + ret_value += 'std::vector' + elif self.retval != 'void': + ret_value += 'NEED_TODO_VALUES23' + + if ret_value: + self.parent_addon_c_lib_function_shared_tuple_out_list.append(ret_value) + tuple_out += ret_value + + if self.ContainsOutOnIn(): + tuple_out += (', ' if ret_value else '') + + self.parent_addon_c_lib_function_shared_tuple_in_list = tuple_in_values.split(', ') if tuple_in_values != '' else [] + self.parent_addon_c_lib_function_shared_tuple_out_list = tuple_out_values.split(', ') if tuple_out_values != '' else [] + + tuple_in += tuple_in_values + if tuple_in == 'typedef std::tuple<': + tuple_in += 'DummyValue' + tuple_out += tuple_out_values + if tuple_out == 'typedef std::tuple<': + tuple_out += 'DummyValue' + + tuple_in += '> msgParent__IN_' + self.funcname_ifc + ('; /* Autogenerated */' if not 'NEED_TODO_VALUES' in tuple_in else '; /* Need hand edit here, remove this note text after change! */') + tuple_out += '> msgParent_OUT_' + self.funcname_ifc + ('; /* Autogenerated */' if not 'NEED_TODO_VALUES' in tuple_out else '; /* Need hand edit here, remove this note text after change! */') + + self.parent_addon_c_lib_function_shared_tuple_in = tuple_in + self.parent_addon_c_lib_function_shared_tuple_out = tuple_out + + return True + + def GenerateToKodiDirectFuncTable(self, file_text): + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + self.group_data.to_kodi_direct_func_table.append(' /* Function "{}" only used inside dev-kit library only */'.format(self.funcname)) + return True + + func_values = '' + current_value = 1 + for value in self.values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + else: + value_name = '' + value_type = '...' + + func_values += value_type + (', ' if current_value < len(self.values) else '') + current_value += 1 + + entry = ('typedef {}(ATTR_INT_APIENTRYP PFN_INT_{}_V{})(void*{});' + .format(self.retval, + self.funcname.upper(), + self.api_added, + ', ' + func_values if len(func_values) > 0 else '')) + self.group_data.to_kodi_api_list_typedef.append(entry) + + entry = (' PFN_INT_{}_V{} {};' + .format(self.funcname.upper(), + self.api_added, + self.funcname_ifc)) + self.group_data.to_kodi_direct_func_table.append(entry) + + return True + + + def GenerateAddonSourceCFunctionDirectFuncPtr(self): + code = ' typedef ' + self.retval + '(ATTR_APIENTRYP PFN_CB_' + self.funcname.upper() + '_V' + str(self.api_added) + ')(void*, ' + current_value = 0 + for value in self.values: + if value == '...' or value == '': # TODO + continue + + code += value.replace(value.split()[-1], '').strip() + current_value += 1 + if current_value < len(self.values): + code += ', ' + if code.endswith(', '): + code = code[:-2] + code += ');\n' + + self.parent_addon_c_lib_function_direct_ptr = code + + return True + + # Log ID: 0003 + def GenerateAddonSourceCFunctionSharedCode(self, code, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt_in, cnt_out, value, value_list, ignored_count): + self.parent = parent + self.cnt_in = cnt_in + self.cnt_out = cnt_out + self.value = value + self.additional_code_1 = '' + self.additional_code_2 = '' + self.additional_code_3 = '' + self.additional_code_4 = '' + self.ignore_next = True + self.ignored_count = ignored_count + self.done = False + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.function_value = '' + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_1 + if '...' in self.value: + if cnt_in > 0 and len(value_list) > 1 and 'const char*' in value_list[cnt_in-1]: + parent.group_data.AddAdditionalAddonLibIncludes('#include "include/kodi/tools/StringUtils.h"') + name_before = value_list[cnt_in-1].split()[-1].strip() + self.additional_code_1 = ' va_list args;{}\n'.format(' /* CheckAPIUse_WAY_1 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' va_start(args, {});{}\n'.format(name_before, ' /* CheckAPIUse_WAY_1 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' const std::string cpp_{} = kodi::tools::StringUtils::FormatV({}, args);{}\n'.format(name_before, name_before, ' /* CheckAPIUse_WAY_1 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' va_end(args);{}\n'.format(' /* CheckAPIUse_WAY_1 (0003) */' if parent.options.debug else '') + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateAddonSourceCFunctionSharedCode'.format(parent.function_complete)) + raise + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_2 + m = re.search('^[\t ]*(?:const[\t ]*)?([a-zA-Z0-9_]*)[\t ]*\*[\t ]*(?:const[\t ]*)?\*', self.value) + if m and m.group(1) and m.group(1) in known_STANDARD_C_TYPES and 'size_t' in value_list[cnt_in+1] and 'size_t' in value_list[cnt_in+2]: + if 'const ' in self.value or 'const*' in self.value: + size_1_name = value_list[cnt_in+1].split()[-1].strip() + size_2_name = value_list[cnt_in+2].split()[-1].strip() + self.additional_code_1 = ' std::vector> ifc_{};{}\n'.format(m.group(1), self.value_name, ' /* CheckAPIUse_WAY_2 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' ifc_{}.resize({});{}\n'.format(self.value_name, size_1_name, ' /* CheckAPIUse_WAY_2 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' for (size_t i = 0; i < {}; ++i){}\n'.format(size_1_name, ' /* CheckAPIUse_WAY_2 (0003) */' if parent.options.debug else '') + self.additional_code_1 += ' ifc_{}[i] = std::vector<{}>({}[i], {}[i] + {});{}\n'.format(self.value_name, m.group(1), self.value_name, self.value_name, size_2_name, ' /* CheckAPIUse_WAY_2 (0003) */' if parent.options.debug else '') + self.msgpack_in_value = 'ifc_{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0003) */' if parent.options.debug else '') + self.msgpack_out_value = '' + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateAddonSourceCFunctionSharedCode'.format(parent.function_complete)) + raise + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_3 + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))(?:[\t ]*)?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(5)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(5)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(5)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_4 + # Fixed array way 2 e.g. "enum AudioEngineChannel (*info)[AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))(?:[\t ]*)?(.*)\ ?(.*)\ \(\*([a-z0-9A-Z_]*?)\)\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(4)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(4)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(4)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_5 + # Fixed array way 3 e.g. "enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]" + m = re.search('^((?:const{1,}))\ ?(.*)\ ([a-z0-9A-Z_]*?)\[([a-z0-9A-Z_]*?)\]$', value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + used_type = '' + if self.value_type == 'char': + used_type = 'std::array'.format(m.group(5)) + elif self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + used_type = 'std::array'.format(self.value_type.replace('struct ', '').replace('*', ''), m.group(4)) + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + used_type = 'std::array<{}, {}>'.format(self.value_type.replace('enum ', '').replace('*', ''), m.group(4)) + else: + used_type = 'std::array<{}, {}>'.format(self.value_type, m.group(4)) + + if m.group(1): + self.msgpack_in_value = used_type + self.msgpack_out_value = '' + else: + self.msgpack_in_value = '' + self.msgpack_out_value = used_type + self.done = True + return + + # NOTE CONFIRMED_YES (1) + # CheckAPIUse_WAY_6 (shared call, addon lib) (parent) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1: + i = 0 + while i+cnt_in < len(value_list)-1: + if 'size_t' in value_list[i+cnt_in+1]: + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + self.value_name = self.value_name.replace('[]', '') + self.additional_code_1 = (' std::vector cpp_{};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0003) */' if parent.options.debug else '')) + self.additional_code_1 += (' cpp_{}.reserve({});{}\n' + .format(self.value_name, + value_list[i+cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0003) */' if parent.options.debug else '')) + self.additional_code_1 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(value_list[i+cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0003) */' if parent.options.debug else '')) + self.additional_code_1 += (' {\n') + self.additional_code_1 += (' cpp_{}.emplace_back({}[i] != nullptr ? {}[i] : "");{}\n' + .format(self.value_name, + self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_6c (0003) */' if parent.options.debug else '')) + self.additional_code_1 += (' }\n') + self.msgpack_in_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + break + if '[]' in value_list[i+cnt_in+1] and value_list[i+cnt_in+1].count('[]') == 1: + i += 1 + continue + + print('FATAL (6b, 0003): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateAddonSourceCFunctionSharedCode!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + elif len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and '...' in value_list[cnt_in+1]: + self.msgpack_in_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6a (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + else: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6b (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # NOTE CONFIRMED_YES (1) + # CheckAPIUse_WAY_7 + if self.value_type == 'char**': + self.msgpack_in_value = '' + self.msgpack_out_value = ' *{} = strdup(std::get<{}>(t).c_str());{}\n'.format(self.value_name, self.cnt_out, ' /* CheckAPIUse_WAY_7 (0003) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (addon lib) (parent) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+1]: + self.value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = '' + self.msgpack_out_value = ('const std::vector& cpp_{} = std::get<{}>(t);{}\n' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' assert(cpp_{}.size() == *{});{}' + .format(self.value_name, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' if (!cpp_{}.empty())\n' + .format(self.value_name)) + self.additional_code_4 += (' {\n') + self.additional_code_4 += (' *{} = static_cast(malloc(*{} * sizeof(char*)));{}\n' + .format(self.value_name, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' for (size_t i = 0; i < *{}; ++i){}\n' + .format(value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' (*{})[i] = strdup(cpp_{}[i].c_str());{}\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' }\n') + self.additional_code_4 += (' else\n') + self.additional_code_4 += (' {\n') + self.additional_code_4 += (' *{} = nullptr;\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' }\n') + + self.done = True + else: + print('FATAL (8_1, 0003): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 + if self.value_type == 'char*' \ + and self.cnt_in-self.ignored_count+1 < len(parent.values) \ + and 'size_t' in value_list[self.cnt_in+self.ignored_count+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = (' strncpy({}, std::get<{}>(t).c_str(), {});{}' + .format(self.value_name, + self.cnt_out, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8 (0003) */' if parent.options.debug else '')) + self.done = True + return + + # CheckAPIUse_WAY_9 + if self.value_type in known_STANDARD_C_TYPES \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+1]: + size_value = value_list[cnt_in+ignored_count+1].split()[-1].strip() + value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = ('std::vector<{}>({}, {} + {}){}' + .format(self.value_type, + value_name, + value_name, + size_value, + ' /* CheckAPIUse_WAY_9 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = ('std::memcpy({}, std::get<{}>(t).data(), sizeof({}) * {});{}' + .format(value_name, + cnt_out, + self.value_type, + size_value, + ' /* CheckAPIUse_WAY_9 (0003) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_TYPES: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_10 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt_in < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+1] \ + and self.value_type.count('*') == 1: + size_value = value_list[cnt_in+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::memcpy({}, std::get<{}>(t).data(), sizeof({}) * {});{}' + .format(self.value_name, + cnt_out, + self.value_type.replace('*', ''), + size_value, + ' /* CheckAPIUse_WAY_10 (0003) */' if parent.options.debug else '')) + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt_in < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+1] \ + and self.value_type.count('*') == 1: + size_value = value_list[cnt_in+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = ('std::vector<{}>({}, {} + {}){}' + .format(self.value_type.replace('*', '').replace('const ', ''), + self.value_name, + self.value_name, + size_value, + ' /* CheckAPIUse_WAY_11 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if ContainsHdlVoidPointer(self.value_type): + self.msgpack_in_value = ('PtrValue({}){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_12 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_13 - e.g. 'bool* ret' + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES: + if self.value_type.count('*') == 1: + self.msgpack_in_value = '*{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_13 (0003) */' if parent.options.debug else '') + self.msgpack_out_value = ' *{} = std::get<{}>(t);{}\n'.format(self.value_name, self.cnt_out, ' /* CheckAPIUse_WAY_13 (0003) */' if parent.options.debug else '') + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples (on CheckAPIUse_WAY_13)'.format(parent.function_complete)) + exit(1) + return + + # WARNING CONFIRMED_NO (14a 1) + # CheckAPIUse_WAY_14 + # If yes, handle enum - e.g. 'enum NAME value' or 'enum NAME* ret' + if CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + + # Add enum to used list (if not present) + check_value = self.value_type.replace('*', '').strip() + if check_value not in parent.group_data.used_enums: + parent.group_data.used_enums.append(check_value) + + # If normal value add to input + if not '*' in self.value_type: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14a (0003) */' if parent.options.debug else '')) + elif '*' in self.value_type and self.value_type.count('*') == 1 and not 'const' in self.value_type: + self.msgpack_in_value = ('*{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = ('*{} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_14b (0003) */' if parent.options.debug else '')) + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples (on CheckAPIUse_WAY_14)'.format(parent.function_complete)) + raise + self.done = True + return + + # NOTE CONFIRMED_YES (1) + # CheckAPIUse_WAY_15 + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.GenerateSharedStructure(self.value_type): + struct_name = self.value_type.replace('struct ', '').replace('*', '').strip() + + if struct_name == 'tm': + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_15 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = ('std::get<{}>(t).SetCStructure({});{}' + .format(self.cnt_out, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0003) */' if parent.options.debug else '')) + self.done = True + return + + # NOTE CONFIRMED_YES (1) + # CheckAPIUse_WAY_16 + if self.value_type.startswith('const struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_16 (0003) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and cnt_in+ignored_count < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+ignored_count+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + ifc_struct_name = self.value_type.replace('*', '').replace('struct ', '') + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector& ifc_{} = std::get<{}>(t);' + .format(ifc_struct_name, + self.value_name, + cnt_out)) + self.additional_code_4 = (' *{} = static_cast<{}>(malloc(sizeof({}) * ifc_{}.size()));{}\n' + .format(self.value_name, + self.value_type.replace('**', '*').replace('struct ', ''), + ifc_struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_17 (0003) */' if parent.options.debug else '')) + self.additional_code_4 += (' for (size_t i = 0; i < ifc_{}.size(); ++i)\n' + .format(self.value_name)) + self.additional_code_4 += (' ifc_{}[i].SetCStructure(&(*{})[i]);\n' + .format(self.value_name, + self.value_name)) + self.done = True + return + + self.done = False + + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + target_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/kodi-dev-kit/src/addon/api/'.format(kodi_dir)).replace('.h', '.cpp') + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}'.format(self.funcname_ifc.upper())) + if code_work: + code += code_work + else: + code += '#warning Function "{}" must be set by hand.\n'.format(self.function_complete) + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + code += '}\n' + self.parent_addon_c_lib_function_shared = code + return + + # Check code generation + #{{{ + check_code = '' + for value in self.values: + if '*' in value or '[]' in value or ContainsHdlVoidPointer(value): + check_code += '{} == nullptr || '.format(value.split()[-1].replace('[]', '')) + if check_code.endswith(' || '): + check_code = check_code[:-4] + if check_code != '': + check_code = ' if ({})\n'.format(check_code) + check_code += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + if check_code != '': + code += check_code + '\n' + #}}} + + if not self.group_data.override_use_direct_api_only: + code += '#ifndef KODI_INHIBIT_SHARED\n' + code += ' if (!AddonIfc::g_ifc->direct_used)\n' + code += ' {\n' + + if self.retval == 'void' and not len(self.values): + code += ' AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_' + self.header_group_id + ', funcParent_' + self.funcname_ifc + ');\n' + code += ' return;\n' + else: + haveIn = len(self.values) != 0 + haveOut = self.ContainsOutOnIn() or self.retval != 'void' + + outOnIn = '' + additional_code_2 = '' + additional_code_3 = '' + additional_code_4 = '' + if haveIn: + current = 0 + cnt = 1 if self.retval != 'void' else 0 + + in_values = '' + + count_in = 0 + count_out = 1 if self.retval != 'void' else 0 + ignored_count = 0 + api_use_list = [] + for value in self.values: + apiUse = CheckAPIUse(self, count_in, count_out, value, self.values, ignored_count) + api_use_list.append(apiUse) + ignored_count = apiUse.ignored_count + + count_in += 1 + + value_type = value.replace(value.split()[-1], '').strip() + current += 1 + current_name = value.split()[-1].strip() + if apiUse.done: + value_name = apiUse.msgpack_in_value + (', ' if apiUse.msgpack_in_value else '') + if apiUse.msgpack_out_value: + outOnIn += apiUse.msgpack_out_value + count_out += 1 + + code += apiUse.additional_code_1 + if apiUse.additional_code_2: + additional_code_2 += apiUse.additional_code_2 + if apiUse.additional_code_3: + additional_code_3 += apiUse.additional_code_3 + if apiUse.additional_code_4: + additional_code_4 += apiUse.additional_code_4 + + else: + value_name = 'TODO1aa!!!!!!!' + ', ' + outOnIn += '???TODO!!!!!!!' + in_values += value_name + + if in_values.endswith(', '): + in_values = in_values[:-2] + + haveIn = in_values != '' + + code += ' msgpack::sbuffer in;\n' if haveIn else '' + code += ' msgpack::sbuffer out;\n' if haveOut else '' + code += ' msgpack::pack(in, msgParent__IN_{}({}));\n'.format(self.funcname_ifc, in_values) if haveIn else '' + else: + code += ' msgpack::sbuffer out;\n' if haveOut else '' + + + if haveIn and haveOut: + code += ' if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_' + self.header_group_id + ', funcParent_' + self.funcname_ifc + ', in, out))\n' + code += ' return' + GetDefaultReturn(self.retval, self.function_complete, file_text) + ';\n' + elif haveIn and not haveOut: + code += ' AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage(funcGroup_' + self.header_group_id + ', funcParent_' + self.funcname_ifc + ', in);\n' + else: + code += ' if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessageOnlyGetReturn(funcGroup_' + self.header_group_id + ', funcParent_' + self.funcname_ifc + ', out))\n' + code += ' return' + GetDefaultReturn(self.retval, self.function_complete, file_text) + ';\n' + + if haveOut: + code += ' msgpack::unpacked ident = msgpack::unpack(out.data(), out.size());\n' + code += ' msgParent_OUT_' + self.funcname_ifc + ' t = ident.get().as();\n' + code += '\n' + + code += additional_code_3 + + if self.ContainsOutOnIn(): + code += outOnIn + + code += additional_code_4 + + if self.retval == 'char*': + code += ' return strdup(std::get<0>(t).c_str());{}\n'.format(' /* Return_WAY_1 (0003) */' if self.options.debug else '') + elif self.retval in known_STANDARD_C_TYPES: + code += ' return std::get<0>(t);{}\n'.format(' /* Return_WAY_2 (0003) */' if self.options.debug else '') + elif CheckKnownEnum(self.retval): + code += ' return std::get<0>(t);{}\n'.format(' /* Return_WAY_3 (0003) */' if self.options.debug else '') + elif ContainsHdlVoidPointer(self.retval): + code += ' return reinterpret_cast<{}>(std::get<0>(t));{}\n'.format(self.retval, ' /* Return_WAY_4 (0003) */' if self.options.debug else '') + elif self.retval == 'char**' \ + and len(self.values) > 0 \ + and api_use_list[-1].value_type == 'size_t*' \ + and (not api_use_list[-2].value_type in known_STANDARD_C_PTR_TYPES if len(self.values) > 1 else True): + code += ' const std::vector& values = std::get<0>(t);\n' + code += ' char** ret = static_cast(malloc(sizeof(char*) * values.size()));\n' + code += ' for (size_t i = 0; i < *{}; ++i)\n'.format(api_use_list[-1].value_name) + code += ' {\n' + code += ' ret[i] = strdup(values[i].c_str());\n' + code += ' }\n' + code += ' return ret;{}\n'.format(' /* Return_WAY_4 (0003) */' if self.options.debug else '') + elif self.retval != 'void': + code += ' return TODO_RET;\n' + else: + code += ' return;\n' + else: + code += ' return;\n' + + code += ' }\n' + code += '#endif /* !KODI_INHIBIT_SHARED */\n' + code += '\n' + + func_values = '' + current_value = 1 + for value in self.values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + value_name = value_name.split('[', 1)[0].strip() + else: + value_name = '' + value_type = '...' + continue + func_values += ', {}'.format(value_name) + current_value += 1 + + code += (' const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.{};\n' + .format(self.header_group_id)) + code += (' {}auto_gen_group.{}(auto_gen_group.thisClassHdl{});\n' + .format('return ' if self.retval != 'void' else '', + self.funcname_ifc, + func_values)) + + code += '}\n' + self.parent_addon_c_lib_function_shared = code + + def GenerateAddonSourceCFunctionDirectCode(self, code, file_text): + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname.upper()) + target_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/kodi-dev-kit/src/addon/api/'.format(kodi_dir)).replace('.h', '.cpp') + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}'.format(self.funcname.upper())) + if code_work: + code += code_work + else: + code += '#warning Function "{}" must be set by hand.\n'.format(self.function_complete) + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname.upper()) + code += '}\n' + self.parent_addon_c_lib_function_direct = code + return + + retval = '' + if self.retval != 'void': + retval += 'return ' + + code += ' void* kodiPtr = AddonIfc::g_ifc->direct.' + self.header_group_id + '->kodiPtr;\n' + code += ' ' + retval + 'AddonIfc::g_ifc->direct.' + self.header_group_id + '->' + self.funcname + '(kodiPtr, ' + current_value = 0 + for value in self.values: + if value == '...' or value == '': # TODO + continue + code += value.split()[-1] + current_value += 1 + if current_value < len(self.values): + code += ', ' + if code.endswith(', '): + code = code[:-2] + code += ');\n' + code += '}\n' + + self.parent_addon_c_lib_function_direct = code + + def GenerateAddonSourceCFunction(self, file_text): + code = 'ATTR_DLL_EXPORT {} {}('.format(self.retval, self.funcname) + + current_value = 1 + for value in self.values: + code += value + (', ' if current_value < len(self.values) else '') + current_value += 1 + + code += ')\n' + code += '{\n' + code += ' // Original API call: {}\n'.format(self.function_complete) + if not self.group_data.override_use_direct_api_only: + code += ' // Tuple in: {}\n'.format(self.parent_addon_c_lib_function_shared_tuple_in) + code += ' // Tuple out: {}\n'.format(self.parent_addon_c_lib_function_shared_tuple_out) + code += '\n' + + self.GenerateAddonSourceCFunctionSharedCode(code, file_text) + self.GenerateAddonSourceCFunctionDirectCode(code, file_text) + if not '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + self.GenerateAddonSourceCFunctionDirectFuncPtr() + + return True + + def GenerateKodiSourceCPPFunction(self, file_text): + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + return True + + target_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/interface/api/'.format(kodi_dir)).replace('.h', '.cpp') + + + values = '' + current_value = 1 + for value in self.values: + values += value + (', ' if current_value < len(self.values) else '') + current_value += 1 + + code = '' + code += '{} CHdl_kodi_{}::{}(void* thisClassHdl{})\n'.format(self.retval, self.header_group_id, self.funcname_ifc, ', ' + values if values != '' else '') + code += '{\n' + code += ' auto thisClass = reinterpret_cast<' + 'CHdl_kodi_{}*>(thisClassHdl);\n'.format(self.header_group_id) + code += ' if (thisClass == nullptr)\n' + code += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + code += '\n' + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname.upper()) + + # Check presence of hand edited part, if not make note code about + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}'.format(self.funcname.upper())) + if not code_work or '#warning Function' in code_work or '// AUTOGENERATED - Used by ' in code_work: + code_work = '' + for entry in self.callbacks: + if entry.api_call == self.funcname: + code_work += '// AUTOGENERATED - Used by class "{}" with "{}" on "{}".\n'.format(entry.call_class, entry.complete, entry.header) + code_work += '\n' + code_work += ' {}* cb = static_cast<{}*>({});'.format(entry.call_class, entry.call_class, self.values[0].split()[-1]) + + value_types = '' + current_value = 1 + for value in self.values: + current_value += 1 + if current_value <= 2: + continue + name = value.split()[-1] + value_types += name + (', ' if current_value-1 < len(self.values) else '') + + + caller = '' + if self.retval != 'void': + if self.retval == 'char*': + if not caller: + m = re.search('^(?:const)?\ *(std\:\:string)', entry.complete) + if m and m.group(1): + caller += ' return strdup(cb->{}({}).c_str());'.format(entry.function_name, value_types) + if not caller: + m = re.search('^(const[\t ]*char[\t ]*\*)', entry.complete) + if m and m.group(1): + caller += ' return strdup(cb->{}({}));'.format(entry.function_name, value_types) + elif self.retval == 'const char*': + if not caller: + m = re.search('^(?:const)?\ *(std\:\:string)', entry.complete) + if m and m.group(1): + caller += ' return cb->{}({});'.format(entry.function_name, value_types) + if not caller: + m = re.search('^(const[\t ]*char[\t ]*\*)', entry.complete) + if m and m.group(1): + caller += ' return cb->{}({});'.format(entry.function_name, value_types) + if not caller: + caller += ' return cb->{}({});'.format(entry.function_name, value_types) + else: + caller += ' cb->{}({});'.format(entry.function_name, value_types) + code_work += caller + + if not entry.header in self.group_data.kodi_ifc_includes: + self.group_data.kodi_ifc_includes.append(entry.header) + + break + + if not code_work: + code_work = ' // Code below must be set manually by hand to make work to Kodi\n' + code_work += '\n' + if self.ContainsOutOnIn() or self.retval != 'void': + if self.retval == 'char*': + code_work += ' std::string str; // Autogen example added code, set to required one!!!\n' + code_work += '\n' + code_work += ' return strdup(str.c_str());\n' + else: + code_work += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + code_work += '#warning Function "CHdl_kodi_{}::{}" must be set by hand. Alternatively add /*---AUTO_GEN_PARSE---*/ on back of target function in header to find on scan.\n'.format(self.header_group_id, self.funcname, self.funcname) + + if code_work.endswith('\n\n'): + code_work = code_work[:-1] + + code += code_work + code += '\n' + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname.upper()) + code += '}\n' + + self.parent_kodi_cpp_function_source = code + self.parent_kodi_cpp_function_header = (' static {} {}(void* thisClassHdl{}); // Added with API {}\n' + .format(self.retval, + self.funcname_ifc, + ', ' + values if values != '' else '', + self.api_added)) + + return True + + # Log ID: 0001 + def GenerateKodiSourceCPPSwitchCase(self, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt, cnt_out, value, value_list, ignored_count): + self.parent = parent + self.cnt = cnt + self.cnt_out = cnt_out + self.value = value + self.additional_code_1 = '' + self.additional_code_2 = '' + self.additional_code_3 = '' + self.additional_code_4 = '' + self.ignore_next = False + self.ignored_count = ignored_count + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.function_value = '' + self.done = False + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_1 + if '...' in self.value: + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_2 + m = re.search('^[\t ]*(?:const[\t ]*)?([a-zA-Z0-9_]*)[\t ]*\*[\t ]*(?:const[\t ]*)?\*', self.value) + if m and m.group(1) and m.group(1) in known_STANDARD_C_TYPES and 'size_t' in value_list[cnt+1] and 'size_t' in value_list[cnt+2]: + if 'const ' in self.value or 'const*' in self.value: + size_1_name = value_list[cnt+2].split()[-1].strip() + size_2_name = value_list[cnt+2].split()[-1].strip() + self.msgpack_in_value = 'std::vector>& ifc_{} = std::get<{}>(t);{}'.format(m.group(1), self.value_name, self.cnt-self.ignored_count, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.function_value = '{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.additional_code_2 = ' {}** {} = new {}*[ifc_{}.size()];{}'.format(m.group(1), self.value_name, m.group(1), + self.value_name, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.additional_code_2 += ' for (size_t i = 0; i < ifc_{}.size(); ++i){}'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.additional_code_2 += ' {}[i] = ifc_{}[i].data();{}'.format(self.value_name, self.value_name, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.additional_code_4 = ' delete[] {};{}\n'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0001) */' if parent.options.debug else '') + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase'.format(parent.function_complete)) + raise + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_2 + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + #regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$' + #m = re.search(regex_code, value) + #if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + #self.msgpack_in_value = 'ifc_{}'.format(m.group(3)) + #self.msgpack_out_value = 'memcpy(*{}, std::get<{}>(t).data(), sizeof({}) * {});'.format(m.group(3), cnt_out, self.value_type.replace('*', ''), m.group(5)) + #self.additional_code_1 = ' std::array<{}, {}> ifc_{};\n'.format(self.value_type, m.group(5), m.group(3)) + #self.additional_code_1 += ' std::memcpy(ifc_{}.data(), *{}, sizeof({}) * {});\n'.format(m.group(3), m.group(3), self.value_type.replace('*', ''), m.group(5)) + #elif cnt == 0 and (self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL') and self.value_type.replace('const ', '') in known_VOID_PTR_DEFINES: + #self.msgpack_in_value = 'PtrValue({})'.format(self.value_name) + #return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_6 (target call, Kodi side) (parent) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1: + i = 0 + while i+cnt < len(value_list)-1: + if 'size_t' in value_list[i+cnt+1]: + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + self.value_name = self.value_name.replace('[]', '') + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.msgpack_in_value = ('const std::vector& cpp_{} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.additional_code_2 += ('\n') + self.additional_code_2 += (' std::vector {};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.additional_code_2 += (' {}.reserve({});{}\n' + .format(self.value_name, + value_list[i+cnt+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.additional_code_2 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(value_list[i+cnt+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.additional_code_2 += (' {\n') + self.additional_code_2 += (' {}.emplace_back(cpp_{}[i].c_str());{}\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_6c (0001) */' if parent.options.debug else '')) + self.additional_code_2 += (' }\n') + self.additional_code_2 += (' assert(cpp_{}.size() == {});\n' + .format(self.value_name, + value_list[i+cnt+1].split()[-1].strip())) + self.additional_code_2 += ('\n') + self.msgpack_out_value = '' + self.done = True + break + if '[]' in value_list[i+cnt+1] and value_list[i+cnt+1].count('[]') == 1: + i += 1 + continue + + print('FATAL (6c, 0001): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateAddonSourceCFunctionSharedCode!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + else: + self.function_value = ('{}.c_str(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6a (0001) */' if parent.options.debug else '')) + self.msgpack_in_value = ('const std::string& {} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_6a (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_7 + if self.value_type == 'char**': + self.msgpack_in_value = 'char* {} = nullptr;{}'.format(self.value_name, ' /* CheckAPIUse_WAY_7 (0001) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_7 (0001) */' if parent.options.debug else '') + self.msgpack_out_value = '{} ? {} : ""{}'.format(self.value_name, self.value_name, ' /* CheckAPIUse_WAY_7 (0001) */' if parent.options.debug else '') + self.additional_code_4 = ' if ({}){}\n'.format(self.value_name, ' /* CheckAPIUse_WAY_7 (0001) */' if parent.options.debug else '') + self.additional_code_4 += ' free({});{}\n'.format(self.value_name, ' /* CheckAPIUse_WAY_7 (0001) */' if parent.options.debug else '') + self.ignored_count += 1 + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 + if self.value_type == 'char*' \ + and self.cnt-self.ignored_count+1 < len(parent.values) \ + and 'size_t' in value_list[self.cnt+self.ignored_count+1]: + size_value = value_list[cnt+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = ('std::string {};{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_2 = (' {}.reserve({});{}' + .format(self.value_name, + size_value, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.function_value = ('&{}[0]' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (shared call to addon, Kodi side) (parent) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+1]: + size_value = value_list[cnt+ignored_count+1].split()[-1].strip() + self.value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = ('char** {} = nullptr;{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0001) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0001) */' if parent.options.debug else '')) + self.additional_code_3 = (' std::vector cpp_{};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += (' cpp_{}.reserve({});{}\n' + .format(self.value_name, + size_value, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += (' if ({})\n' + .format(self.value_name)) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(size_value, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' if ({}[i])\n' + .format(self.value_name)) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' cpp_{}.emplace_back({}[i]);\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += (' free({}[i]);\n' + .format(self.value_name)) + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' else\n') + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' cpp_{}.emplace_back("");{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' free({});\n' + .format(self.value_name)) + self.additional_code_3 += (' }\n') + self.msgpack_out_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0001) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # CheckAPIUse_WAY_9 + if self.value_type in known_STANDARD_C_TYPES \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1 \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = ('std::vector<{}>& {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', '').replace('const ', ''), + value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_9 (0001) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(value_name, + ' /* CheckAPIUse_WAY_9 (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(value_name, + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_TYPES: + self.function_value = '{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_10 (0001) */' if parent.options.debug else '') + self.msgpack_in_value = '{} {} = std::get<{}>(t);{}'.format(self.value_type, self.value_name, self.cnt-self.ignored_count, ' /* CheckAPIUse_WAY_10 (0001) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt+ignored_count+1] \ + and self.value_type.count('*') == 1: + self.msgpack_in_value = '' + self.additional_code_2 = (' std::vector<{}> {}({});{}' + .format(self.value_type.replace('*', ''), + self.value_name, + value_list[cnt+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt+ignored_count+1] \ + and self.value_type.count('*') == 1: + self.msgpack_in_value = ('const std::vector<{}>& {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', '').replace('const ', ''), + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_11 (0001) */' if parent.options.debug else '')) + if not 'const ' in self.value_type: + self.ignored_count += 1 + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if ContainsHdlVoidPointer(self.value_type): + self.function_value = '{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_12 (0001) */' if parent.options.debug else '') + self.msgpack_in_value = '{} {} = reinterpret_cast<{}>(std::get<{}>(t));{}'.format(self.value_type, self.value_name, self.value_type, self.cnt-self.ignored_count, ' /* CheckAPIUse_WAY_12 (0001) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_13 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES: + if self.value_type.count('*') == 1: + self.msgpack_in_value = '{} {} = std::get<{}>(t);{}'.format(self.value_type.replace('*', ''), self.value_name, self.cnt-self.ignored_count, ' /* CheckAPIUse_WAY_13 (0001) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_13 (0001) */' if parent.options.debug else '') + if not 'const ' in self.value_type: + self.msgpack_out_value = '{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_13 (0001) */' if parent.options.debug else '') + else: + print('FATAL: Function "{}" Not supported on InterfaceDataChild::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse_WAY_13)'.format(parent.function_complete)) + exit(1) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_14 + if CheckKnownEnum(self.value_type): + if self.value_type.count('*') == 0: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type, + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_14a (0001) */' if parent.options.debug else '')) + self.function_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14a (0001) */' if parent.options.debug else '')) + elif self.value_type.count('*') == 1: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', ''), + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_14a (0001) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0001) */' if parent.options.debug else '')) + if not 'const ' in self.value_type: + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0001) */' if parent.options.debug else '')) + else: + print('FATAL: Function "{}" Not supported on InterfaceDataChild::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse_WAY_14)'.format(parent.function_complete)) + exit(1) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_15 + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.KnownSharedStructure(self.value_type): + struct_name = self.value_type.replace('struct ', '').replace('*', '').strip() + + if struct_name == 'tm': + self.additional_code_1 = (' {} {};{}' + .format(struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + self.msgpack_in_value = ('std::get<{}>(t).SetCStructure(&{});{}' + .format(self.cnt-self.ignored_count, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + else: + self.ignored_count += 1 + self.msgpack_in_value = ('{} {};{}' + .format(self.value_type.replace('*', ''), + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + + shared_struct = self.value_type.replace('*', '') + if parent.group_data.KnownSharedStructureWithClean(shared_struct): + self.additional_code_4 += (' IFC_{}::CleanCStructure(&{});\n' + .format(shared_struct.replace('struct ', ''), + self.value_name)) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_16 + if self.value_type.startswith('const struct ') and self.value_type.count('*') == 1 and parent.group_data.KnownSharedStructure(self.value_type): + struct_name = self.value_type.replace('*', '').replace('const struct ', '') + self.additional_code_1 = (' {} {};{}' + .format(struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_16 (0001) */' if parent.options.debug else '')) + self.msgpack_in_value = ('std::get<{}>(t).SetCStructure(&{});{}' + .format(self.cnt-self.ignored_count, + self.value_name, + ' /* CheckAPIUse_WAY_16 (0001) */' if parent.options.debug else '')) + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_16 (0001) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 - For xbmc/addons/interface/api/* + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and self.cnt-self.ignored_count+1 < len(parent.values) \ + and 'size_t*' in value_list[self.cnt-self.ignored_count+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + + self.ignored_count += 1 + struct_name = self.value_type.replace('**', '').replace('struct ', '') + size_name = value_list[cnt+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = '{} {} = nullptr;{}'.format(self.value_type.replace('**', '*'), self.value_name, ' /* CheckAPIUse_WAY_17 (0001) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_17 (0001) */' if parent.options.debug else '') + self.msgpack_out_value = 'ifc_{}'.format(self.value_name) + self.additional_code_3 = (' std::vector ifc_{};{}\n' + .format(struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_17 (0001) */' if parent.options.debug else '')) + self.additional_code_3 += ' if ({})\n'.format(self.value_name) + self.additional_code_3 += ' {\n' + self.additional_code_3 += ' ifc_{}.reserve({});\n'.format(self.value_name, size_name) + self.additional_code_3 += ' for (size_t i = 0; i < {}; ++i)\n'.format(size_name) + self.additional_code_3 += ' {\n' + self.additional_code_3 += ' ifc_{}.emplace_back(&{}[i]);'.format(self.value_name, self.value_name) + self.additional_code_3 += ' ifc_{}[i].CleanCStructure(&{}[i]);'.format(self.value_name, self.value_name) + self.additional_code_3 += ' }\n' + self.additional_code_3 += ' free({});\n'.format(self.value_name) + self.additional_code_3 += ' }\n' + self.done = True + return + + self.function_value = 'TODO1 ({})'.format(self.value_type) + self.msgpack_in_value = 'TODO2' + + if self.group_data.override_use_direct_api_only: + return True + + # Check function contains in and/or out + haveIn = len(self.values) != 0 + haveOut = self.ContainsOutOnIn() or self.retval != 'void' + + # Generate the initial first part of function + code = ' case funcParent_{}:\n'.format(self.funcname_ifc) + code += ' {\n' + code += ' // Original API call: {}\n'.format(self.function_complete) + code += ' // Tuple in: {}\n'.format(self.parent_addon_c_lib_function_shared_tuple_in) + code += ' // Tuple out: {}\n'.format(self.parent_addon_c_lib_function_shared_tuple_out) + + if '---AUTO_GEN_PARSE---'.format(self.funcname) in file_text: + return True + + # Check it have "in" and/or "return" values, if no go easy way and add the single line to code + if not haveIn and not haveOut: + code += ' {}(this);\n'.format(self.funcname_ifc) + else: + if haveIn: + code += ' msgParent__IN_{} t = in.get().as();\n'.format(self.funcname_ifc) + + cnt_in = 0 + cnt_out = 1 if self.retval != 'void' else 0 + ignored_count = 0 + + in_values = '' + out_values = '' + function_values = '' + additional_code_1 = '' + additional_code_2 = '' + additional_code_3 = '' + additional_code_4 = '' + ignore_next = False + api_use_list = [] + for value in self.values: + apiUse = CheckAPIUse(self, cnt_in, cnt_out, value, self.values, ignored_count) + api_use_list.append(apiUse) + cnt_in += 1 + + #if not apiUse.ignore_next: + #ignore_next = True + #elif ignore_next: + #ignore_next = False + #continue + + ignored_count = apiUse.ignored_count + + #if apiUse.msgpack_in_value: + #in_values += ' {}\n'.format(apiUse.msgpack_in_value) + #if apiUse.msgpack_out_value: + #cnt_out += 1 + #out_values += ' {}\n'.format(apiUse.msgpack_out_value) + + if apiUse.additional_code_1: + code += apiUse.additional_code_1 + if apiUse.additional_code_2: + additional_code_2 += apiUse.additional_code_2 + if apiUse.additional_code_3: + additional_code_3 += apiUse.additional_code_3 + if apiUse.additional_code_4: + additional_code_4 += apiUse.additional_code_4 + + in_values += ' {}\n'.format(apiUse.msgpack_in_value) + + if apiUse.function_value: + function_values += ', {}'.format(apiUse.function_value) + if apiUse.msgpack_out_value: + cnt_out += 1 + out_values += apiUse.msgpack_out_value + ', ' + + if out_values.endswith(', '): + out_values = out_values[:-2] + + return_value = '' + if self.retval == 'char*': + return_value = 'auto_gen_ret ? auto_gen_ret : ""{}'.format(' /* Return_WAY_1 (0001) */' if self.options.debug else '') + elif self.retval in known_STANDARD_C_TYPES: + return_value = 'auto_gen_ret{}'.format(' /* Return_WAY_2 (0001) */' if self.options.debug else '') + elif CheckKnownEnum(self.retval): + return_value = 'auto_gen_ret{}'.format(' /* Return_WAY_3 (0001) */' if self.options.debug else '') + elif ContainsHdlVoidPointer(self.retval): + return_value = 'PtrValue(auto_gen_ret){}\n'.format(' /* Return_WAY_4 (0001) */' if self.options.debug else '') + elif self.retval != 'void': + return_value = 'auto_gen_ret{}'.format(self.retval, ' /* Return_WAY_5 (undefined) (0001) */' if self.options.debug else '') + + code += in_values + code += additional_code_2 + code += ' {}{}(this{});\n'.format('{} auto_gen_ret = '.format(self.retval) if return_value else '', self.funcname_ifc, function_values) + code += additional_code_3 + if self.retval == 'char**' \ + and len(self.values) > 0 \ + and api_use_list[-1].value_type == 'size_t*' \ + and (not api_use_list[-2].value_type in known_STANDARD_C_PTR_TYPES if len(self.values) > 1 else True): + code += ' std::vector auto_gen_ret_cpp;\n' + code += ' if (auto_gen_ret)\n' + code += ' {\n' + code += ' auto_gen_ret_cpp.reserve({});\n'.format(api_use_list[-1].value_name) + code += ' for (size_t i = 0; i < {}; ++i)\n'.format(api_use_list[-1].value_name) + code += ' {\n' + code += ' if (auto_gen_ret[i])\n' + code += ' {\n' + code += ' auto_gen_ret_cpp.emplace_back(auto_gen_ret[i]);\n' + code += ' free(auto_gen_ret[i]);\n' + code += ' }\n' + code += ' }\n' + code += ' free(auto_gen_ret);\n' + code += ' }\n' + return_value = 'auto_gen_ret_cpp{}'.format(' /* Return_WAY_6 (0001) */' if self.options.debug else '') + if out_values or return_value: + code += ' msgpack::pack(out, msgParent_OUT_{}({}{}));\n'.format(self.funcname_ifc, return_value, (', ' if return_value else '') + out_values if out_values else '') + if '*' in self.retval: + if self.retval.count('*') == 1: + code += ' if (auto_gen_ret)\n' + code += ' free(auto_gen_ret);\n' + elif self.retval == 'char**' \ + and len(self.values) > 0 \ + and api_use_list[-1].value_type == 'size_t*' \ + and (not api_use_list[-2].value_type in known_STANDARD_C_PTR_TYPES if len(self.values) > 1 else True): + pass + else: + code += ' TODO3;\n' + + code += additional_code_4 + + + code += ' return true;\n' + code += ' }\n' + + self.parent_kodi_cpp_function_switch_case = code + + return True + +#=============================================================================== + +class InterfaceDataChild: + def __init__(self, callbacks, options): + self.callbacks = callbacks + self.options = options + self.header_group_id = '' + self.function_complete = '' + self.retval = '' + self.funcname = '' + self.funcname_ifc = '' + self.groupname = '' + self.values = [] + self.api_added = -1 + self.api_deprecated = -1 + self.ifc_name_func = '' + self.ifc_name_typdef = '' + + self.child_addon_c_lib_function_shared = '' + self.child_addon_c_lib_function_shared_tuple_in = '' + self.child_addon_c_lib_function_shared_tuple_in_list = [] + self.child_addon_c_lib_function_shared_tuple_out = '' + self.child_addon_c_lib_function_shared_tuple_out_list = [] + self.child_addon_c_lib_function_direct = '' + self.child_addon_c_lib_function_direct_ptr = '' + self.child_addon_c_lib_function_switch_case = '' + self.child_kodi_cpp_function_source = '' + self.child_kodi_cpp_function_header = '' + self.dev_kit_kodi_to_addon_source = '' + self.dev_kit_kodi_to_addon_header = '' + + self.group_data = None # The Parent class GroupData + self.search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + + def RegexScanFunction(self, function, file_text): + regex_code = '^typedef\ *(.*)\ ?\(\ *ATTR_APIENTRYP PFN_(.+?)\_V([0-9])\)(?=\()\((.*?)(?=\);|\) *__).+?(|(?:__(DEPRECATED|INTRODUCED)_IN_KODI\(([0-9]+)\))?.(?:__(DEPRECATED|INTRODUCED)_IN_KODI\(([0-9]+)\)));$' + m = re.search(regex_code, function) + if not m or not m.group(1) or not m.group(2) or not m.group(3): + print('ERROR: Function \'' + function + '\' not match wanted API!') + return False + + self.retval = m.group(1) + self.funcname = m.group(2).lower() + self.api_added = int(m.group(3)) + self.values = [] + for value in m.group(4).split(', '): + if value.strip() != '': + self.values.append(value.strip()) + + self.api_deprecated = -1 + if m.group(6) and m.group(6) == 'INTRODUCED': + self.api_added = int(m.group(7)) + elif m.group(6) and m.group(6) == 'DEPRECATED': + self.api_deprecated = int(m.group(7)) + if m.group(8) and m.group(8) == 'INTRODUCED': + self.api_added = int(m.group(9)) + elif m.group(8) and m.group(8) == 'DEPRECATED': + self.api_deprecated = int(m.group(9)) + + self.ifc_name_typdef = 'PFN_{}_V{}'.format(m.group(2), self.api_added) + for line in file_text.splitlines(): + m = re.search('^\ *' + self.ifc_name_typdef + '\ *([a-z0-9_].*)\;', line) + if m and m.group(1): + self.ifc_name_func = m.group(1) + break + + if self.ifc_name_func != '': + self.groupname = self.funcname.replace('_' + self.ifc_name_func, '') + if not self.groupname: + print('FATAL: Can\'t get groupname and function name for:') + print(' \'{}\''.format(function)) + print(' Have you defined the use of typedef inside function structure?') + raise + + self.funcname_ifc = '{}_v{}'.format(self.funcname, self.api_added) + + return True + + def ContainsOutOnIn(self): + for value in self.values: + if not 'const' in value and ('*' in value or '[' in value): + return True + return False + + # Log ID: 0002 + def GenerateSharedTuples(self, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt, value, value_list): + self.parent = parent + self.cnt = cnt + self.value = value + self.done = False + + check_error = CheckCorrectFunctionValue(value) + if check_error: + print('FATAL: Function "{}" not contains valid values (ERROR: {})'.format(parent.function_complete, check_error)) + raise + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.function_value = '' + + if '...' in self.value: + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.done = True + return + + m = re.search('^[\t ]*(?:const[\t ]*)?([a-zA-Z0-9_]*)[\t ]*\*[\t ]*(?:const[\t ]*)?\*', self.value) + if m and m.group(1) and m.group(1) in known_STANDARD_C_TYPES and 'size_t' in value_list[cnt+1] and 'size_t' in value_list[cnt+2]: + if 'const ' in self.value or 'const*' in self.value: + self.msgpack_in_value = 'std::vector>'.format(m.group(1)) + self.msgpack_out_value = '' + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples'.format(parent.function_complete)) + raise + return + + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type not in self.parent.group_data.used_enums: + self.parent.group_data.used_enums.append(self.value_type) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* place 1 (0002) */' + + used_type = 'std::array<' + self.value_type + ', ' + m.group(5) + '>' + self.msgpack_in_value = used_type + if not m.group(1): + self.msgpack_out_value = used_type + self.done = True + return + + # Fixed array way 2 e.g. "enum AudioEngineChannel (*info)[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ \(\*([a-z0-9A-Z_]*?)\)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type not in self.parent.group_data.used_enums: + self.parent.group_data.used_enums.append(self.value_type) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* place 2 (0002) */' + + used_type = 'std::array<' + self.value_type + ', ' + m.group(4) + '>' + self.msgpack_in_value = used_type + if not m.group(1): + self.msgpack_out_value = used_type + self.done = True + return + + # Fixed array way 3 e.g. "enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.msgpack_in_value = 'ifc_{}'.format(m.group(3)) + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type not in self.parent.group_data.used_enums: + self.parent.group_data.used_enums.append(self.value_type) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* place 2 (0002) */' + + used_type = 'std::array<' + self.value_type + ', ' + m.group(4) + '>' + self.msgpack_in_value = used_type + if not m.group(1): + self.msgpack_out_value = used_type + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_6 (tuple) (parent) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1: + i = 0 + while i+cnt < len(value_list)-1: + if 'size_t' in value_list[i+cnt+1]: + self.msgpack_in_value = ('std::vector{}' + .format(' /* CheckAPIUse_WAY_6b (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + break + if '[]' in value_list[i+cnt+1] and value_list[i+cnt+1].count('[]') == 1: + i += 1 + continue + + print('FATAL (6b, 0006): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + else: + self.msgpack_in_value = ('std::string{}' + .format(' /* CheckAPIUse_WAY_6a (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_7 (tuple) (parent) + if self.value_type == 'char**': + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::string' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (tuple) (parent) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt < len(value_list)-1 \ + and 'size_t*' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector{}' + .format(' /* CheckAPIUse_WAY_8_1 (0006) */' if parent.options.debug else '')) + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type == 'char*' \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::string' + self.done = True + return + + # CheckAPIUse_WAY_9 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector<{}>{}' + .format(self.value_type.replace('*', ''), + ' /* CheckAPIUse_WAY_9 (0006) */' if parent.options.debug else '')) + self.done = True + return + + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_TYPES \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1 \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = ('std::vector<{}>{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_10 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = ('std::vector<{}>{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_10 (0006) */' if parent.options.debug else '')) + self.done = True + return + + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_TYPES: + self.msgpack_in_value = ('{}{}' + .format(self.value_type, + ' /* CheckAPIUse_WAY_11 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + if ContainsHdlVoidPointer(self.value_type): + self.msgpack_in_value = 'PtrValue' + self.msgpack_out_value = '' + self.done = True + return + + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = ('std::vector<{}>{}' + .format(self.value_type.replace('*', '').replace('const ', ''), + ' /* CheckAPIUse_WAY_11 (0006) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + if self.value_type in known_STANDARD_C_PTR_TYPES: + self.msgpack_in_value = self.value_type.replace('*', '') + self.msgpack_out_value = self.value_type.replace('*', '') + self.done = True + return + + if CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + + if not '*' in self.value_type: + self.msgpack_in_value = self.value_type + elif '*' in self.value_type and self.value_type.count('*') == 1 and not 'const' in self.value_type: + value = self.value_type.replace('*', '') + self.msgpack_in_value = value + self.msgpack_out_value = value + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateSharedTuples'.format(parent.function_complete)) + raise + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_15 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.GenerateSharedStructure(self.value_type): + value_type = self.value_type.replace('struct ', '').replace('*', '').strip() + if value_type == 'tm': + self.msgpack_in_value = 'IFC_{}'.format(value_type) + else: + self.msgpack_in_value = '' + self.msgpack_out_value = 'IFC_{}'.format(value_type) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_16 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('const struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = 'IFC_{}'.format(self.value_type.replace('const struct ', '').replace('*', '').strip()) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and 'size_t*' in value_list[cnt+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = '' + self.msgpack_out_value = 'std::vector'.format(self.value_type.replace('struct ', '').replace('*', '').strip()) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_18 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_name.count('[]') == 1 \ + and 'size_t*' in value_list[cnt+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = 'std::vector'.format(self.value_type.replace('struct ', '').strip()) + self.msgpack_out_value = 'std::vector'.format(self.value_type.replace('struct ', '').strip()) + self.done = True + return + + self.done = False + + if self.group_data.override_use_direct_api_only: + return True + + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + self.parent_addon_c_lib_function_shared_tuple_in = '/* NOTE: msgChild__IN_{} - Override active to use inside dev-kit library only */'.format(self.funcname_ifc) + self.parent_addon_c_lib_function_shared_tuple_out = '/* NOTE: msgChild_OUT_{} - Override active to use inside dev-kit library only */'.format(self.funcname_ifc) + return True + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + msgChild__IN_ = 'msgChild__IN_{}'.format(self.funcname_ifc) + msgChild_OUT_ = 'msgChild_OUT_{}'.format(self.funcname_ifc) + found_in = False + found_Out = False + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + target_dir = kodi_dir + 'xbmc/addons/kodi-dev-kit/src/shared/api/' + target_file = self.group_data.path.replace(search_dir, target_dir) + with open(target_file) as f: + target_text = f.read() + f.close() + + for line in target_text.splitlines(): + if msgChild__IN_ in line or msgChild_OUT_ in line: + m = re.search('typedef std::tuple<(.*)> (msgChild__IN_.*?);', line) + if m and m.group(1) and m.group(2) == msgChild__IN_: + self.child_addon_c_lib_function_shared_tuple_in_list = m.group(1).split(', ') + self.child_addon_c_lib_function_shared_tuple_in = line + found_in = True + m = re.search('typedef std::tuple<(.*)> (msgChild_OUT_.*?);', line) + if m and m.group(1) and m.group(2) == msgChild_OUT_: + self.child_addon_c_lib_function_shared_tuple_out = line + found_Out = True + if found_in and found_Out: + break + + if not found_in: + self.child_addon_c_lib_function_shared_tuple_in = 'typedef std::tuple {}; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */'.format(msgChild__IN_) + else: + for entry in self.child_addon_c_lib_function_shared_tuple_in_list: + if CheckKnownEnum(entry): + entry = entry.replace('enum ', '') + if entry.replace('*', '') not in self.group_data.used_enums: + self.group_data.used_enums.append(entry) + if not found_Out: + self.child_addon_c_lib_function_shared_tuple_out = 'typedef std::tuple {}; /* OVERRIDE;USE_HAND_MAKE used, set this by hand */'.format(msgChild_OUT_) + else: + for entry in self.child_addon_c_lib_function_shared_tuple_out_list: + if CheckKnownEnum(entry): + entry = entry.replace('enum ', '') + if entry.replace('*', '') not in self.group_data.used_enums: + self.group_data.used_enums.append(entry) + return True + + haveIn = len(self.values) != 0 + haveOut = self.ContainsOutOnIn() or self.retval != 'void' + + cnt = 0 + tuple_in_values = '' + tuple_out_values = '' + api_use_list = [] + for value in self.values: + apiUse = CheckAPIUse(self, cnt, value, self.values) + api_use_list.append(apiUse) + cnt += 1 + + if apiUse.done: + tuple_in_values += apiUse.msgpack_in_value + (', ' if apiUse.msgpack_in_value else '') + tuple_out_values += apiUse.msgpack_out_value + (', ' if apiUse.msgpack_out_value else '') + else: + tuple_in_values += 'NEED_TODO_VALUES22('+value+')' + (', ' if apiUse.msgpack_in_value else '') + tuple_out_values += '????NEED_TODO_VALUES!!!!' + (', ' if apiUse.msgpack_in_value else '') + + while tuple_in_values.endswith(', '): + tuple_in_values = tuple_in_values[:-2] + while tuple_out_values.endswith(', '): + tuple_out_values = tuple_out_values[:-2] + + tuple_in = 'typedef std::tuple<' + tuple_out = 'typedef std::tuple<' + + ret_value = '' + if self.retval == 'char*': + ret_value += 'std::string' + elif self.retval in known_STANDARD_C_TYPES: + ret_value += self.retval + elif self.retval in known_VOID_PTR_DEFINES: + ret_value += 'PtrValue' + elif CheckKnownEnum(self.retval) and self.retval.count('*') == 0: + ret_value += self.retval.replace('enum ', '') + elif self.retval == 'char**' \ + and len(self.values) > 0 \ + and api_use_list[-1].value_type == 'size_t*' \ + and (not api_use_list[-2].value_type in known_STANDARD_C_PTR_TYPES if len(self.values) > 1 else True): + ret_value += 'std::vector' + elif self.retval != 'void': + ret_value += 'NEED_TODO_VALUES23' + + if ret_value: + self.child_addon_c_lib_function_shared_tuple_out_list.append(ret_value) + tuple_out += ret_value + + if self.ContainsOutOnIn(): + tuple_out += (', ' if ret_value else '') + + self.child_addon_c_lib_function_shared_tuple_in_list += tuple_in_values.split(', ') if tuple_in_values != '' else [] + self.child_addon_c_lib_function_shared_tuple_out_list += tuple_out_values.split(', ') if tuple_out_values != '' else [] + + tuple_in += tuple_in_values + if tuple_in == 'typedef std::tuple<': + tuple_in += 'DummyValue' + tuple_out += tuple_out_values + if tuple_out == 'typedef std::tuple<': + tuple_out += 'DummyValue' + + tuple_in += '> msgChild__IN_' + self.funcname_ifc + ('; /* Autogenerated */' if not 'NEED_TODO_VALUES' in tuple_in else '; /* Need hand edit here, remove this note text after change! */') + tuple_out += '> msgChild_OUT_' + self.funcname_ifc + ('; /* Autogenerated */' if not 'NEED_TODO_VALUES' in tuple_out else '; /* Need hand edit here, remove this note text after change! */') + + self.child_addon_c_lib_function_shared_tuple_in = tuple_in + self.child_addon_c_lib_function_shared_tuple_out = tuple_out + + return True + + def GenerateToAddonDirectFuncTable(self, file_text): + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + self.group_data.to_addon_direct_func_table.append(' /* Function "{}" only used inside dev-kit library only */'.format(self.funcname)) + return True + + values = [] + retval = '' + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + scan_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/interface/api/'.format(kodi_dir)) + + file_text = CodeGetField_AUTO_GEN_PARSE(scan_file, 'HAND_EDITED_FIELD={}'.format(self.funcname_ifc.upper())) + file_text = ' '.join(file_text.replace('\n', ' ').split(';')[0].split()).replace('( ', '(') + m = re.search('(.*)[ \t](kodi.+?)(?=\()\((.*?)\)', file_text) + if m and m.group(1) and m.group(2) and m.group(3): + values = m.group(3).split(', ') + retval = m.group(1) + else: + print('FATAL: Failed to scan "{}" on GenerateToAddonDirectFuncTable').format(file_text) + raise + else: + values = self.values + retval = self.retval + + func_values = '' + current_value = 1 + for value in values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + else: + value_name = '' + value_type = '...' + + func_values += value_type + (', ' if current_value < len(values) else '') + current_value += 1 + + entry = ('typedef {}(ATTR_INT_APIENTRYP PFN_INT_{}_V{})(void*{});' + .format(retval, + self.funcname.upper(), + self.api_added, + ', ' + func_values if len(func_values) > 0 else '')) + self.group_data.to_addon_api_list_typedef.append(entry) + + entry = (' PFN_INT_{}_V{} {};' + .format(self.funcname.upper(), + self.api_added, + self.funcname_ifc)) + self.group_data.to_addon_direct_func_table.append(entry) + + return True + + def GenerateAddonSourceSwitchCase(self, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt, value, value_list, ignored_count): + self.parent = parent + self.cnt = cnt + self.value = value + self.set_call = '' + self.set_static = False + self.set_override = '' + self.additional_code_1 = '' + self.additional_code_2 = '' + self.additional_code_3 = '' + self.additional_code_4 = '' + self.ignore_next = False + self.return_value = '' + self.ignored_count = ignored_count + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.done = False + + self.msgpack_in_value = '' + self.function_value = '' + self.msgpack_out_value = '' + self.no_in = False + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_1 + if '...' in self.value: + self.msgpack_in_value = '' + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_2 + m = re.search('^[\t ]*(?:const[\t ]*)?([a-zA-Z0-9_]*)[\t ]*\*[\t ]*(?:const[\t ]*)?\*', self.value) + if m and m.group(1) \ + and m.group(1) in known_STANDARD_C_TYPES \ + and self.cnt-self.ignored_count+2 < len(parent.values) \ + and 'size_t' in value_list[self.cnt-self.ignored_count+1] \ + and 'size_t' in value_list[self.cnt-self.ignored_count+2]: + if 'const ' in self.value or 'const*' in self.value: + size_1_name = value_list[self.cnt-self.ignored_count+1].split()[-1].strip() + size_2_name = value_list[self.cnt-self.ignored_count+2].split()[-1].strip() + self.msgpack_in_value = 'std::vector>& ifc_{} = std::get<{}>(t);{}'.format(m.group(1), self.value_name, self.cnt-self.ignored_count, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.function_value = '{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.additional_code_2 = ' {}** {} = new {}*[ifc_{}.size()];{}'.format(m.group(1), self.value_name, m.group(1), + self.value_name, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.additional_code_2 += ' for (size_t i = 0; i < ifc_{}.size(); ++i){}'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.additional_code_2 += ' {}[i] = ifc_{}[i].data();{}'.format(self.value_name, self.value_name, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.additional_code_4 = ' delete[] {};{}\n'.format(self.value_name, ' /* CheckAPIUse_WAY_2 (0004) */' if parent.options.debug else '') + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase'.format(parent.function_complete)) + raise + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_3 + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* CheckAPIUse_WAY_3 (0004) */' + + self.msgpack_in_value = ('std::array<{}, {}>& {} = std::get<{}>(t);{}' + .format(self.value_type, + m.group(5), + m.group(3), + cnt-ignored_count, + ' /* CheckAPIUse_WAY_3 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(m.group(3), + ' /* CheckAPIUse_WAY_3 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = '{}{}'.format(m.group(3), ' /* CheckAPIUse_WAY_5 (0004) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_4 + # Fixed array way 2 e.g. "enum AudioEngineChannel (*info)[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ \(\*([a-z0-9A-Z_]*?)\)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* CheckAPIUse_WAY_4 (0004) */' + + self.msgpack_in_value = ('std::array<{}, {}>& {} = std::get<{}>(t);{}' + .format(self.value_type, + m.group(4), + m.group(3), + cnt-ignored_count, + ' /* CheckAPIUse_WAY_4 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(m.group(3), + ' /* CheckAPIUse_WAY_4 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = '{}{}'.format(m.group(3), ' /* CheckAPIUse_WAY_4 (0004) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_5 + # Fixed array way 3 e.g. "enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.value_type = m.group(2).strip() + if self.value_type == 'const char*': + self.value_type = 'std::string' + elif self.value_type.startswith('const struct ') and self.value_type.count('*') == 1: + self.value_type = 'IFC_' + self.value_type.replace('const struct ', '').replace('*', '').strip() + elif self.value_type.startswith('struct') and self.value_type.count('*') == 1: + #tuple_in_list.append('IFC_' + value_type.replace('struct ', '').replace('*', '').strip()) + self.value_type = 'IFC_' + self.value_type.replace('struct ', '').replace('*', '').strip() + elif CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + if self.value_type.replace('*', '') not in parent.group_data.used_enums: + parent.group_data.used_enums.append(self.value_type.replace('*', '')) + elif not self.value_type in known_STANDARD_C_TYPES: + self.value_type = 'NEED_TODO_VALUES /* CheckAPIUse_WAY_5 (0004) */' + + self.msgpack_in_value = ('std::array<{}, {}>& {} = std::get<{}>(t);{}' + .format(self.value_type, + m.group(4), + m.group(3), + cnt-ignored_count, + ' /* CheckAPIUse_WAY_5 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(m.group(3), + ' /* CheckAPIUse_WAY_5 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = '{}{}'.format(m.group(3), ' /* CheckAPIUse_WAY_5 (0004) */' if parent.options.debug else '') + self.done = True + return + + if cnt == 0: + if self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL' \ + and ContainsHdlVoidPointer(self.value_type): + self.function_value = 'auto_gen_hdl' + self.done = True + return + if self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL*' \ + and self.value_type.replace('const ', '').replace('*', '') in known_VOID_PTR_DEFINES: + self.msgpack_in_value = '{} auto_gen_hdl = nullptr;'.format(self.value_type.replace('*', '')) + self.function_value = '&auto_gen_hdl' + self.msgpack_out_value = 'PtrValue(auto_gen_hdl)' + self.no_in = True + self.done = True + return + else: + #if self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL' \ + #and self.value_type.replace('const ', '') in known_VOID_PTR_DEFINES: + #self.msgpack_in_value = ('{} hdl = {}(std::get<{}>(t));' + #.format(self.value_type, + #self.value_type, + #self.cnt-self.ignored_count, + #)) + #self.function_value = self.value_name + #self.done = True + #return + if self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL*' \ + and self.value_type.replace('const ', '').replace('*', '') in known_VOID_PTR_DEFINES: + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_6 (target call, Addon side) (child) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1: + i = 0 + while i+cnt < len(value_list)-1: + if 'size_t' in value_list[i+cnt+1]: + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + self.value_name = self.value_name.replace('[]', '') + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.msgpack_in_value = ('const std::vector& cpp_{} = std::get<{}>(t);{}' + .format(self.value_name, + i+self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.additional_code_2 += ('\n') + self.additional_code_2 += (' std::vector {};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.additional_code_2 += (' {}.reserve({});{}\n' + .format(self.value_name, + value_list[i+cnt+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.additional_code_2 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(value_list[i+cnt+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.additional_code_2 += (' {\n') + self.additional_code_2 += (' {}.emplace_back(cpp_{}[i].c_str());{}\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_6c (0004) */' if parent.options.debug else '')) + self.additional_code_2 += (' }\n') + self.additional_code_2 += (' assert(cpp_{}.size() == {});\n' + .format(self.value_name, + value_list[i+cnt+1].split()[-1].strip())) + self.additional_code_2 += ('\n') + self.msgpack_out_value = '' + self.done = True + break + if '[]' in value_list[i+cnt+1] and value_list[i+cnt+1].count('[]') == 1: + i += 1 + continue + + print('FATAL (6c, 0004): Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateSharedTuples!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + else: + self.function_value = ('{}.c_str(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6a (0004) */' if parent.options.debug else '')) + self.msgpack_in_value = ('const std::string& {} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_6a (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_7 + if self.value_type == 'char**': + self.msgpack_in_value = 'char* {} = nullptr;'.format(self.value_name, ' /* CheckAPIUse_WAY_6 (0004) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_6 (0004) */' if parent.options.debug else '') + self.msgpack_out_value = '{} ? {} : ""{}'.format(self.value_name, self.value_name, ' /* CheckAPIUse_WAY_6 (0004) */' if parent.options.debug else '') + self.additional_code_4 = ' if ({}){}\n'.format(self.value_name, ' /* CheckAPIUse_WAY_6 (0004) */' if parent.options.debug else '') + self.additional_code_4 += ' free({});{}'.format(self.value_name, ' /* CheckAPIUse_WAY_6 (0004) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 + + if self.value_type == 'char*' \ + and self.cnt-self.ignored_count+1 < len(parent.values) \ + and 'size_t' in value_list[self.cnt+self.ignored_count+1]: + self.msgpack_in_value = ('std::string {};{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_2 = (' {}.reserve({});{}' + .format(self.value_name, + value_list[cnt+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.function_value = ('&{}[0]' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (shared call to addon, Kodi side) (parent) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+1]: + size_value = value_list[cnt+ignored_count+1].split()[-1].strip() + self.value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = ('char** {} = nullptr;{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0004) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0004) */' if parent.options.debug else '')) + self.additional_code_3 = (' std::vector cpp_{};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += (' cpp_{}.reserve({});{}\n' + .format(self.value_name, + size_value, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += (' if ({})\n' + .format(self.value_name)) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(size_value, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' if ({}[i])\n' + .format(self.value_name)) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' cpp_{}.emplace_back({}[i]);\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += (' free({}[i]);\n' + .format(self.value_name)) + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' else\n') + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' cpp_{}.emplace_back("");{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' }\n') + self.additional_code_3 += (' free({});\n' + .format(self.value_name)) + self.additional_code_3 += (' }\n') + self.msgpack_out_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8 (0004) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_TYPES \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1 \ + and cnt < len(value_list)-1 \ + and 'size_t' in value_list[cnt+1]: + self.msgpack_in_value = 'TODO!!!2222222' + self.additional_code_2 = ('std::vector<{}> {}({});{}' + .format(self.value_type.replace('*', ''), + self.value_name, + value_list[cnt+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_TYPES: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type, + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_9 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_9 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt+ignored_count+1] \ + and self.value_type.count('*') == 1: + self.msgpack_in_value = '' + self.additional_code_2 = ('std::vector<{}> {}({});{}' + .format(self.value_type.replace('*', ''), + self.value_name, + value_list[cnt+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_10 (0004) */' if parent.options.debug else '')) + self.ignored_count += 1 + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt+ignored_count+1] \ + and self.value_type.count('*') == 1: + self.msgpack_in_value = ('const std::vector<{}>& {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', '').replace('const ', ''), + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_11 (0004) */' if parent.options.debug else '')) + self.function_value = ('{}.data(){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_11 (0004) */' if parent.options.debug else '')) + if not 'const ' in self.value_type: + self.ignored_count += 1 + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if ContainsHdlVoidPointer(self.value_type): + if self.value_type == 'KODI_OWN_HDL': + self.function_value = ('auto_gen_hdl{}'.format(' /* CheckAPIUse_WAY_12 (0004) */' if parent.options.debug else '')) + else: + self.function_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_12 (0004) */' if parent.options.debug else '')) + self.msgpack_in_value = ('{} {} = reinterpret_cast<{}>(std::get<{}>(t));{}' + .format(self.value_type, + self.value_name, + self.value_type, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_12 (0004) */' if parent.options.debug else '')) + self.done = True + return + + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12b + if (ContainsHdlVoidPointer(self.value_type.replace('*', '')) \ + and self.value_type.count('*') == 1): + self.msgpack_in_value = ('{} {} = nullptr;{}' + .format(self.value_type.replace('*', ''), + self.value_name, + ' /* CheckAPIUse_WAY_12b (0005) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_12 (0004) */' if parent.options.debug else '')) + self.msgpack_out_value = ('*{} = reinterpret_cast<{}>(std::get<{}>(t));{}' + .format(self.value_name, + self.value_type.replace('*', ''), + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_12b (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_13 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES: + if self.value_type.count('*') == 1: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', ''), + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_13 (0004) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_13 (0004) */' if parent.options.debug else '')) + if not 'const ' in self.value_type: + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_13 (0004) */' if parent.options.debug else '')) + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse_WAY_13)'.format(parent.function_complete)) + exit(1) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_14 + if CheckKnownEnum(self.value_type): + if self.value_type.count('*') == 0: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type, + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_14a (0004) */' if parent.options.debug else '')) + self.function_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14a (0004) */' if parent.options.debug else '')) + elif self.value_type.count('*') == 1: + self.msgpack_in_value = ('{} {} = std::get<{}>(t);{}' + .format(self.value_type.replace('*', ''), + self.value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_14a (0004) */' if parent.options.debug else '')) + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0004) */' if parent.options.debug else '')) + if not 'const ' in self.value_type: + self.msgpack_out_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0004) */' if parent.options.debug else '')) + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse_WAY_14)'.format(parent.function_complete)) + exit(1) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_15 + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 1 \ + and parent.group_data.KnownSharedStructure(self.value_type): + struct_name = self.value_type.replace('struct ', '').replace('*', '').strip() + + if struct_name == 'tm': + self.additional_code_1 = (' {} {};{}' + .format(struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + self.msgpack_in_value = ('std::get<{}>(t).SetCStructure(&{});{}' + .format(self.cnt-self.ignored_count, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + else: + self.ignored_count += 1 + self.msgpack_in_value = ('{} {};{}' + .format(self.value_type.replace('*', ''), + self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + + self.function_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + self.msgpack_out_value = ('&{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_15 (0001) */' if parent.options.debug else '')) + + shared_struct = self.value_type.replace('*', '') + if parent.group_data.KnownSharedStructureWithClean(shared_struct): + self.additional_code_4 += (' IFC_{}::CleanCStructure(&{});\n' + .format(shared_struct.replace('struct ', ''), + self.value_name)) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_16 + if self.value_type.startswith('const struct ') and self.value_type.count('*') == 1 and parent.group_data.KnownSharedStructure(self.value_type): + struct_name = self.value_type.replace('*', '').replace('const struct ', '') + self.additional_code_1 = ' {} {};{}'.format(struct_name, self.value_name, ' /* CheckAPIUse_WAY_16 (0004) */' if parent.options.debug else '') + self.msgpack_in_value = 'std::get<{}>(t).SetCStructure(&{});{}'.format(self.cnt-self.ignored_count, self.value_name, ' /* CheckAPIUse_WAY_16 (0004) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_16 (0004) */' if parent.options.debug else '') + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 - For xbmc/addons/interface/api/* + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and self.cnt-self.ignored_count+1 < len(parent.values) \ + and 'size_t*' in value_list[self.cnt-self.ignored_count+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + + self.ignored_count += 1 + struct_name = self.value_type.replace('**', '').replace('struct ', '') + size_name = value_list[cnt+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = '{} {} = nullptr;{}'.format(self.value_type.replace('**', '*'), self.value_name, ' /* CheckAPIUse_WAY_17 (0004) */' if parent.options.debug else '') + self.function_value = '&{}{}'.format(self.value_name, ' /* CheckAPIUse_WAY_17 (0004) */' if parent.options.debug else '') + self.msgpack_out_value = 'ifc_{}'.format(self.value_name) + self.additional_code_3 = (' std::vector ifc_{};{}\n' + .format(struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_17 (0004) */' if parent.options.debug else '')) + self.additional_code_3 += ' if ({})\n'.format(self.value_name) + self.additional_code_3 += ' {\n' + self.additional_code_3 += ' ifc_{}.reserve({});\n'.format(self.value_name, size_name) + self.additional_code_3 += ' for (size_t i = 0; i < {}; ++i)\n'.format(size_name) + self.additional_code_3 += ' {\n' + self.additional_code_3 += ' ifc_{}.emplace_back(&{}[i]);'.format(self.value_name, self.value_name) + self.additional_code_3 += ' ifc_{}[i].CleanCStructure(&{}[i]);'.format(self.value_name, self.value_name) + self.additional_code_3 += ' }\n' + self.additional_code_3 += ' free({});\n'.format(self.value_name) + self.additional_code_3 += ' }\n' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_18 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_name.count('[]') == 1 \ + and 'size_t*' in value_list[cnt+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + value_name = self.value_name.replace('[]', '') + + self.msgpack_in_value = ('std::vector& ifc_{} = std::get<{}>(t);{}' + .format(self.value_type.replace('struct ', ''), + value_name, + self.cnt-self.ignored_count, + ' /* CheckAPIUse_WAY_18 (0004) */' if parent.options.debug else '')) + self.additional_code_2 = (' std::vector<{}> {}({});{}\n' + .format(self.value_type, + value_name, + value_list[cnt+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_18 (0004) */' if parent.options.debug else '')) + self.additional_code_2 += (' for (size_t i = 0; i < {}; ++i)\n' + .format(value_list[cnt+ignored_count+1].split()[-1].strip())) + self.additional_code_2 += (' {\n') + self.additional_code_2 += (' ifc_{}[i].SetCStructure(&{}[i]);\n' + .format(value_name, value_name)) + self.additional_code_2 += (' }\n') + self.function_value = ('{}.data(){}' + .format(value_name, + ' /* CheckAPIUse_WAY_18 (0004) */' if parent.options.debug else '')) + self.additional_code_3 = (' for (size_t i = 0; i < {}; ++i)\n' + .format(value_list[cnt+ignored_count+1].split()[-1].strip())) + self.additional_code_3 += (' {\n') + self.additional_code_3 += (' ifc_{}[i] = IFC_{}(&{}[i]);\n' + .format(value_name, + self.value_type.replace('struct ', ''), + value_name)) + self.additional_code_3 += (' }\n') + self.msgpack_out_value = ('ifc_{}{}' + .format(value_name, + ' /* CheckAPIUse_WAY_18 (0004) */' if parent.options.debug else '')) + self.done = True + return + + if self.group_data.override_use_direct_api_only: + return True + + code = ' case funcChild_{}:\n'.format(self.funcname_ifc) + code += ' {\n' + code += ' // Original API call: {}\n'.format(self.function_complete) + code += ' // Tuple in: {}\n'.format(self.child_addon_c_lib_function_shared_tuple_in) + code += ' // Tuple out: {}\n'.format(self.child_addon_c_lib_function_shared_tuple_out) + code += '\n' + + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + target_file = (self.group_data.path.replace(self.search_dir, + '{}xbmc/addons/kodi-dev-kit/src/addon/api/'.format(kodi_dir)).replace('.h', '.cpp')) + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}'.format(self.funcname_ifc.upper())) + if code_work: + code += code_work + else: + code += '#warning USE_HAND_MAKE set for function "{}" and must be set by hand.\n'.format(self.function_complete) + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + code += ' return true;\n' + code += ' }\n' + self.child_addon_c_lib_function_switch_case = code + return True + + count = 0 + function_values = [] + msgpack_in_values = [] + msgpack_out_values = [] + additional_code_1 = '' + additional_code_2 = '' + additional_code_3 = '' + additional_code_4 = '' + no_in = False + ignored_count = 0 + + default_ret = GetDefaultReturn(self.retval, self.function_complete, file_text) + if default_ret: + return_value = '' + if self.retval == 'char*': + return_value = 'auto_gen_ret ? auto_gen_ret : ""{}'.format(' /* Return_WAY_1 (0004) */' if self.options.debug else '') + elif self.retval in known_STANDARD_C_TYPES: + return_value = 'auto_gen_ret{}'.format(' /* Return_WAY_2 (0004) */' if self.options.debug else '') + elif CheckKnownEnum(self.retval): + return_value = 'auto_gen_ret{}'.format(' /* Return_WAY_3 (0004) */' if self.options.debug else '') + elif ContainsHdlVoidPointer(self.retval): + return_value = 'PtrValue(auto_gen_ret){}\n'.format(' /* Return_WAY_4 (0004) */' if self.options.debug else '') + elif self.retval != 'void': + return_value = 'auto_gen_ret{}'.format(self.retval, ' /* Return_WAY_5 (undefined) (0004) */' if self.options.debug else '') + msgpack_out_values.append(return_value) + + for value in self.values: + apiUse = CheckAPIUse(self, count, value, self.values, ignored_count) + ignored_count = apiUse.ignored_count + count += 1 + + if apiUse.done: + if apiUse.no_in: + no_in = True + if apiUse.msgpack_in_value: + msgpack_in_values.append(apiUse.msgpack_in_value) + if apiUse.msgpack_out_value: + msgpack_out_values.append(apiUse.msgpack_out_value) + + if apiUse.additional_code_1: + additional_code_1 += apiUse.additional_code_1 + if apiUse.additional_code_2: + additional_code_2 += apiUse.additional_code_2 + if apiUse.additional_code_3: + additional_code_3 += apiUse.additional_code_3 + if apiUse.additional_code_4: + additional_code_4 += apiUse.additional_code_4 + if apiUse.function_value: + function_values.append(apiUse.function_value) + + if not no_in: + code += ' msgChild__IN_{} t = in.get().as();\n'.format(self.funcname_ifc) + code += ' KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t));\n' + + for value in additional_code_1: + code += '{}'.format(value) + for value in msgpack_in_values: + code += ' {}'.format(value) + for value in additional_code_2: + code += '{}'.format(value) + + code += (' {}{}(this{}{});\n'.format('{} auto_gen_ret = '.format(self.retval) if default_ret else '', + self.funcname_ifc, + ', ' if len(function_values) > 0 else '', + ', '.join(function_values))) + code += '\n' + + for value in additional_code_3: + code += '{}'.format(value) + if len(self.child_addon_c_lib_function_shared_tuple_out_list) != 0 and \ + not self.child_addon_c_lib_function_shared_tuple_out_list[0] == 'DummyValue': + code += (' msgpack::pack(out, msgChild_OUT_{}({}));\n'.format(self.funcname_ifc, + ', '.join(msgpack_out_values))) + for value in additional_code_4: + code += '{}'.format(value) + + code += ' return true;\n' + code += ' }\n' + + self.child_addon_c_lib_function_switch_case = code + + return True + + def GenerateKodiSourceCPPFunction(self, file_text): + """ + Generate source for ./xbmc/addons/interface/api/*.cpp. + """ + class CheckAPIUse: + def __init__(self, parent, cnt_in, cnt_out, value, value_list, ignored_count): + self.parent = parent + self.cnt_in = cnt_in + self.cnt_out = cnt_out + self.value = value + self.ignored_count = ignored_count; + self.additional_code_1 = '' + self.additional_code_2 = '' + self.additional_code_3 = '' + self.additional_code_4 = '' + self.ignore_next = False + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + + self.msgpack_in_value = '' + self.msgpack_out_value = '' + + # Fixed array way 1 e.g. "enum AudioEngineChannel info[][AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)(?!\*)?\[([a-z0-9A-Z_]*?)\]\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and not m.group(4) and m.group(5): + self.msgpack_in_value = 'ifc_{}'.format(m.group(3)) + self.msgpack_out_value = 'std::memcpy(*{}, std::get<{}>(t).data(), sizeof({}) * {});'.format(m.group(3), cnt_out, self.value_type.replace('*', ''), m.group(5)) + self.additional_code_1 = ' std::array<{}, {}> ifc_{};\n'.format(self.value_type, m.group(5), m.group(3)) + self.additional_code_1 += ' std::memcpy(ifc_{}.data(), *{}, sizeof({}) * {});\n'.format(m.group(3), m.group(3), self.value_type.replace('*', ''), m.group(5)) + self.done = True + return + + # Fixed array way 2 e.g. "enum AudioEngineChannel (*info)[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ \(\*([a-z0-9A-Z_]*?)\)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.msgpack_in_value = 'ifc_{}'.format(m.group(3)) + self.msgpack_out_value = 'std::memcpy(*{}, std::get<{}>(t).data(), sizeof({}) * {});'.format(m.group(3), cnt_out, self.value_type.replace('*', ''), m.group(4)) + self.additional_code_1 = ' std::array<{}, {}> ifc_{};\n'.format(self.value_type, m.group(4), m.group(3)) + self.additional_code_1 += ' std::memcpy(ifc_{}.data(), *{}, sizeof({}) * {});\n'.format(m.group(3), m.group(3), self.value_type.replace('*', ''), m.group(4)) + self.done = True + return + + # Fixed array way 3 e.g. "enum AudioEngineChannel info[AUDIOENGINE_CH_MAX]" + regex_code = '^((?:const{1,}))?(.*)\ ([a-z0-9A-Z_]*?)\[([a-z0-9A-Z_]*?)\]$' + m = re.search(regex_code, value) + if m and m.group(2) and m.group(3) and m.group(4): + self.msgpack_in_value = 'ifc_{}'.format(m.group(3)) + self.msgpack_out_value = 'std::memcpy({}, std::get<{}>(t).data(), sizeof({}) * {});'.format(m.group(3), cnt_out, self.value_type.replace('*', ''), m.group(4)) + self.additional_code_1 = ' std::array<{}, {}> ifc_{};\n'.format(self.value_type, m.group(4), m.group(3)) + self.additional_code_1 += ' std::memcpy(ifc_{}.data(), {}, sizeof({}) * {});\n'.format(m.group(3), m.group(3), self.value_type.replace('*', ''), m.group(4)) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_6 (shared call to addon, Kodi side) (child) + if self.value_type == 'const char*': + if '[]' in self.value_name and self.value_name.count('[]') == 1: + if len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+1]: + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + parent.group_data.AddAdditionalAddonLibIncludes('#include ') + self.value_name = self.value_name.replace('[]', '') + self.additional_code_1 = (' std::vector cpp_{};{}\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' cpp_{}.reserve({});{}\n' + .format(self.value_name, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' for (size_t i = 0; i < {}; ++i){}\n' + .format(value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_6c (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' {\n') + self.additional_code_1 += (' cpp_{}.emplace_back({}[i] != nullptr ? {}[i] : "");{}\n' + .format(self.value_name, + self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_6c (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' }\n') + self.msgpack_in_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6c (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataChild::GenerateKodiSourceCPPFunction!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + elif len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and '...' in value_list[cnt_in+1]: + self.msgpack_in_value = ('cpp_{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6a (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + else: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_6b (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_7 (shared call to addon, Kodi side) (child) + if self.value_type == 'char**': + self.msgpack_in_value = '' + self.msgpack_out_value = (' *{} = strdup(std::get<{}>(t).c_str());{}' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_7 (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8_1 (shared call to addon, Kodi side) (child) + if self.value_type == 'char***' \ + or (self.value_type == 'char**' \ + and '[]' in self.value_name \ + and self.value_name.count('[]') == 1): + if len(value_list) > 1 \ + and cnt_in < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+1]: + self.value_name = self.value_name.replace('[]', '') + self.msgpack_in_value = '' + self.msgpack_out_value = ('const std::vector& cpp_{} = std::get<{}>(t);{}\n' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' assert(cpp_{}.size() == *{});{}' + .format(self.value_name, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' if (!cpp_{}.empty())\n' + .format(self.value_name)) + self.additional_code_4 += (' {\n') + self.additional_code_4 += (' *{} = static_cast(malloc(*{} * sizeof(char*)));{}\n' + .format(self.value_name, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' for (size_t i = 0; i < *{}; ++i){}\n' + .format(value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' (*{})[i] = strdup(cpp_{}[i].c_str());{}\n' + .format(self.value_name, + self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' }\n') + self.additional_code_4 += (' else\n') + self.additional_code_4 += (' {\n') + self.additional_code_4 += (' *{} = nullptr;\n' + .format(self.value_name, + ' /* CheckAPIUse_WAY_8_1 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' }\n') + + self.done = True + else: + print('FATAL: Function:') + print(' "{}"'.format(parent.function_complete)) + print(' Not supported on InterfaceDataChild::GenerateKodiSourceCPPFunction!') + print(' Need to set second value of "{}" as "size_t".'.format(self.value)) + exit(1) + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_8 + if self.value_type == 'char*' \ + and self.cnt_in-self.ignored_count+1 < len(parent.values) \ + and 'size_t' in value_list[self.cnt_in+self.ignored_count+1]: + self.msgpack_in_value = '' + self.msgpack_out_value = (' strncpy({}, std::get<{}>(t).c_str(), {});{}' + .format(self.value_name, + self.cnt_out, + value_list[cnt_in+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_8 (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_9 + if self.value_type in known_STANDARD_C_TYPES: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_9 (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_10 + if self.value_type in known_STANDARD_C_PTR_TYPES \ + and cnt_in+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+ignored_count+1] \ + and self.value_type.count('*') == 1: + size_value = value_list[cnt_in+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::memcpy({}, std::get<{}>(t).data(), sizeof({}) * {});{}' + .format(self.value_name, + cnt_out, + self.value_type.replace('*', ''), + size_value, + ' /* CheckAPIUse_WAY_10 (0005) */' if parent.options.debug else '')) + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_11 + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES \ + and cnt_in+ignored_count < len(value_list)-1 \ + and 'size_t' in value_list[cnt_in+ignored_count+1] \ + and self.value_type.count('*') == 1: + size_value = value_list[cnt_in+ignored_count+1].split()[-1].strip() + self.msgpack_in_value = ('std::vector<{}>({}, {} + {}){}' + .format(self.value_type.replace('*', '').replace('const ', ''), + self.value_name, + self.value_name, + size_value, + ' /* CheckAPIUse_WAY_11 (0005) */' if parent.options.debug else '')) + self.ignore_next = True + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if ContainsHdlVoidPointer(self.value_type): + self.msgpack_in_value = ('PtrValue({}){}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_12 (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12b + if (ContainsHdlVoidPointer(self.value_type.replace('*', '')) \ + and self.value_type.count('*') == 1): + self.msgpack_in_value = '' + self.msgpack_out_value = ('*{} = reinterpret_cast<{}>(std::get<{}>(t));{}' + .format(self.value_name, + self.value_type.replace('*', ''), + self.cnt_out, + ' /* CheckAPIUse_WAY_12b (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_13 - e.g. 'bool* ret' + if self.value_type.replace('const ', '') in known_STANDARD_C_PTR_TYPES: + if self.value_type.count('*') == 1: + self.msgpack_in_value = ('*{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_13 (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = ('*{} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_13 (0005) */' if parent.options.debug else '')) + self.done = True + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPFunction (on CheckAPIUse_WAY_13)'.format(parent.function_complete)) + exit(1) + return + + # WARNING CONFIRMED_NO (14a 1) + # CheckAPIUse_WAY_14 + # If yes, handle enum - e.g. 'enum NAME value' or 'enum NAME* ret' + if CheckKnownEnum(self.value_type): + self.value_type = self.value_type.replace('enum ', '') + + # Add enum to used list (if not present) + check_value = self.value_type.replace('*', '').strip() + if check_value not in parent.group_data.used_enums: + parent.group_data.used_enums.append(check_value) + + # If normal value add to input + if not '*' in self.value_type: + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14a (0005) */' if parent.options.debug else '')) + elif '*' in self.value_type and self.value_type.count('*') == 1 and not 'const' in self.value_type: + self.msgpack_in_value = ('*{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_14b (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = ('*{} = std::get<{}>(t);{}' + .format(self.value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_14b (0005) */' if parent.options.debug else '')) + else: + print('FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPFunction (on CheckAPIUse_WAY_14)'.format(parent.function_complete)) + raise + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_15 + if self.value_type.startswith('struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::get<{}>(t).SetCStructure({});{}' + .format(self.cnt_out, + self.value_name, + ' /* CheckAPIUse_WAY_15 (0005) */' if parent.options.debug else '')) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_16 + if self.value_type.startswith('const struct ') and self.value_type.count('*') == 1 and parent.group_data.GenerateSharedStructure(self.value_type): + self.msgpack_in_value = ('{}{}' + .format(self.value_name, + ' /* CheckAPIUse_WAY_16 (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = '' + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_17 + if self.value_type.startswith('struct ') \ + and self.value_type.count('*') == 2 \ + and cnt_in+ignored_count < len(value_list)-1 \ + and 'size_t*' in value_list[cnt_in+ignored_count+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + ifc_struct_name = self.value_type.replace('*', '').replace('struct ', '') + self.msgpack_in_value = '' + self.msgpack_out_value = ('std::vector& ifc_{} = std::get<{}>(t);' + .format(ifc_struct_name, + self.value_name, + self.cnt_out)) + self.additional_code_4 = (' *{} = static_cast<{}>(malloc(sizeof({}) * ifc_{}.size()));{}\n' + .format(self.value_name, + self.value_type.replace('**', '*').replace('struct ', ''), + ifc_struct_name, + self.value_name, + ' /* CheckAPIUse_WAY_17 (0005) */' if parent.options.debug else '')) + self.additional_code_4 += (' for (size_t i = 0; i < ifc_{}.size(); ++i)\n' + .format(self.value_name)) + self.additional_code_4 += (' ifc_{}[i].SetCStructure(&(*{})[i]);\n' + .format(self.value_name, + self.value_name)) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_18 - For msgParent__IN/OUT_ on kodi-dev-kit/src/shared/api + if self.value_type.startswith('struct ') \ + and self.value_name.count('[]') == 1 \ + and 'size_t*' in value_list[cnt_in+1] \ + and parent.group_data.GenerateSharedStructure(self.value_type): + value_name = self.value_name.replace('[]', '') + ifc_value_type = 'IFC_{}'.format(self.value_type.replace('struct ', '')) + + self.additional_code_1 = (' std::vector<{}> ifc_{}(*{});{}\n' + .format(ifc_value_type, + value_name, + value_list[cnt_in+ignored_count+1].split()[-1].strip(), + ' /* CheckAPIUse_WAY_18 (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' for (size_t i = 0; i < *{}; ++i)\n' + .format(value_list[cnt_in+ignored_count+1].split()[-1].strip())) + self.additional_code_1 += (' {\n') + self.additional_code_1 += (' ifc_{}[i] = {}(&{}[i]);{}\n' + .format(value_name, + ifc_value_type, + value_name, + ' /* CheckAPIUse_WAY_18 (0005) */' if parent.options.debug else '')) + self.additional_code_1 += (' }\n') + self.msgpack_in_value = ('ifc_{}{}' + .format(value_name, + ' /* CheckAPIUse_WAY_18 (0005) */' if parent.options.debug else '')) + self.msgpack_out_value = ('std::vector<{}>& ifc_out_{} = std::get<{}>(t);{}' + .format(ifc_value_type, + value_name, + self.cnt_out, + ' /* CheckAPIUse_WAY_18 (0005) */' if parent.options.debug else '')) + self.additional_code_4 = (' for (size_t i = 0; i < *{}; ++i)\n' + .format(value_list[cnt_in+ignored_count+1].split()[-1].strip())) + self.additional_code_4 += (' {\n') + self.additional_code_4 += (' ifc_out_{}[i].SetCStructure(&{}[i]);\n' + .format(value_name, + value_name)) + self.additional_code_4 += (' }\n') + self.done = True + return + + self.done = False + + # Generate value string line to add in function + func_values = '' + current_value = 1 + for value in self.values: + func_values += value + (', ' if current_value < len(self.values) else '') + current_value += 1 + + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + target_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/interface/api/'.format(kodi_dir)).replace('.h', '.cpp') + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD={}'.format(self.funcname_ifc.upper())) + + code = ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + if code_work: + code += code_work + else: + code += 'void CHdl_kodi_{}::{}()\n'.format(self.header_group_id, self.funcname_ifc) + code += '{\n' + code += ' // This function is set by "OVERRIDE;USE_HAND_MAKE" and must be complete set here and other places by hand!!!\n' + code += '#warning Function "{}" must be complete set by hand.\n'.format(self.function_complete) + code += '}\n' + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + self.child_kodi_cpp_function_source = code + + + target_file = target_file.replace('.cpp', '.h') + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD={}'.format(self.funcname_ifc.upper())) + + code = ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + if code_work: + code += code_work + else: + code += ' void {}(); // This function is set by "OVERRIDE;USE_HAND_MAKE"!!!\n'.format(self.funcname_ifc) + code += ' /*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + self.child_kodi_cpp_function_header = code + + return True + + + # Check function contains in and/or out + haveIn = len(self.values) != 0 + haveOut = self.ContainsOutOnIn() or self.retval != 'void' + + # Generate the initial first part of function + code = '' + code += '{} CHdl_kodi_{}::{}({})\n'.format(self.retval, self.header_group_id, self.funcname_ifc, func_values) + code += '{\n' + code += ' // Original API call: {}\n'.format(self.function_complete) + if not self.group_data.override_use_direct_api_only: + code += ' // Tuple in: {}\n'.format(self.child_addon_c_lib_function_shared_tuple_in) + code += ' // Tuple out: {}\n'.format(self.child_addon_c_lib_function_shared_tuple_out) + code += '\n' + + if not self.group_data.override_use_direct_api_only: + code += '#ifndef KODI_INHIBIT_SHARED\n' + code += ' if (!m_interface.m_directDll)\n' + code += ' {\n' + # Check it have "in" and/or "return" values, if no go easy way and add the single line to code + if not haveIn and not haveOut: + code += ' m_process->SendMessage(funcGroup_{}, funcChild_{});\n'.format(self.header_group_id, self.funcname_ifc) + code += ' return;\n' + else: + code += ' msgpack::sbuffer in;\n' if haveIn else '' + code += ' msgpack::sbuffer out;\n' if haveOut else '' + + # If have input start to create his msgpack stream value + if haveIn: + cnt_in = 0 + cnt_out = 1 if self.retval != 'void' else 0 + ignored_cnt = 0 + + in_values = '' + out_values = '' + additional_code_1 = '' + additional_code_2 = '' + additional_code_3 = '' + additional_code_4 = '' + for value in self.values: + apiUse = CheckAPIUse(self, cnt_in, cnt_out, value, self.values, ignored_cnt) + cnt_in += 1 + + if apiUse.msgpack_in_value: + in_values += apiUse.msgpack_in_value + ', ' + if apiUse.msgpack_out_value: + cnt_out += 1 + out_values += ' {}\n'.format(apiUse.msgpack_out_value) + + if apiUse.additional_code_1: + code += apiUse.additional_code_1 + if apiUse.additional_code_2: + additional_code_2 += apiUse.additional_code_2 + if apiUse.additional_code_3: + additional_code_3 += apiUse.additional_code_3 + if apiUse.additional_code_4: + additional_code_4 += apiUse.additional_code_4 + + # Remove possible wrong added ', ' + while in_values.endswith(', '): + in_values = in_values[:-2] + if in_values != '': + code += ' msgpack::pack(in, msgChild__IN_{}({}));\n'.format(self.funcname_ifc, in_values) + else: + haveIn = False + + if haveIn and haveOut: + code += ' if (!m_process->SendMessage(funcGroup_{}, funcChild_{}, in, out))\n'.format(self.header_group_id, self.funcname_ifc) + code += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + elif haveIn and not haveOut: + code += ' m_process->SendMessage(funcGroup_{}, funcChild_{}, in);\n'.format(self.header_group_id, self.funcname_ifc) + code += ' return;\n' + else: + code += ' if (!m_process->SendMessageOnlyGetReturn(funcGroup_{}, funcChild_{}, out))\n'.format(self.header_group_id, self.funcname_ifc) + code += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + + if additional_code_2: + code += additional_code_2 + + if haveOut: + code += ' msgpack::unpacked ident = msgpack::unpack(out.data(), out.size());\n' + code += ' msgChild_OUT_' + self.funcname_ifc + ' t = ident.get().as();\n' + + if additional_code_3: + code += additional_code_3 + code += out_values + if additional_code_4: + code += additional_code_4 + + if self.retval == 'char*': + code += ' return strdup(std::get<0>(t).c_str());\n' + elif self.retval in known_STANDARD_C_TYPES: + code += ' return std::get<0>(t);\n' + elif CheckKnownEnum(self.retval) and not '*' in self.retval: + code += ' return std::get<0>(t);\n' + retval = self.retval.replace('enum ', '') + if retval not in self.group_data.used_enums: + self.group_data.used_enums.append(retval) + elif self.retval.replace('const ', '') == self.groupname.upper() + '_HDL' and self.retval.replace('const ', '') in known_VOID_PTR_DEFINES: + code += ' return reinterpret_cast<{}>(std::get<0>(t));\n'.format(self.retval.replace('const ', '')) + elif self.retval.replace('const ', '') in known_VOID_PTR_DEFINES: + code += ' return reinterpret_cast<{}>(std::get<0>(t));\n'.format(self.retval.replace('const ', '')) + elif self.retval != 'void': + code += ' return TODO\n' + print('FATAL: Not supported return value by "{}" on GenerateKodiSourceCPPFunction call!'.format(self.function_complete)) + #exit(1) + else: + code += ' return;\n' + code += ' }\n' + code += '#endif /* !KODI_INHIBIT_SHARED */\n' + code += '\n' + + self.child_kodi_cpp_function_header = ' {} {}({}); // Added with API {}\n'.format(self.retval, self.funcname_ifc, func_values, self.api_added) + + func_values = '' + current_value = 1 + for value in self.values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + value_name = value_name.split('[', 1)[0].strip() + else: + value_name = '' + value_type = '...' + continue + func_values += ', {}'.format(value_name) + current_value += 1 + + code += (' {}m_ifcToAddon->{}(m_ifcToAddon->thisClassHdl{});\n' + .format('return ' if self.retval != 'void' else '', + self.funcname_ifc, + func_values)) + code += '}\n' + + self.child_kodi_cpp_function_source = code + + return True + + def GenerateDevKitSourceCPPFunction(self, file_text): + class CheckAPIUse: + def __init__(self, parent, cnt, value, value_list): + self.parent = parent + self.cnt = cnt + self.value = value + self.set_call = '' + self.set_static = False + self.set_override = '' + self.additional_code_1 = '' + self.additional_code_2 = '' + self.additional_code_3 = '' + self.additional_code_4 = '' + self.ignore_next = False + self.return_value = '' + + self.value_name = value.split()[-1].strip() + self.value_type = value[:-len(self.value_name)].strip() + if '[' in self.value_name: + self.value_type += '[' + self.value_name.split('[', 1)[-1] + self.value_name = self.value_name.split('[', 1)[0].strip() + + self.done = False + + self.msgpack_in_value = '' + self.function_value = '' + self.msgpack_out_value = '' + + if value == '...': + self.value_name = '' + self.value_type = '...' + self.done = True + return + + if cnt == 0 \ + and (self.value_type.replace('const ', '') == self.parent.groupname.upper() + '_HDL') \ + and self.value_type.replace('const ', '') in known_VOID_PTR_DEFINES: + self.value_name = 'union_data->hdl' + self.done = True + return + + if not IsHighestUsedFunctionVersion(self.group_data.path, self.funcname, self.ifc_name_func, self.api_added): + return False + + target_file = (self.group_data.path.replace(self.search_dir, + '{}xbmc/addons/kodi-dev-kit/src/addon/api/' + .format(kodi_dir)).replace('.h', '.cpp')) + + values = [] + retval = '' + code_override = '' + if self.funcname == 'kodi_addon_create_instance': + code = Generate_kodi_addon_instance_construct(self.options) + + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + if code.create_code: + code_override += code.create_code + '\n' + else: + code_override += ' {} auto_gen_ret ={};\n'.format(retval, default_ret) if default_ret else '' + code_override += '#warning USE_HAND_MAKE set for function "{}" and must be set by hand.\n'.format(self.function_complete) + code_override += ' return auto_gen_ret;\n' if default_ret else '' + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + elif self.funcname == 'kodi_addon_destroy_instance': + code = Generate_kodi_addon_instance_construct(self.options) + + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + if code.destroy_code: + code_override += code.destroy_code + '\n' + else: + code_override += ' {} auto_gen_ret ={};\n'.format(retval, default_ret) if default_ret else '' + code_override += '#warning USE_HAND_MAKE set for function "{}" and must be set by hand.\n'.format(self.function_complete) + code_override += ' return auto_gen_ret;\n' if default_ret else '' + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + + if '---AUTO_GEN_PARSE---'.format(self.funcname_ifc) in file_text: + scan_file = self.group_data.path.replace(self.search_dir, '{}xbmc/addons/interface/api/'.format(kodi_dir)) + + file_text = CodeGetField_AUTO_GEN_PARSE(scan_file, 'HAND_EDITED_FIELD={}'.format(self.funcname_ifc.upper())) + file_text = ' '.join(file_text.replace('\n', ' ').split(';')[0].split()).replace('( ', '(') + m = re.search('(.*)[ \t](kodi.+?)(?=\()\((.*?)\)', file_text) + if m and m.group(1) and m.group(2) and m.group(3): + values = m.group(3).split(', ') + retval = m.group(1) + else: + print('FATAL: Failed to scan "{}" on GenerateToAddonDirectFuncTable').format(file_text) + raise + + print(scan_file) + print(file_text) + default_ret = GetDefaultReturn(retval, self.function_complete, file_text, scan_file) + + if not code_override: + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}_2'.format(self.funcname_ifc.upper())) + if code_work: + code_override += code_work + else: + code_override += ' {} auto_gen_ret ={};\n'.format(retval, default_ret) if default_ret else '' + code_override += '#warning USE_HAND_MAKE set for function "{}" and must be set by hand.\n'.format(self.function_complete) + code_override += ' return auto_gen_ret;\n' if default_ret else '' + code_override += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper()) + else: + values = self.values + retval = self.retval + + func_values = '' + current_value = 1 + for value in values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + else: + value_name = '' + value_type = '...' + + func_values += value_type + (', ' if current_value < len(values) else '') + current_value += 1 + + void_ptr_value_name = values[0].split()[-1] + + lowest_api = GetLowestUsedAPI() + highest_api = GetHighestUsedAPI() + + cnt_in = 0 + value_names = [] + for value in values: + apiUse = CheckAPIUse(self, cnt_in, value, values) + cnt_in += 1 + + if apiUse.value_name: + value_names.append(apiUse.value_name) + + code = ('{} CHdl_kodi_{}::{}(void* thisClassHdl{}{}) // Added with API {}\n' + .format(retval, + self.header_group_id, + self.funcname_ifc, + ', ' if len(values) > 0 else '', + ', '.join(values), + self.api_added)) + code += '{\n' + code += ' auto thisClass = reinterpret_cast<' + 'CHdl_kodi_{}*>(thisClassHdl);\n'.format(self.header_group_id) + code += ' if (thisClass == nullptr)\n' + code += ' return{};\n'.format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + code += '\n' + if code_override: + code += code_override + else: + default_ret = GetDefaultReturn(retval, self.function_complete, file_text) + + + code += ' UnionAddonFunctions* union_data = reinterpret_cast({});\n'.format(void_ptr_value_name) + code += ' {} auto_gen_ret ={};\n'.format(self.retval, default_ret) if default_ret else '' + + #checker = self.group_data.CheckToAddonFunctionAPI(self.group_data, self.groupname, self.ifc_name_func) + if self.ifc_name_func in self.group_data.functions_equal_everywhere: + code += ' if (union_data->types.{}.v{}.{})\n'.format(self.groupname, 1, self.ifc_name_func) + code += ' {\n' + code += (' {}union_data->types.{}.v{}.{}({});\n' + .format('auto_gen_ret = ' if default_ret else '', + self.groupname, + 1, + self.ifc_name_func, + ', '.join(value_names))) + code += ' }\n' + else: + code += ' switch (AddonIfc::g_ifc->api)\n' + code += ' {\n' + auto_gen_parse_added = False + for i in range(highest_api, lowest_api, -1): + api = i + + if api > self.api_added: + code += ' case __KODI_API_{}__:\n'.format(api) + elif api == self.api_added: + code += ' case __KODI_API_{}__:\n'.format(api) + code += ' {\n' + code += ' if (union_data->types.{}.v{}.{})\n'.format(self.groupname, api, self.ifc_name_func) + code += ' {\n' + code += (' {}union_data->types.{}.v{}.{}({});\n' + .format('auto_gen_ret = ' if default_ret else '', + self.groupname, + api, + self.ifc_name_func, + ', '.join(value_names))) + code += ' }\n' + code += ' break;\n' + code += ' }\n' + elif not auto_gen_parse_added: + auto_gen_parse_added = True + for i in range(self.api_added-1, lowest_api-1, -1): + code += ' case __KODI_API_{}__:\n'.format(i) + if not IsLowerToUsedFunctionVersion(self.group_data.path, self.funcname, self.ifc_name_func, i): + code += ' {\n' + code += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper(), i) + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, 'HAND_EDITED_FIELD_{}_API_{}_BACKWARD'.format(self.funcname_ifc.upper(), i)) + if code_work: + code += code_work + else: + code += '\n#warning USE_HAND_MAKE set for function and must be set by hand for backward compatibility.\n\n' + code += '/*---AUTO_GEN_PARSE---*/\n'.format(self.funcname_ifc.upper(), i) + code += ' break;\n' + code += ' }\n' + code += ' default:\n' + code += ' break;\n' + code += ' }\n' + code += ' return auto_gen_ret;\n' if default_ret else '' + code += '}\n' + + self.dev_kit_kodi_to_addon_source = code + self.dev_kit_kodi_to_addon_header = (' static {} {}(void* thisClassHdl{}{}); // Added with API {}\n' + .format(retval, + self.funcname_ifc, + ', ' if len(values) > 0 else '', + ', '.join(values), + self.api_added)) + + for entry in self.callbacks: + if entry.api_call == self.funcname_ifc and not entry.header in self.group_data.kodi_ifc_includes: + self.group_data.kodi_ifc_includes.append(entry.header) + + return True + + def IsToAddonFunctionEqualToAllAPI(self): + return True + + +#=============================================================================== + +def interface_code_generator(options, callbacks): + """ + This function generate automatic code and store in list for further use + """ + print(' - Scanning interface to autogenerate code') + + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + scan_dir = search_dir + '**/' + + with open('./ignored_api_structs.txt') as f: + file_text = f.read() + f.close() + for line in file_text.splitlines(): + if line: + ignored_structs.append(line) + + print(scan_dir) + + ret = [] + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=True)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + header_group_id = TranslatePathToCUsableString(src_part, search_dir) + + with open(src_part) as f: + file_text = f.read() + f.close() + + group_data = GroupData(callbacks, options) + group_data.header_group_id = header_group_id + group_data.path = src_part + group_data.GenerateIndependentAPIStructs() + + if '---AUTO_GEN_PARSE---' in file_text: + group_data.override_use_direct_api_only = True + + function_addon = '' + function_kodi = '' + for line in file_text.splitlines(): + if 'ATTR_DLL_EXPORT' in line \ + and not '#define' in line: + line = line.strip() + if line.startswith('//') or line.startswith('/*'): + continue + function_addon = line; + elif function_addon != '': + function_addon += line; + if function_addon != '' and ';' in line: + data = InterfaceDataParent(callbacks, options) + + function_addon = " ".join(function_addon.split()) + + data.header_group_id = header_group_id + data.function_complete = function_addon + data.group_data = group_data + + if not data.RegexScanFunction(function_addon) or \ + IsIgnoredFunction(data.funcname) or \ + not data.GenerateSharedTuples(file_text) or \ + not data.GenerateToKodiDirectFuncTable(file_text) or \ + not data.GenerateAddonSourceCFunction(file_text) or \ + not data.GenerateKodiSourceCPPFunction(file_text) or \ + not data.GenerateKodiSourceCPPSwitchCase(file_text): + function_addon = ''; + continue + + group_data.interface_data_to_kodi.append(data) + function_addon = ''; + + if 'ATTR_APIENTRYP' in line \ + and not line.strip().startswith('#'): + function_kodi = line; + elif function_kodi != '': + function_kodi += line; + if function_kodi != '' and ';' in line: + data = InterfaceDataChild(callbacks, options) + + function_kodi = " ".join(function_kodi.split()) + + data.header_group_id = header_group_id + data.function_complete = function_kodi + data.group_data = group_data + + if not data.RegexScanFunction(function_kodi, file_text) or \ + IsIgnoredFunction(data.funcname) or \ + not data.GenerateSharedTuples(file_text) or \ + not data.GenerateToAddonDirectFuncTable(file_text) or \ + not data.GenerateDevKitSourceCPPFunction(file_text) or \ + not data.GenerateKodiSourceCPPFunction(file_text) or \ + not data.GenerateAddonSourceSwitchCase(file_text): + #not data.GenerateAddonSourceCFunction() or \ + #not data.GenerateKodiSourceCPPFunction() or \ + function_kodi = ''; + continue + + group_data.interface_data_to_addon.append(data) + function_kodi = ''; + + ret.append(group_data) + + + #confirmed = [ 'kodi_network_get_user_agent' ] + for group in ret: + #if group.header_group_id != 'addoninstance_imagedecoder_h': + #continue + #for entry in group.interface_data_to_kodi: + #if entry.funcname in confirmed: + #continue + #print('\n\n=======================================================================================') + #print(entry.funcname) + #print('---------------------------------------------------------------------------------------') + #print('| parent_addon_c_lib_function_shared\n\n') + #print(entry.parent_addon_c_lib_function_shared) + #print('---------------------------------------------------------------------------------------') + #print('| parent_addon_c_lib_function_shared_tuple_...\n\n') + #print(entry.parent_addon_c_lib_function_shared_tuple_in) + #print(entry.parent_addon_c_lib_function_shared_tuple_out) + #print('---------------------------------------------------------------------------------------') + #print('| parent_addon_c_lib_function_direct\n\n') + #print(entry.parent_addon_c_lib_function_direct) + #print('---------------------------------------------------------------------------------------') + #print('| parent_addon_c_lib_function_direct_ptr\n\n') + #print(entry.parent_addon_c_lib_function_direct_ptr) + #print('---------------------------------------------------------------------------------------') + #print('| parent_kodi_cpp_function_switch_case\n\n') + #print(entry.parent_kodi_cpp_function_switch_case) + #print('---------------------------------------------------------------------------------------') + #print('| parent_kodi_cpp_function_source\n\n') + #print(entry.parent_kodi_cpp_function_source) + #print('---------------------------------------------------------------------------------------') + #print('| parent_kodi_cpp_function_header\n\n') + #print(entry.parent_kodi_cpp_function_header) + #print('##') + + #print('---------------------------------------------------------------------------------------') + #print('| shared_structures...\n\n') + #for struct in group.shared_structures: + #print(struct[1]) + + #print('=======================================================================================') + group.Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(True) + #print('=======================================================================================') + group.Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_CPP(True) + #print('=======================================================================================') + group.Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_H(True) + #print('=======================================================================================') + group.Generate__xbmc_addons_interface_api_ALL_FILES_CPP(True) + #print('=======================================================================================') + group.Generate__xbmc_addons_interface_api_ALL_FILES_H(True) + #print('=======================================================================================') + group.Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES_additional(True) + + #def GetSharedTuples(self): HAND_EDIT_ALLOW + #def GetAddonCLibFunctionsShared(self): HAND_EDIT_ALLOW + #def GetAddonCLibFunctionsDirect(self): + #def GetAddonCLibFunctionsDirectPtr(self): + #def GetKodiSwitchCase(self): HAND_EDIT_ALLOW + #def GetKodiSourcePart(self): + #def GetKodiParentHeaderPart(self): + #group.GetKodiParentEnumList() + + return ret diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/library_dl_generator.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/library_dl_generator.py new file mode 100644 index 0000000000000..dc592054a89e6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/library_dl_generator.py @@ -0,0 +1,252 @@ +from code_generator import * +from .sub_file_hdl import * +from .helpers import * + +from hashlib import sha256 + +import glob +import os +import re +import filecmp +import shutil + +class LibraryDLGenerator: + def __init__(self, options, api): + self.options = options + self.api = api + self.api_list_code = [] + self.api_list_typedef = [] + self.api_list_struct = [] + + def Generate(self): + search_dir = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/'.format(kodi_dir) + scan_dir = search_dir + '/**/' + + highest_found_api = 0 + + includes_h = '' + includes_c = '' + structs = '' + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(search_dir, '') + + src_parts = sorted(glob.glob(dir + '*.h', recursive=True)) + for src_part in src_parts: + if not FileContainsInterfaceAPICalls(src_part): + continue + + api_list_typedef = [] + api_list_struct = [] + api_list_code = [] + with open(src_part) as f: + file_text = f.read() + f.close() + + function_addon = '' + for line in file_text.splitlines(): + if 'ATTR_DLL_EXPORT' in line \ + and not '#define' in line: + line = line.strip() + if line.startswith('//') or line.startswith('/*'): + continue + function_addon = line; + elif function_addon != '': + function_addon += line; + if function_addon != '' and ';' in line: + function_addon = " ".join(function_addon.split()) + + scanner = RegexScanExport(function_addon, self.options) + scanner.ScanFunction() + + if scanner.api_added > highest_found_api: + highest_found_api = scanner.api_added; + + if scanner.api_added > self.api: + function_addon = ''; + continue + if scanner.api_removed != -1 and scanner.api_removed <= self.api: + function_addon = ''; + continue + + if scanner.api_added > highest_found_api: + highest_found_api = scanner.api_added; + + func_values = '' + current_value = 1 + for value in scanner.values: + if value != '...': + value_name = value.split()[-1].strip() + value_type = value[:-len(value_name)].strip() + if '[' in value_name: + value_type += '[' + value_name.split('[', 1)[-1] + + include = '#include "../{}"\n'.format(src_part.replace(search_dir, '')) + check_type = value_type.replace('*', '').replace('[]', '').replace('const', '').strip() + if not check_type in known_STANDARD_C_TYPES \ + and check_type != 'char' \ + and check_type != 'void': + if 'struct ' in value_type: + struct = '{};\n'.format(check_type) + if not struct in structs: + structs += struct + else: + if not include in includes_h: + includes_h += include + else: + value_name = '' + value_type = '...' + + func_values += value_type + (', ' if current_value < len(scanner.values) else '') + current_value += 1 + + include = '#include "../{}"\n'.format(src_part.replace(search_dir, '')) + check_type = scanner.retval.replace('*', '').replace('[]', '').replace('const', '').strip() + if not check_type in known_STANDARD_C_TYPES \ + and check_type != 'char' \ + and check_type != 'void': + if 'struct ' in scanner.retval: + struct = '{};\n'.format(check_type) + if not struct in structs: + structs += struct + else: + if not include in includes_h: + includes_h += include + include_c = include.replace('"../', '"include/kodi/c-api/') + if not include_c in includes_c and not include in includes_h: + includes_c += include_c + + entry = (' api->{} = &{};' + .format(scanner.funcname, + scanner.funcname)) + api_list_code.append(entry) + + entry = ('typedef {}(ATTR_DL_APIENTRYP PFN_{}_V{})({});' + .format(scanner.retval, + scanner.funcname.upper(), + scanner.api_added, + func_values)) + api_list_typedef.append(entry) + + entry = ('PFN_{}_V{} {};' + .format(scanner.funcname.upper(), + scanner.api_added, + scanner.funcname)) + api_list_struct.append(entry) + function_addon = ''; + continue + + if api_list_struct and api_list_typedef: + self.api_list_typedef.append('// {}'.format(src_part.replace(search_dir, ''))) + self.api_list_typedef += sorted(api_list_typedef) + self.api_list_typedef.append('') + + self.api_list_struct.append('// {}'.format(src_part.replace(search_dir, ''))) + self.api_list_struct += sorted(api_list_struct) + self.api_list_struct.append('') + + self.api_list_code.append(' // {}'.format(src_part.replace(search_dir, ''))) + self.api_list_code += sorted(api_list_code) + self.api_list_code.append('') + + code_part = '' + for entry in self.api_list_typedef: + code_part += ' {}\n'.format(entry) + code_part += ' struct kodi_api_{}\n'.format(self.api) + code_part += ' {\n' + for entry in self.api_list_struct: + code_part += ' {}\n'.format(entry) + code_part += ' };\n' + + hashedWord = sha256(code_part.encode('utf-8')).hexdigest() + + code_h = header_file_copyright + code_h += '\n' + code_h += '/* API_HASH<{}> */\n'.format(hashedWord) + code_h += '\n' + code_h += '#ifndef C_API_DL_API_{}_H\n'.format(self.api) + code_h += '#define C_API_DL_API_{}_H\n'.format(self.api) + code_h += '\n' + code_h += '#include "../addon_base.h"\n' + code_h += includes_h + code_h += '\n' + code_h += '#ifndef ATTR_DL_APIENTRYP\n' + code_h += '#define ATTR_DL_APIENTRYP ATTR_APIENTRYP\n' + code_h += '#endif\n' + code_h += '\n' + code_h += '#ifndef ATTR_DL_DLL_EXPORT\n' + code_h += '#define ATTR_DL_DLL_EXPORT ATTR_DLL_EXPORT\n' + code_h += '#endif\n' + code_h += '\n' + code_h += '#ifdef __cplusplus\n' + code_h += 'extern "C"\n' + code_h += '{\n' + code_h += '#endif /* __cplusplus */\n' + code_h += '\n' + code_h += ' struct kodi_api_{};\n'.format(self.api) + code_h += '\n' + code_h += ' ATTR_DL_DLL_EXPORT bool load_kodi_api_{}(struct kodi_api_{}* api);\n'.format(self.api, self.api) + code_h += '\n' + code_h += structs + code_h += '\n' + code_h += code_part + code_h += '\n' + code_h += '#ifdef __cplusplus\n' + code_h += '} /* extern "C" */\n' + code_h += '#endif /* __cplusplus */\n' + code_h += '\n' + code_h += '#endif /* C_API_DL_API_{}_H */\n'.format(self.api) + + temp_file = './tmp/tmp-auto-gen.h' + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + f = open(temp_file, "w") + f.write(code_h) + f.close() + + os.system('clang-format -style=file -i ' + temp_file) + + target_file = '{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_{}.h'.format(kodi_dir, self.api) + if self.options.force \ + or not os.path.isfile(target_file) \ + or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + code_c = header_file_copyright + code_c += '\n' + code_c += '/* API_HASH<{}> */\n'.format(hashedWord) + code_c += '\n' + code_c += '#include "../../../../include/kodi/c-api/dl/kodi_api_{}.h"\n'.format(self.api) + code_c += '\n' + code_c += includes_c + code_c += '\n' + code_c += 'ATTR_DL_DLL_EXPORT bool load_kodi_api_{}(struct kodi_api_{}* api)\n'.format(self.api, self.api) + code_c += '{\n' + code_c += ' if (api == NULL)\n' + code_c += ' {\n' + code_c += ' return false;\n' + code_c += ' }\n' + code_c += '\n' + code_c += '\n'.join(self.api_list_code) + code_c += '\n' + code_c += ' return true;\n' + code_c += '}\n' + + temp_file = './tmp/tmp-auto-gen.c' + os.makedirs(os.path.dirname(temp_file), exist_ok=True) + f = open(temp_file, "w") + f.write(code_c) + f.close() + + os.system('clang-format -style=file -i ' + temp_file) + + target_file = '{}xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_{}.c'.format(kodi_dir, self.api) + if self.options.force \ + or not os.path.isfile(target_file) \ + or not filecmp.cmp(target_file, temp_file): + print(' - Updating ' + target_file) + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + + return True if highest_found_api > self.api else False diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/sub_file_hdl.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/sub_file_hdl.py new file mode 100644 index 0000000000000..f8481d1f81078 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/sub_file_hdl.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +def read_file(name, normalize=True): + """ Read a file. """ + try: + with open(name, 'r', encoding='utf-8') as f: + # read the data + data = f.read() + if normalize: + # normalize line endings + data = data.replace("\r\n", "\n") + return data + except IOError as e: + (errno, strerror) = e.args + sys.stderr.write('Failed to read file ' + name + ': ' + strerror) + raise + +def write_file(name, data): + """ Write a file. """ + try: + with open(name, 'w', encoding='utf-8') as f: + # write the data + if sys.version_info.major == 2: + f.write(data.decode('utf-8')) + else: + f.write(data) + except IOError as e: + (errno, strerror) = e.args + sys.stderr.write('Failed to write file ' + name + ': ' + strerror) + raise diff --git a/xbmc/cdrip/Encoder.cpp b/xbmc/cdrip/Encoder.cpp index 02c08af60ec1d..fc8fa08de8820 100644 --- a/xbmc/cdrip/Encoder.cpp +++ b/xbmc/cdrip/Encoder.cpp @@ -63,10 +63,11 @@ bool CEncoder::Init(const char* strFile, int iInChannels, int iInRate, int iInBi return false; } - AddonToKodiFuncTable_AudioEncoder callbacks; + AudioEncoderCB callbacks; callbacks.kodiInstance = this; callbacks.write = WriteCallback; callbacks.seek = SeekCallback; + return m_impl->Init(callbacks); } diff --git a/xbmc/cdrip/EncoderFFmpeg.cpp b/xbmc/cdrip/EncoderFFmpeg.cpp index e82c16d8b36a3..a3e42abfdeb21 100644 --- a/xbmc/cdrip/EncoderFFmpeg.cpp +++ b/xbmc/cdrip/EncoderFFmpeg.cpp @@ -43,7 +43,7 @@ CEncoderFFmpeg::CEncoderFFmpeg() memset(&m_callbacks, 0, sizeof(m_callbacks)); } -bool CEncoderFFmpeg::Init(AddonToKodiFuncTable_AudioEncoder& callbacks) +bool CEncoderFFmpeg::Init(AudioEncoderCB& callbacks) { if (!callbacks.kodiInstance || !callbacks.write || !callbacks.seek) return false; diff --git a/xbmc/cdrip/EncoderFFmpeg.h b/xbmc/cdrip/EncoderFFmpeg.h index 8c6d092191a35..b7160a40e5d00 100644 --- a/xbmc/cdrip/EncoderFFmpeg.h +++ b/xbmc/cdrip/EncoderFFmpeg.h @@ -22,7 +22,7 @@ class CEncoderFFmpeg : public IEncoder CEncoderFFmpeg(); ~CEncoderFFmpeg() override = default; - bool Init(AddonToKodiFuncTable_AudioEncoder& callbacks) override; + bool Init(AudioEncoderCB& callbacks) override; int Encode(int nNumBytesRead, uint8_t *pbtStream) override; bool Close() override; private: @@ -54,7 +54,7 @@ class CEncoderFFmpeg : public IEncoder AVFrame *m_ResampledFrame; bool m_NeedConversion = false; - AddonToKodiFuncTable_AudioEncoder m_callbacks; + AudioEncoderCB m_callbacks; bool WriteFrame(); }; diff --git a/xbmc/cdrip/IEncoder.h b/xbmc/cdrip/IEncoder.h index 69e28a511cc7d..bc8f0bc9c6b7c 100644 --- a/xbmc/cdrip/IEncoder.h +++ b/xbmc/cdrip/IEncoder.h @@ -8,16 +8,21 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h" - #include #include +typedef struct AudioEncoderCB +{ + void* kodiInstance; + int (*write)(void* kodiInstance, const uint8_t* data, int len); + int64_t (*seek)(void* kodiInstance, int64_t pos, int whence); +} AudioEncoderCB; + class IEncoder { public: virtual ~IEncoder() = default; - virtual bool Init(AddonToKodiFuncTable_AudioEncoder& callbacks) = 0; + virtual bool Init(AudioEncoderCB& callbacks) = 0; virtual int Encode(int nNumBytesRead, uint8_t* pbtStream) = 0; virtual bool Close() = 0; diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp index ecc4c6af3a9a7..4dda320500cac 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp @@ -8,6 +8,7 @@ #include "AddonVideoCodec.h" +#include "addons/interface/api/addon-instance/videocodec.h" #include "cores/VideoPlayer/Buffers/VideoBuffer.h" #include "cores/VideoPlayer/DVDCodecs/DVDCodecs.h" #include "cores/VideoPlayer/DVDStreamInfo.h" @@ -19,18 +20,9 @@ CAddonVideoCodec::CAddonVideoCodec(CProcessInfo& processInfo, ADDON::AddonInfoPtr& addonInfo, KODI_HANDLE parentInstance) : CDVDVideoCodec(processInfo), - IAddonInstanceHandler(ADDON_INSTANCE_VIDEOCODEC, addonInfo, parentInstance), - m_codecFlags(0), - m_displayAspect(0.0f) + IAddonInstanceHandler(ADDON_INSTANCE_VIDEOCODEC, addonInfo, parentInstance) { - m_struct.props = new AddonProps_VideoCodec(); - m_struct.toAddon = new KodiToAddonFuncTable_VideoCodec(); - m_struct.toKodi = new AddonToKodiFuncTable_VideoCodec(); - - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->get_frame_buffer = get_frame_buffer; - m_struct.toKodi->release_frame_buffer = release_frame_buffer; - if (CreateInstance(&m_struct) != ADDON_STATUS_OK || !m_struct.toAddon->open) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) { CLog::Log(LOGERROR, "CInputStreamAddon: Failed to create add-on instance for '{}'", addonInfo->ID()); @@ -43,17 +35,12 @@ CAddonVideoCodec::~CAddonVideoCodec() //free remaining buffers Reset(); - DestroyInstance(); - - // Delete "C" interface structures - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; + DestroyInstance(m_addonInstance); } bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamInfo &hints) { - initData.codecProfile = STREAMCODEC_PROFILE::CodecProfileNotNeeded; + initData.codec_profile = STREAMCODEC_PROFILE::CodecProfileNotNeeded; switch (hints.codec) { case AV_CODEC_ID_H264: @@ -62,28 +49,28 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI { case 0: case FF_PROFILE_UNKNOWN: - initData.codecProfile = STREAMCODEC_PROFILE::CodecProfileUnknown; + initData.codec_profile = STREAMCODEC_PROFILE::CodecProfileUnknown; break; case FF_PROFILE_H264_BASELINE: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileBaseline; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileBaseline; break; case FF_PROFILE_H264_MAIN: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileMain; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileMain; break; case FF_PROFILE_H264_EXTENDED: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileExtended; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileExtended; break; case FF_PROFILE_H264_HIGH: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileHigh; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileHigh; break; case FF_PROFILE_H264_HIGH_10: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileHigh10; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileHigh10; break; case FF_PROFILE_H264_HIGH_422: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileHigh422; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileHigh422; break; case FF_PROFILE_H264_HIGH_444_PREDICTIVE: - initData.codecProfile = STREAMCODEC_PROFILE::H264CodecProfileHigh444Predictive; + initData.codec_profile = STREAMCODEC_PROFILE::H264CodecProfileHigh444Predictive; break; default: return false; @@ -97,19 +84,19 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI switch (hints.profile) { case FF_PROFILE_UNKNOWN: - initData.codecProfile = STREAMCODEC_PROFILE::CodecProfileUnknown; + initData.codec_profile = STREAMCODEC_PROFILE::CodecProfileUnknown; break; case FF_PROFILE_VP9_0: - initData.codecProfile = STREAMCODEC_PROFILE::VP9CodecProfile0; + initData.codec_profile = STREAMCODEC_PROFILE::VP9CodecProfile0; break; case FF_PROFILE_VP9_1: - initData.codecProfile = STREAMCODEC_PROFILE::VP9CodecProfile1; + initData.codec_profile = STREAMCODEC_PROFILE::VP9CodecProfile1; break; case FF_PROFILE_VP9_2: - initData.codecProfile = STREAMCODEC_PROFILE::VP9CodecProfile2; + initData.codec_profile = STREAMCODEC_PROFILE::VP9CodecProfile2; break; case FF_PROFILE_VP9_3: - initData.codecProfile = STREAMCODEC_PROFILE::VP9CodecProfile3; + initData.codec_profile = STREAMCODEC_PROFILE::VP9CodecProfile3; break; default: return false; @@ -123,30 +110,30 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI switch (hints.cryptoSession->keySystem) { case CRYPTO_SESSION_SYSTEM_NONE: - initData.cryptoSession.keySystem = STREAM_CRYPTO_KEY_SYSTEM_NONE; + initData.crypto_session.keySystem = STREAM_CRYPTO_KEY_SYSTEM_NONE; break; case CRYPTO_SESSION_SYSTEM_WIDEVINE: - initData.cryptoSession.keySystem = STREAM_CRYPTO_KEY_SYSTEM_WIDEVINE; + initData.crypto_session.keySystem = STREAM_CRYPTO_KEY_SYSTEM_WIDEVINE; break; case CRYPTO_SESSION_SYSTEM_PLAYREADY: - initData.cryptoSession.keySystem = STREAM_CRYPTO_KEY_SYSTEM_PLAYREADY; + initData.crypto_session.keySystem = STREAM_CRYPTO_KEY_SYSTEM_PLAYREADY; break; case CRYPTO_SESSION_SYSTEM_WISEPLAY: - initData.cryptoSession.keySystem = STREAM_CRYPTO_KEY_SYSTEM_WISEPLAY; + initData.crypto_session.keySystem = STREAM_CRYPTO_KEY_SYSTEM_WISEPLAY; break; default: return false; } - strncpy(initData.cryptoSession.sessionId, hints.cryptoSession->sessionId.c_str(), - sizeof(initData.cryptoSession.sessionId) - 1); + strncpy(initData.crypto_session.sessionId, hints.cryptoSession->sessionId.c_str(), + sizeof(initData.crypto_session.sessionId) - 1); } - initData.extraData = reinterpret_cast(hints.extradata); - initData.extraDataSize = hints.extrasize; + initData.extra_data = reinterpret_cast(hints.extradata); + initData.extra_data_size = hints.extrasize; initData.width = hints.width; initData.height = hints.height; - initData.videoFormats = m_formats; + initData.video_formats = m_formats; m_displayAspect = (hints.aspect > 0.0 && !hints.forced_aspect) ? static_cast(hints.aspect) : 0.0f; m_width = hints.width; @@ -162,9 +149,6 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - if (!m_struct.toAddon->open) - return false; - unsigned int nformats(0); m_formats[nformats++] = VIDEOCODEC_FORMAT_YV12; m_formats[nformats] = VIDEOCODEC_FORMAT_UNKNOWN; @@ -173,7 +157,7 @@ bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) if (!CopyToInitData(initData, hints)) return false; - bool ret = m_struct.toAddon->open(&m_struct, &initData); + bool ret = m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_open_v1(m_addonInstance, &initData); m_processInfo.SetVideoDecoderName(GetName(), false); return ret; @@ -181,34 +165,25 @@ bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) bool CAddonVideoCodec::Reconfigure(CDVDStreamInfo &hints) { - if (!m_struct.toAddon->reconfigure) - return false; - VIDEOCODEC_INITDATA initData; if (!CopyToInitData(initData, hints)) return false; - return m_struct.toAddon->reconfigure(&m_struct, &initData); + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_reconfigure_v1(m_addonInstance, &initData); } bool CAddonVideoCodec::AddData(const DemuxPacket &packet) { - if (!m_struct.toAddon->add_data) - return false; - - return m_struct.toAddon->add_data(&m_struct, &packet); + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_add_data_v1(m_addonInstance, &packet); } CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPicture) { - if (!m_struct.toAddon->get_picture) - return CDVDVideoCodec::VC_ERROR; - VIDEOCODEC_PICTURE picture; picture.flags = (m_codecFlags & DVD_CODEC_CTRL_DRAIN) ? VIDEOCODEC_PICTURE_FLAG_DRAIN : VIDEOCODEC_PICTURE_FLAG_DROP; - switch (m_struct.toAddon->get_picture(&m_struct, &picture)) + switch (m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_picture_v1(m_addonInstance, &picture)) { case VIDEOCODEC_RETVAL::VC_NONE: return CDVDVideoCodec::VC_NONE; @@ -245,15 +220,15 @@ CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPictur if (pVideoPicture->videoBuffer) pVideoPicture->videoBuffer->Release(); - pVideoPicture->videoBuffer = static_cast(picture.videoBufferHandle); + pVideoPicture->videoBuffer = static_cast(picture.video_buffer_handle); - int strides[YuvImage::MAX_PLANES], planeOffsets[YuvImage::MAX_PLANES]; + int strides[YuvImage::MAX_PLANES], plane_offsets[YuvImage::MAX_PLANES]; for (int i = 0; ivideoBuffer->SetDimensions(picture.width, picture.height, strides, planeOffsets); + pVideoPicture->videoBuffer->SetDimensions(picture.width, picture.height, strides, plane_offsets); pVideoPicture->iDisplayWidth = pVideoPicture->iWidth; pVideoPicture->iDisplayHeight = pVideoPicture->iHeight; @@ -272,8 +247,8 @@ CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPictur "offset:{},{},{}, stride:{},{},{}", picture.pts, pVideoPicture->iWidth, pVideoPicture->iHeight, pVideoPicture->iDisplayWidth, pVideoPicture->iDisplayHeight, m_displayAspect, - fmt::ptr(picture.decodedData), picture.decodedDataSize, picture.planeOffsets[0], - picture.planeOffsets[1], picture.planeOffsets[2], picture.stride[0], + fmt::ptr(picture.decoded_data), picture.decoded_data_size, picture.plane_offsets[0], + picture.plane_offsets[1], picture.plane_offsets[2], picture.stride[0], picture.stride[1], picture.stride[2]); if (picture.width != m_width || picture.height != m_height) @@ -294,9 +269,7 @@ CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPictur const char* CAddonVideoCodec::GetName() { - if (m_struct.toAddon->get_name) - return m_struct.toAddon->get_name(&m_struct); - return ""; + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_name_v1(m_addonInstance); } void CAddonVideoCodec::Reset() @@ -310,53 +283,36 @@ void CAddonVideoCodec::Reset() picture.flags = VIDEOCODEC_PICTURE_FLAG_DRAIN; VIDEOCODEC_RETVAL ret; - while ((ret = m_struct.toAddon->get_picture(&m_struct, &picture)) != VIDEOCODEC_RETVAL::VC_EOF) + while ((ret = m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_picture_v1(m_addonInstance, &picture)) != VIDEOCODEC_RETVAL::VC_EOF) { if (ret == VIDEOCODEC_RETVAL::VC_PICTURE) { - videoBuffer = static_cast(picture.videoBufferHandle); + videoBuffer = static_cast(picture.video_buffer_handle); if (videoBuffer) videoBuffer->Release(); } } - if (m_struct.toAddon->reset) - m_struct.toAddon->reset(&m_struct); + m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_reset_v1(m_addonInstance); } -bool CAddonVideoCodec::GetFrameBuffer(VIDEOCODEC_PICTURE &picture) +/********************* ADDON-TO-KODI **********************/ + +bool CAddonVideoCodec::GetFrameBuffer(VIDEOCODEC_PICTURE* picture) { - CVideoBuffer *videoBuffer = m_processInfo.GetVideoBufferManager().Get(AV_PIX_FMT_YUV420P, picture.decodedDataSize, nullptr); + CVideoBuffer *videoBuffer = m_processInfo.GetVideoBufferManager().Get(AV_PIX_FMT_YUV420P, picture->decoded_data_size, nullptr); if (!videoBuffer) { CLog::Log(LOGERROR,"CAddonVideoCodec::GetFrameBuffer Failed to allocate buffer"); return false; } - picture.decodedData = videoBuffer->GetMemPtr(); - picture.videoBufferHandle = videoBuffer; + picture->decoded_data = videoBuffer->GetMemPtr(); + picture->video_buffer_handle = videoBuffer; return true; } -void CAddonVideoCodec::ReleaseFrameBuffer(KODI_HANDLE videoBufferHandle) +void CAddonVideoCodec::ReleaseFrameBuffer(KODI_HANDLE video_buffer_handle) { - if (videoBufferHandle) - static_cast(videoBufferHandle)->Release(); -} - -/********************* ADDON-TO-KODI **********************/ - -bool CAddonVideoCodec::get_frame_buffer(void* kodiInstance, VIDEOCODEC_PICTURE *picture) -{ - if (!kodiInstance) - return false; - - return static_cast(kodiInstance)->GetFrameBuffer(*picture); -} - -void CAddonVideoCodec::release_frame_buffer(void* kodiInstance, KODI_HANDLE videoBufferHandle) -{ - if (!kodiInstance) - return; - - static_cast(kodiInstance)->ReleaseFrameBuffer(videoBufferHandle); + if (video_buffer_handle) + static_cast(video_buffer_handle)->Release(); } diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h index b746b7cbbca98..d925f7dc91049 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h @@ -10,14 +10,14 @@ #include "DVDVideoCodec.h" #include "addons/AddonProvider.h" -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h" +#include "addons/interface/InstanceHandler.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h" class BufferPool; class CAddonVideoCodec : public CDVDVideoCodec - , public ADDON::IAddonInstanceHandler + , public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: CAddonVideoCodec(CProcessInfo& processInfo, @@ -33,23 +33,22 @@ class CAddonVideoCodec const char* GetName() override; void SetCodecControl(int flags) override { m_codecFlags = flags; } -private: - bool CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamInfo &hints); - /*! * @brief All picture members can be expected to be set correctly except decodedData and pts. * GetFrameBuffer has to set decodedData to a valid memory adress and return true. * In case buffer allocation fails, return false. */ - bool GetFrameBuffer(VIDEOCODEC_PICTURE &picture); + bool GetFrameBuffer(VIDEOCODEC_PICTURE* picture); + /*---AUTO_GEN_PARSE---*/ void ReleaseFrameBuffer(KODI_HANDLE videoBufferHandle); + /*---AUTO_GEN_PARSE---*/ - static bool get_frame_buffer(void* kodiInstance, VIDEOCODEC_PICTURE *picture); - static void release_frame_buffer(void* kodiInstance, KODI_HANDLE videoBufferHandle); +private: + bool CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamInfo &hints); - AddonInstance_VideoCodec m_struct; - int m_codecFlags; + KODI_HANDLE m_addonInstance; + int m_codecFlags{0}; VIDEOCODEC_FORMAT m_formats[VIDEOCODEC_FORMAT_MAXFORMATS + 1]; - float m_displayAspect; + float m_displayAspect{0.0f}; unsigned int m_width, m_height; }; diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt b/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt index 5f60202bcb82d..da99bc7c7c78f 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt @@ -7,10 +7,7 @@ set(SOURCES DVDFactoryInputStream.cpp DVDInputStreamStack.cpp DVDStateSerializer.cpp InputStreamAddon.cpp - InputStreamMultiSource.cpp - InputStreamPVRBase.cpp - InputStreamPVRChannel.cpp - InputStreamPVRRecording.cpp) + InputStreamMultiSource.cpp) set(HEADERS DVDFactoryInputStream.h DVDInputStream.h @@ -23,10 +20,7 @@ set(HEADERS DVDFactoryInputStream.h DllDvdNav.h InputStreamAddon.h InputStreamMultiStreams.h - InputStreamMultiSource.h - InputStreamPVRBase.h - InputStreamPVRChannel.h - InputStreamPVRRecording.h) + InputStreamMultiSource.h) if(BLURAY_FOUND) list(APPEND SOURCES DVDInputStreamBluray.cpp) diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp index 255acc2a7faa1..35ad7086da250 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp @@ -19,8 +19,6 @@ #include "FileItem.h" #include "InputStreamAddon.h" #include "InputStreamMultiSource.h" -#include "InputStreamPVRChannel.h" -#include "InputStreamPVRRecording.h" #include "ServiceBroker.h" #include "URL.h" #include "Util.h" @@ -101,10 +99,6 @@ std::shared_ptr CDVDFactoryInputStream::CreateInputStream(IVide if (fileitem.IsDVDFile(false, true)) return std::shared_ptr(new CDVDInputStreamNavigator(pPlayer, fileitem)); - else if (URIUtils::IsPVRChannel(file)) - return std::shared_ptr(new CInputStreamPVRChannel(pPlayer, fileitem)); - else if (URIUtils::IsPVRRecording(file)) - return std::shared_ptr(new CInputStreamPVRRecording(pPlayer, fileitem)); #ifdef HAVE_LIBBLURAY else if (fileitem.IsType(".bdmv") || fileitem.IsType(".mpls") || fileitem.IsType(".bdm") || fileitem.IsType(".mpl") diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp index 5d69151a521c4..cd5c814c49987 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp @@ -8,7 +8,8 @@ #include "InputStreamAddon.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h" +#include "addons/interface/api/addon-instance/inputstream.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h" #include "cores/VideoPlayer/DVDDemuxers/DVDDemux.h" #include "cores/VideoPlayer/DVDDemuxers/DVDDemuxUtils.h" #include "cores/VideoPlayer/Interface/DemuxCrypto.h" @@ -58,7 +59,6 @@ CInputStreamAddon::CInputStreamAddon(const AddonInfoPtr& addonInfo, StringUtils::Trim(key); key = name + "." + key; } - m_struct = {}; m_caps = {}; } @@ -122,23 +122,7 @@ bool CInputStreamAddon::Supports(const AddonInfoPtr& addonInfo, const CFileItem& bool CInputStreamAddon::Open() { - // Create "C" interface structures, used as own parts to prevent API problems on update - m_struct.props = new AddonProps_InputStream(); - m_struct.toAddon = new KodiToAddonFuncTable_InputStream(); - m_struct.toKodi = new AddonToKodiFuncTable_InputStream(); - - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->free_demux_packet = cb_free_demux_packet; - m_struct.toKodi->allocate_demux_packet = cb_allocate_demux_packet; - m_struct.toKodi->allocate_encrypted_demux_packet = cb_allocate_encrypted_demux_packet; - /* - // Way to include part on new API version - if (Addon()->GetTypeVersionDll(ADDON_TYPE::ADDON_INSTANCE_INPUTSTREAM) >= AddonVersion("3.0.0")) // Set the version to your new - { - - } - */ - if (CreateInstance(&m_struct) != ADDON_STATUS_OK || !m_struct.toAddon->open) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) return false; INPUTSTREAM_PROPERTY props = {}; @@ -181,29 +165,22 @@ bool CInputStreamAddon::Open() m_player->GetVideoResolution(videoWidth, videoHeight); SetVideoResolution(videoWidth, videoHeight); - bool ret = m_struct.toAddon->open(&m_struct, &props); + bool ret = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_open_v1(m_addonInstance, &props); if (ret) { m_caps = {}; - m_struct.toAddon->get_capabilities(&m_struct, &m_caps); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_capabilities_v1(m_addonInstance, &m_caps); m_subAddonProvider = std::shared_ptr( - new CInputStreamProvider(GetAddonInfo(), m_struct.toAddon->addonInstance)); + new CInputStreamProvider(GetAddonInfo(), m_addonInstance)); } return ret; } void CInputStreamAddon::Close() { - if (m_struct.toAddon->close) - m_struct.toAddon->close(&m_struct); - DestroyInstance(); - - // Delete "C" interface structures - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; - m_struct = {}; + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_close_v1(m_addonInstance); + DestroyInstance(m_addonInstance); } bool CInputStreamAddon::IsEOF() @@ -213,34 +190,22 @@ bool CInputStreamAddon::IsEOF() int CInputStreamAddon::Read(uint8_t* buf, int buf_size) { - if (!m_struct.toAddon->read_stream) - return -1; - - return m_struct.toAddon->read_stream(&m_struct, buf, buf_size); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_read_stream_v1(m_addonInstance, buf, buf_size); } int64_t CInputStreamAddon::Seek(int64_t offset, int whence) { - if (!m_struct.toAddon->seek_stream) - return -1; - - return m_struct.toAddon->seek_stream(&m_struct, offset, whence); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_seek_stream_v1(m_addonInstance, offset, whence); } int64_t CInputStreamAddon::GetLength() { - if (!m_struct.toAddon->length_stream) - return -1; - - return m_struct.toAddon->length_stream(&m_struct); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_length_stream_v1(m_addonInstance); } int CInputStreamAddon::GetBlockSize() { - if (!m_struct.toAddon->block_size_stream) - return 0; - - return m_struct.toAddon->block_size_stream(&m_struct); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_block_size_stream_v1(m_addonInstance); } bool CInputStreamAddon::CanSeek() @@ -264,18 +229,12 @@ CDVDInputStream::IDisplayTime* CInputStreamAddon::GetIDisplayTime() int CInputStreamAddon::GetTotalTime() { - if (!m_struct.toAddon->get_total_time) - return 0; - - return m_struct.toAddon->get_total_time(&m_struct); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_total_time_v1(m_addonInstance); } int CInputStreamAddon::GetTime() { - if (!m_struct.toAddon->get_time) - return 0; - - return m_struct.toAddon->get_time(&m_struct); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_time_v1(m_addonInstance); } // ITime @@ -289,12 +248,9 @@ CDVDInputStream::ITimes* CInputStreamAddon::GetITimes() bool CInputStreamAddon::GetTimes(Times ×) { - if (!m_struct.toAddon->get_times) - return false; - INPUTSTREAM_TIMES i_times; - if (m_struct.toAddon->get_times(&m_struct, &i_times)) + if (m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_times_v1(m_addonInstance, &i_times)) { times.ptsBegin = i_times.ptsBegin; times.ptsEnd = i_times.ptsEnd; @@ -316,10 +272,7 @@ CDVDInputStream::IPosTime* CInputStreamAddon::GetIPosTime() bool CInputStreamAddon::PosTime(int ms) { - if (!m_struct.toAddon->pos_time) - return false; - - return m_struct.toAddon->pos_time(&m_struct, ms); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_pos_time_v1(m_addonInstance, ms); } // IDemux @@ -341,10 +294,7 @@ bool CInputStreamAddon::OpenDemux() DemuxPacket* CInputStreamAddon::ReadDemux() { - if (!m_struct.toAddon->demux_read) - return nullptr; - - return static_cast(m_struct.toAddon->demux_read(&m_struct)); + return static_cast(m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_read_v1(m_addonInstance)); } std::vector CInputStreamAddon::GetStreams() const @@ -352,7 +302,7 @@ std::vector CInputStreamAddon::GetStreams() const std::vector streams; INPUTSTREAM_IDS streamIDs = {}; - bool ret = m_struct.toAddon->get_stream_ids(&m_struct, &streamIDs); + bool ret = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_stream_ids_v1(m_addonInstance, &streamIDs); if (!ret || streamIDs.m_streamCount > INPUTSTREAM_MAX_STREAM_COUNT) return streams; @@ -367,7 +317,7 @@ CDemuxStream* CInputStreamAddon::GetStream(int streamId) const { INPUTSTREAM_INFO stream{}; KODI_HANDLE demuxStream = nullptr; - bool ret = m_struct.toAddon->get_stream(&m_struct, streamId, &stream, &demuxStream, + bool ret = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_stream_v1(m_addonInstance, streamId, &stream, &demuxStream, cb_get_stream_transfer); if (!ret || stream.m_streamType == INPUTSTREAM_TYPE_NONE) return nullptr; @@ -508,12 +458,7 @@ KODI_HANDLE CInputStreamAddon::cb_get_stream_transfer(KODI_HANDLE handle, demuxStream->uniqueId = streamId; demuxStream->flags = static_cast(stream->m_flags); demuxStream->language = stream->m_language; - - if (thisClass->GetAddonInfo()->DependencyVersion(ADDON_INSTANCE_VERSION_INPUTSTREAM_XML_ID) >= - AddonVersion("2.0.8")) - { - demuxStream->codec_fourcc = stream->m_codecFourCC; - } + demuxStream->codec_fourcc = stream->m_codecFourCC; if (stream->m_ExtraData && stream->m_ExtraSize) { @@ -544,18 +489,12 @@ KODI_HANDLE CInputStreamAddon::cb_get_stream_transfer(KODI_HANDLE handle, void CInputStreamAddon::EnableStream(int streamId, bool enable) { - if (!m_struct.toAddon->enable_stream) - return; - - m_struct.toAddon->enable_stream(&m_struct, streamId, enable); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_enable_stream_v1(m_addonInstance, streamId, enable); } bool CInputStreamAddon::OpenStream(int streamId) { - if (!m_struct.toAddon->open_stream) - return false; - - return m_struct.toAddon->open_stream(&m_struct, streamId); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_open_stream_v1(m_addonInstance, streamId); } int CInputStreamAddon::GetNrOfStreams() const @@ -565,17 +504,11 @@ int CInputStreamAddon::GetNrOfStreams() const void CInputStreamAddon::SetSpeed(int speed) { - if (!m_struct.toAddon->demux_set_speed) - return; - - m_struct.toAddon->demux_set_speed(&m_struct, speed); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_set_speed_v1(m_addonInstance, speed); } bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) { - if (!m_struct.toAddon->demux_seek_time) - return false; - if ((m_caps.m_mask & INPUTSTREAM_SUPPORTS_IPOSTIME) != 0) { if (!PosTime(static_cast(time))) @@ -588,32 +521,27 @@ bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) return true; } - return m_struct.toAddon->demux_seek_time(&m_struct, time, backward, startpts); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_seek_time_v1(m_addonInstance, time, backward, startpts); } void CInputStreamAddon::AbortDemux() { - if (m_struct.toAddon->demux_abort) - m_struct.toAddon->demux_abort(&m_struct); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_abort_v1(m_addonInstance); } void CInputStreamAddon::FlushDemux() { - if (m_struct.toAddon->demux_flush) - m_struct.toAddon->demux_flush(&m_struct); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_flush_v1(m_addonInstance); } void CInputStreamAddon::SetVideoResolution(int width, int height) { - if (m_struct.toAddon->set_video_resolution) - m_struct.toAddon->set_video_resolution(&m_struct, width, height); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_set_video_resolution_v1(m_addonInstance, width, height); } bool CInputStreamAddon::IsRealtime() { - if (m_struct.toAddon->is_real_time_stream) - return m_struct.toAddon->is_real_time_stream(&m_struct); - return false; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_is_real_time_stream_v1(m_addonInstance); } @@ -628,45 +556,30 @@ CDVDInputStream::IChapter* CInputStreamAddon::GetIChapter() int CInputStreamAddon::GetChapter() { - if (m_struct.toAddon->get_chapter) - return m_struct.toAddon->get_chapter(&m_struct); - - return -1; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_v1(m_addonInstance); } int CInputStreamAddon::GetChapterCount() { - if (m_struct.toAddon->get_chapter_count) - return m_struct.toAddon->get_chapter_count(&m_struct); - - return 0; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_count_v1(m_addonInstance); } void CInputStreamAddon::GetChapterName(std::string& name, int ch) { name.clear(); - if (m_struct.toAddon->get_chapter_name) - { - const char* res = m_struct.toAddon->get_chapter_name(&m_struct, ch); - if (res) - name = res; - } + const char* res = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_name_v1(m_addonInstance, ch); + if (res) + name = res; } int64_t CInputStreamAddon::GetChapterPos(int ch) { - if (m_struct.toAddon->get_chapter_pos) - return m_struct.toAddon->get_chapter_pos(&m_struct, ch); - - return 0; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_pos_v1(m_addonInstance, ch); } bool CInputStreamAddon::SeekChapter(int ch) { - if (m_struct.toAddon->seek_chapter) - return m_struct.toAddon->seek_chapter(&m_struct, ch); - - return false; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_seek_chapter_v1(m_addonInstance, ch); } int CInputStreamAddon::ConvertVideoCodecProfile(STREAMCODEC_PROFILE profile) @@ -704,18 +617,18 @@ int CInputStreamAddon::ConvertVideoCodecProfile(STREAMCODEC_PROFILE profile) * Callbacks from add-on to kodi */ //@{ -DEMUX_PACKET* CInputStreamAddon::cb_allocate_demux_packet(void* kodiInstance, int data_size) +DEMUX_PACKET* CInputStreamAddon::cb_allocate_demux_packet(int data_size) { return CDVDDemuxUtils::AllocateDemuxPacket(data_size); } DEMUX_PACKET* CInputStreamAddon::cb_allocate_encrypted_demux_packet( - void* kodiInstance, unsigned int dataSize, unsigned int encryptedSubsampleCount) + unsigned int dataSize, unsigned int encryptedSubsampleCount) { return CDVDDemuxUtils::AllocateDemuxPacket(dataSize, encryptedSubsampleCount); } -void CInputStreamAddon::cb_free_demux_packet(void* kodiInstance, DEMUX_PACKET* packet) +void CInputStreamAddon::cb_free_demux_packet(DEMUX_PACKET* packet) { CDVDDemuxUtils::FreeDemuxPacket(static_cast(packet)); } diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h index c1ff487524f3e..d64d92e80cbf0 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h @@ -11,8 +11,8 @@ #include "DVDInputStream.h" #include "IVideoPlayer.h" #include "addons/AddonProvider.h" -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h" +#include "addons/interface/InstanceHandler.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream.h" #include #include @@ -34,7 +34,7 @@ class CInputStreamProvider //! \brief Input stream class class CInputStreamAddon - : public ADDON::IAddonInstanceHandler + : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler , public CDVDInputStream , public CDVDInputStream::IDisplayTime , public CDVDInputStream::ITimes @@ -100,20 +100,6 @@ class CInputStreamAddon int64_t GetChapterPos(int ch = -1) override; bool SeekChapter(int ch) override; -protected: - static int ConvertVideoCodecProfile(STREAMCODEC_PROFILE profile); - - IVideoPlayer* m_player; - -private: - std::vector m_fileItemProps; - INPUTSTREAM_CAPABILITIES m_caps; - - int m_streamCount = 0; - - AddonInstance_InputStream m_struct; - std::shared_ptr m_subAddonProvider; - /*! * Callbacks from add-on to kodi */ @@ -124,7 +110,8 @@ class CInputStreamAddon * @param iDataSize The size of the data that will go into the packet * @return The allocated packet. */ - static DEMUX_PACKET* cb_allocate_demux_packet(void* kodiInstance, int iDataSize = 0); + DEMUX_PACKET* cb_allocate_demux_packet(int iDataSize = 0); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Allocate an encrypted demux packet. Free with FreeDemuxPacket @@ -133,16 +120,17 @@ class CInputStreamAddon * @param encryptedSubsampleCount The number of subsample description blocks to allocate * @return The allocated packet. */ - static DEMUX_PACKET* cb_allocate_encrypted_demux_packet(void* kodiInstance, - unsigned int dataSize, - unsigned int encryptedSubsampleCount); + DEMUX_PACKET* cb_allocate_encrypted_demux_packet(unsigned int dataSize, + unsigned int encryptedSubsampleCount); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Free a packet that was allocated with AllocateDemuxPacket * @param kodiInstance A pointer to the add-on. * @param pPacket The packet to free. */ - static void cb_free_demux_packet(void* kodiInstance, DEMUX_PACKET* pPacket); + void cb_free_demux_packet(DEMUX_PACKET* pPacket); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Callback used by @ref GetStream to get the data @@ -159,4 +147,18 @@ class CInputStreamAddon int streamId, INPUTSTREAM_INFO* stream); //@} + +protected: + static int ConvertVideoCodecProfile(STREAMCODEC_PROFILE profile); + + IVideoPlayer* m_player; + +private: + std::vector m_fileItemProps; + INPUTSTREAM_CAPABILITIES m_caps; + + int m_streamCount = 0; + + KODI_HANDLE m_addonInstance; + std::shared_ptr m_subAddonProvider; }; diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.cpp deleted file mode 100644 index e07783db575ff..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "InputStreamPVRBase.h" - -#include "ServiceBroker.h" -#include "cores/VideoPlayer/DVDDemuxers/DVDDemux.h" -#include "cores/VideoPlayer/Interface/DemuxPacket.h" -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClient.h" -#include "settings/Settings.h" -#include "settings/SettingsComponent.h" -#include "utils/log.h" - -CInputStreamPVRBase::CInputStreamPVRBase(IVideoPlayer* pPlayer, const CFileItem& fileitem) - : CDVDInputStream(DVDSTREAM_TYPE_PVRMANAGER, fileitem), - m_eof(true), - m_StreamProps(new PVR_STREAM_PROPERTIES()), - m_client(CServiceBroker::GetPVRManager().GetClient(fileitem)) -{ - if (!m_client) - CLog::Log(LOGERROR, - "CInputStreamPVRBase - {} - unable to obtain pvr addon instance for item '{}'", - __FUNCTION__, fileitem.GetPath()); -} - -CInputStreamPVRBase::~CInputStreamPVRBase() -{ - m_streamMap.clear(); -} - -bool CInputStreamPVRBase::IsEOF() -{ - return m_eof; -} - -bool CInputStreamPVRBase::Open() -{ - if (CDVDInputStream::Open() && OpenPVRStream()) - { - m_eof = false; - m_StreamProps->iStreamCount = 0; - return true; - } - else - { - return false; - } -} - -void CInputStreamPVRBase::Close() -{ - ClosePVRStream(); - CDVDInputStream::Close(); - m_eof = true; -} - -int CInputStreamPVRBase::Read(uint8_t* buf, int buf_size) -{ - int ret = ReadPVRStream(buf, buf_size); - - // we currently don't support non completing reads - if (ret == 0) - m_eof = true; - else if (ret < -1) - ret = -1; - - return ret; -} - -int64_t CInputStreamPVRBase::Seek(int64_t offset, int whence) -{ - if (whence == SEEK_POSSIBLE) - return CanSeek() ? 1 : 0; - - int64_t ret = SeekPVRStream(offset, whence); - - // if we succeed, we are not eof anymore - if (ret >= 0) - m_eof = false; - - return ret; -} - -int64_t CInputStreamPVRBase::GetLength() -{ - return GetPVRStreamLength(); -} - -int CInputStreamPVRBase::GetBlockSize() -{ - int ret = -1; - - if (m_client) - m_client->GetStreamReadChunkSize(ret); - - return ret; -} - -bool CInputStreamPVRBase::GetTimes(Times ×) -{ - PVR_STREAM_TIMES streamTimes = {}; - if (m_client && m_client->GetStreamTimes(&streamTimes) == PVR_ERROR_NO_ERROR) - { - times.startTime = streamTimes.startTime; - times.ptsStart = streamTimes.ptsStart; - times.ptsBegin = streamTimes.ptsBegin; - times.ptsEnd = streamTimes.ptsEnd; - return true; - } - else - { - return false; - } -} - -CDVDInputStream::ENextStream CInputStreamPVRBase::NextStream() -{ - return NextPVRStream(); -} - -bool CInputStreamPVRBase::CanPause() -{ - return CanPausePVRStream(); -} - -bool CInputStreamPVRBase::CanSeek() -{ - return CanSeekPVRStream(); -} - -void CInputStreamPVRBase::Pause(bool bPaused) -{ - if (m_client) - m_client->PauseStream(bPaused); -} - -bool CInputStreamPVRBase::IsRealtime() -{ - bool ret = false; - - if (m_client) - m_client->IsRealTimeStream(ret); - - return ret; -} - -bool CInputStreamPVRBase::OpenDemux() -{ - if (m_client) - { - m_client->GetStreamProperties(m_StreamProps.get()); - UpdateStreamMap(); - return true; - } - else - { - return false; - } -} - -DemuxPacket* CInputStreamPVRBase::ReadDemux() -{ - if (!m_client) - return nullptr; - - DemuxPacket* pPacket = nullptr; - m_client->DemuxRead(pPacket); - if (!pPacket) - { - return nullptr; - } - else if (pPacket->iStreamId == DMX_SPECIALID_STREAMINFO) - { - m_client->GetStreamProperties(m_StreamProps.get()); - return pPacket; - } - else if (pPacket->iStreamId == DMX_SPECIALID_STREAMCHANGE) - { - m_client->GetStreamProperties(m_StreamProps.get()); - UpdateStreamMap(); - } - - return pPacket; -} - -CDemuxStream* CInputStreamPVRBase::GetStream(int iStreamId) const -{ - const auto stream = m_streamMap.find(iStreamId); - if (stream != m_streamMap.end()) - return stream->second.get(); - else - return nullptr; -} - -std::vector CInputStreamPVRBase::GetStreams() const -{ - std::vector streams; - - for (const auto& st : m_streamMap) - streams.emplace_back(st.second.get()); - - return streams; -} - -int CInputStreamPVRBase::GetNrOfStreams() const -{ - return m_StreamProps->iStreamCount; -} - -void CInputStreamPVRBase::SetSpeed(int Speed) -{ - if (m_client) - m_client->SetSpeed(Speed); -} - -void CInputStreamPVRBase::FillBuffer(bool mode) -{ - if (m_client) - m_client->FillBuffer(mode); -} - -bool CInputStreamPVRBase::SeekTime(double timems, bool backwards, double *startpts) -{ - if (m_client) - return m_client->SeekTime(timems, backwards, startpts) == PVR_ERROR_NO_ERROR; - else - return false; -} - -void CInputStreamPVRBase::AbortDemux() -{ - if (m_client) - m_client->DemuxAbort(); -} - -void CInputStreamPVRBase::FlushDemux() -{ - if (m_client) - m_client->DemuxFlush(); -} - -std::shared_ptr CInputStreamPVRBase::GetStreamInternal(int iStreamId) -{ - const auto stream = m_streamMap.find(iStreamId); - if (stream != m_streamMap.end()) - return stream->second; - else - return nullptr; -} - -void CInputStreamPVRBase::UpdateStreamMap() -{ - std::map> newStreamMap; - - int num = GetNrOfStreams(); - for (int i = 0; i < num; ++i) - { - PVR_STREAM_PROPERTIES::PVR_STREAM stream = m_StreamProps->stream[i]; - - std::shared_ptr dStream = GetStreamInternal(stream.iPID); - - if (stream.iCodecType == PVR_CODEC_TYPE_AUDIO) - { - std::shared_ptr streamAudio; - - if (dStream) - streamAudio = std::dynamic_pointer_cast(dStream); - if (!streamAudio) - streamAudio = std::make_shared(); - - streamAudio->iChannels = stream.iChannels; - streamAudio->iSampleRate = stream.iSampleRate; - streamAudio->iBlockAlign = stream.iBlockAlign; - streamAudio->iBitRate = stream.iBitRate; - streamAudio->iBitsPerSample = stream.iBitsPerSample; - - dStream = streamAudio; - } - else if (stream.iCodecType == PVR_CODEC_TYPE_VIDEO) - { - std::shared_ptr streamVideo; - - if (dStream) - streamVideo = std::dynamic_pointer_cast(dStream); - if (!streamVideo) - streamVideo = std::make_shared(); - - streamVideo->iFpsScale = stream.iFPSScale; - streamVideo->iFpsRate = stream.iFPSRate; - streamVideo->iHeight = stream.iHeight; - streamVideo->iWidth = stream.iWidth; - streamVideo->fAspect = static_cast(stream.fAspect); - - dStream = streamVideo; - } - else if (stream.iCodecId == AV_CODEC_ID_DVB_TELETEXT) - { - std::shared_ptr streamTeletext; - - if (dStream) - streamTeletext = std::dynamic_pointer_cast(dStream); - if (!streamTeletext) - streamTeletext = std::make_shared(); - - dStream = streamTeletext; - } - else if (stream.iCodecType == PVR_CODEC_TYPE_SUBTITLE) - { - std::shared_ptr streamSubtitle; - - if (dStream) - streamSubtitle = std::dynamic_pointer_cast(dStream); - if (!streamSubtitle) - streamSubtitle = std::make_shared(); - - if (stream.iSubtitleInfo) - { - streamSubtitle->ExtraData = new uint8_t[4]; - streamSubtitle->ExtraSize = 4; - streamSubtitle->ExtraData[0] = (stream.iSubtitleInfo >> 8) & 0xff; - streamSubtitle->ExtraData[1] = (stream.iSubtitleInfo >> 0) & 0xff; - streamSubtitle->ExtraData[2] = (stream.iSubtitleInfo >> 24) & 0xff; - streamSubtitle->ExtraData[3] = (stream.iSubtitleInfo >> 16) & 0xff; - } - dStream = streamSubtitle; - } - else if (stream.iCodecType == PVR_CODEC_TYPE_RDS && - CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( - "pvrplayback.enableradiords")) - { - std::shared_ptr streamRadioRDS; - - if (dStream) - streamRadioRDS = std::dynamic_pointer_cast(dStream); - if (!streamRadioRDS) - streamRadioRDS = std::make_shared(); - - dStream = streamRadioRDS; - } - else - dStream = std::make_shared(); - - dStream->codec = (AVCodecID)stream.iCodecId; - dStream->uniqueId = stream.iPID; - dStream->language = stream.strLanguage; - - newStreamMap[stream.iPID] = dStream; - } - - m_streamMap = newStreamMap; -} diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.h b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.h deleted file mode 100644 index b42f742f7091b..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "DVDInputStream.h" - -#include -#include -#include - -class CFileItem; -class IDemux; -class IVideoPlayer; -struct PVR_STREAM_PROPERTIES; - -namespace PVR -{ - class CPVRClient; -} - -class CInputStreamPVRBase - : public CDVDInputStream - , public CDVDInputStream::ITimes - , public CDVDInputStream::IDemux -{ -public: - CInputStreamPVRBase(IVideoPlayer* pPlayer, const CFileItem& fileitem); - ~CInputStreamPVRBase() override; - bool Open() override; - void Close() override; - int Read(uint8_t* buf, int buf_size) override; - int64_t Seek(int64_t offset, int whence) override; - bool IsEOF() override; - int64_t GetLength() override; - int GetBlockSize() override; - - ENextStream NextStream() override; - bool IsRealtime() override; - - CDVDInputStream::ITimes* GetITimes() override { return this; } - bool GetTimes(Times ×) override; - - bool CanSeek() override; //! @todo drop this - bool CanPause() override; - void Pause(bool bPaused); - - // Demux interface - CDVDInputStream::IDemux* GetIDemux() override { return nullptr; } - bool OpenDemux() override; - DemuxPacket* ReadDemux() override; - CDemuxStream* GetStream(int iStreamId) const override; - std::vector GetStreams() const override; - int GetNrOfStreams() const override; - void SetSpeed(int iSpeed) override; - void FillBuffer(bool mode) override; - bool SeekTime(double time, bool backward = false, double* startpts = NULL) override; - void AbortDemux() override; - void FlushDemux() override; - -protected: - void UpdateStreamMap(); - std::shared_ptr GetStreamInternal(int iStreamId); - - virtual bool OpenPVRStream() = 0; - virtual void ClosePVRStream() = 0; - virtual int ReadPVRStream(uint8_t* buf, int buf_size) = 0; - virtual int64_t SeekPVRStream(int64_t offset, int whence) = 0; - virtual int64_t GetPVRStreamLength() = 0; - virtual ENextStream NextPVRStream() = 0; - virtual bool CanPausePVRStream() = 0; - virtual bool CanSeekPVRStream() = 0; - - bool m_eof; - std::shared_ptr m_StreamProps; - std::map> m_streamMap; - std::shared_ptr m_client; -}; diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp deleted file mode 100644 index b2cde6108ffff..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "InputStreamPVRChannel.h" - -#include "ServiceBroker.h" -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClient.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" -#include "utils/log.h" - -using namespace PVR; - -CInputStreamPVRChannel::CInputStreamPVRChannel(IVideoPlayer* pPlayer, const CFileItem& fileitem) - : CInputStreamPVRBase(pPlayer, fileitem), - m_bDemuxActive(false) -{ -} - -CInputStreamPVRChannel::~CInputStreamPVRChannel() -{ - Close(); -} - -CDVDInputStream::IDemux* CInputStreamPVRChannel::GetIDemux() -{ - if (m_bDemuxActive) - return this; - - return CInputStreamPVRBase::GetIDemux(); -} - -bool CInputStreamPVRChannel::OpenPVRStream() -{ - std::shared_ptr channel = m_item.GetPVRChannelInfoTag(); - if (!channel) - channel = CServiceBroker::GetPVRManager().ChannelGroups()->GetByPath(m_item.GetPath()); - - if (!channel) - CLog::Log(LOGERROR, - "CInputStreamPVRChannel - {} - unable to obtain channel instance for channel {}", - __FUNCTION__, m_item.GetPath()); - - if (channel && m_client && (m_client->OpenLiveStream(channel) == PVR_ERROR_NO_ERROR)) - { - m_bDemuxActive = m_client->GetClientCapabilities().HandlesDemuxing(); - CLog::Log(LOGDEBUG, "CInputStreamPVRChannel - {} - opened channel stream {}", __FUNCTION__, - m_item.GetPath()); - return true; - } - return false; -} - -void CInputStreamPVRChannel::ClosePVRStream() -{ - if (m_client && (m_client->CloseLiveStream() == PVR_ERROR_NO_ERROR)) - { - m_bDemuxActive = false; - CLog::Log(LOGDEBUG, "CInputStreamPVRChannel - {} - closed channel stream {}", __FUNCTION__, - m_item.GetPath()); - } -} - -int CInputStreamPVRChannel::ReadPVRStream(uint8_t* buf, int buf_size) -{ - int ret = -1; - - if (m_client) - m_client->ReadLiveStream(buf, buf_size, ret); - - return ret; -} - -int64_t CInputStreamPVRChannel::SeekPVRStream(int64_t offset, int whence) -{ - int64_t ret = -1; - - if (m_client) - m_client->SeekLiveStream(offset, whence, ret); - - return ret; -} - -int64_t CInputStreamPVRChannel::GetPVRStreamLength() -{ - int64_t ret = -1; - - if (m_client) - m_client->GetLiveStreamLength(ret); - - return ret; -} - -CDVDInputStream::ENextStream CInputStreamPVRChannel::NextPVRStream() -{ - if (m_eof) - return NEXTSTREAM_OPEN; - - return NEXTSTREAM_RETRY; -} - -bool CInputStreamPVRChannel::CanPausePVRStream() -{ - bool ret = false; - - if (m_client) - m_client->CanPauseStream(ret); - - return ret; -} - -bool CInputStreamPVRChannel::CanSeekPVRStream() -{ - bool ret = false; - - if (m_client) - m_client->CanSeekStream(ret); - - return ret; -} diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.h b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.h deleted file mode 100644 index d8d8bebd6e990..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "InputStreamPVRBase.h" - -class CInputStreamPVRChannel : public CInputStreamPVRBase -{ -public: - CInputStreamPVRChannel(IVideoPlayer* pPlayer, const CFileItem& fileitem); - ~CInputStreamPVRChannel() override; - - CDVDInputStream::IDemux* GetIDemux() override; - -protected: - bool OpenPVRStream() override; - void ClosePVRStream() override; - int ReadPVRStream(uint8_t* buf, int buf_size) override; - int64_t SeekPVRStream(int64_t offset, int whence) override; - int64_t GetPVRStreamLength() override; - ENextStream NextPVRStream() override; - bool CanPausePVRStream() override; - bool CanSeekPVRStream() override; - -private: - bool m_bDemuxActive; -}; diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp deleted file mode 100644 index 6c41ffb6d0a7f..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#include "InputStreamPVRRecording.h" - -#include "ServiceBroker.h" -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClient.h" -#include "pvr/recordings/PVRRecordings.h" -#include "utils/log.h" - -using namespace PVR; - -CInputStreamPVRRecording::CInputStreamPVRRecording(IVideoPlayer* pPlayer, const CFileItem& fileitem) - : CInputStreamPVRBase(pPlayer, fileitem) -{ -} - -CInputStreamPVRRecording::~CInputStreamPVRRecording() -{ - Close(); -} - -bool CInputStreamPVRRecording::OpenPVRStream() -{ - std::shared_ptr recording = m_item.GetPVRRecordingInfoTag(); - if (!recording) - recording = CServiceBroker::GetPVRManager().Recordings()->GetByPath(m_item.GetPath()); - - if (!recording) - CLog::Log( - LOGERROR, - "CInputStreamPVRRecording - {} - unable to obtain recording instance for recording {}", - __FUNCTION__, m_item.GetPath()); - - if (recording && m_client && (m_client->OpenRecordedStream(recording) == PVR_ERROR_NO_ERROR)) - { - CLog::Log(LOGDEBUG, "CInputStreamPVRRecording - {} - opened recording stream {}", __FUNCTION__, - m_item.GetPath()); - return true; - } - return false; -} - -void CInputStreamPVRRecording::ClosePVRStream() -{ - if (m_client && (m_client->CloseRecordedStream() == PVR_ERROR_NO_ERROR)) - { - CLog::Log(LOGDEBUG, "CInputStreamPVRRecording - {} - closed recording stream {}", __FUNCTION__, - m_item.GetPath()); - } -} - -int CInputStreamPVRRecording::ReadPVRStream(uint8_t* buf, int buf_size) -{ - int iRead = -1; - - if (m_client) - m_client->ReadRecordedStream(buf, buf_size, iRead); - - return iRead; -} - -int64_t CInputStreamPVRRecording::SeekPVRStream(int64_t offset, int whence) -{ - int64_t ret = -1; - - if (m_client) - m_client->SeekRecordedStream(offset, whence, ret); - - return ret; -} - -int64_t CInputStreamPVRRecording::GetPVRStreamLength() -{ - int64_t ret = -1; - - if (m_client) - m_client->GetRecordedStreamLength(ret); - - return ret; -} - -CDVDInputStream::ENextStream CInputStreamPVRRecording::NextPVRStream() -{ - return NEXTSTREAM_NONE; -} - -bool CInputStreamPVRRecording::CanPausePVRStream() -{ - return true; -} - -bool CInputStreamPVRRecording::CanSeekPVRStream() -{ - return true; -} diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.h b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.h deleted file mode 100644 index 2a873c9f33966..0000000000000 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2012-2018 Team Kodi - * This file is part of Kodi - https://kodi.tv - * - * SPDX-License-Identifier: GPL-2.0-or-later - * See LICENSES/README.md for more information. - */ - -#pragma once - -#include "InputStreamPVRBase.h" - -class CInputStreamPVRRecording : public CInputStreamPVRBase -{ -public: - CInputStreamPVRRecording(IVideoPlayer* pPlayer, const CFileItem& fileitem); - ~CInputStreamPVRRecording() override; - -protected: - bool OpenPVRStream() override; - void ClosePVRStream() override; - int ReadPVRStream(uint8_t* buf, int buf_size) override; - int64_t SeekPVRStream(int64_t offset, int whence) override; - int64_t GetPVRStreamLength() override; - ENextStream NextPVRStream() override; - bool CanPausePVRStream() override; - bool CanSeekPVRStream() override; -}; diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index 7015966ff0835..83835f915d0fc 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -7,7 +7,6 @@ */ #include "VideoPlayer.h" - #include "Application.h" #include "DVDCodecs/DVDCodecUtils.h" #include "DVDDemuxers/DVDDemux.h" @@ -23,7 +22,6 @@ #include "DVDInputStreams/DVDInputStreamBluray.h" #endif #include "DVDInputStreams/DVDInputStreamNavigator.h" -#include "DVDInputStreams/InputStreamPVRBase.h" #include "FileItem.h" #include "GUIInfoManager.h" #include "GUIUserMessages.h" @@ -2840,12 +2838,6 @@ void CVideoPlayer::HandleMessages() GetInfoManager().GetInfoProviders().GetPlayerInfoProvider().SetDisplayAfterSeek(); } - if (m_pInputStream->IsStreamType(DVDSTREAM_TYPE_PVRMANAGER) && speed != m_playSpeed) - { - std::shared_ptr pvrinputstream = std::static_pointer_cast(m_pInputStream); - pvrinputstream->Pause(speed == 0); - } - // do a seek after rewind, clock is not in sync with current pts if ((speed == DVD_PLAYSPEED_NORMAL) && (m_playSpeed != DVD_PLAYSPEED_NORMAL) && diff --git a/xbmc/cores/paplayer/AudioDecoder.cpp b/xbmc/cores/paplayer/AudioDecoder.cpp index 515b5697602ae..2e4682b49e8a8 100644 --- a/xbmc/cores/paplayer/AudioDecoder.cpp +++ b/xbmc/cores/paplayer/AudioDecoder.cpp @@ -254,8 +254,10 @@ int CAudioDecoder::ReadSamples(int numsamples) numsamples -= (numsamples % GetFormat().m_channelLayout.Count()); // make sure it's divisible by our number of channels if (numsamples) { - int readSize = 0; - int result = m_codec->ReadPCM(m_pcmInputBuffer, numsamples * (m_codec->m_bitsPerSample >> 3), &readSize); + size_t readSize = 0; + int result = m_codec->ReadPCM( + m_pcmInputBuffer, static_cast(numsamples * (m_codec->m_bitsPerSample >> 3)), + &readSize); if (result != READ_ERROR && readSize) { diff --git a/xbmc/cores/paplayer/CodecFactory.cpp b/xbmc/cores/paplayer/CodecFactory.cpp index 87eed7071f8b7..004dc460402e0 100644 --- a/xbmc/cores/paplayer/CodecFactory.cpp +++ b/xbmc/cores/paplayer/CodecFactory.cpp @@ -22,21 +22,18 @@ ICodec* CodecFactory::CreateCodec(const std::string &strFileType) std::string fileType = strFileType; StringUtils::ToLower(fileType); - std::vector addonInfos; - CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + std::vector> addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetExtensionSupportedAddonInfos( + "." + fileType, addonInfos, CAudioDecoderSupportList::FilterSelect::all); for (const auto& addonInfo : addonInfos) { - auto exts = StringUtils::Split(CAudioDecoder::GetExtensions(addonInfo), "|"); - if (std::find(exts.begin(), exts.end(), "." + fileType) != exts.end()) + CAudioDecoder* result = new CAudioDecoder(addonInfo); + if (!result->CreateDecoder()) { - CAudioDecoder* result = new CAudioDecoder(addonInfo); - if (!result->CreateDecoder()) - { - delete result; - return nullptr; - } - return result; + delete result; + continue; } + return result; } VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); @@ -50,21 +47,18 @@ ICodec* CodecFactory::CreateCodecDemux(const CFileItem& file, unsigned int filec StringUtils::ToLower(content); if (!content.empty()) { - std::vector addonInfos; - CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + std::vector> addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetMimetypeSupportedAddonInfos( + content, addonInfos, CAudioDecoderSupportList::FilterSelect::all); for (const auto& addonInfo : addonInfos) { - auto types = StringUtils::Split(CAudioDecoder::GetMimetypes(addonInfo), "|"); - if (std::find(types.begin(), types.end(), content) != types.end()) + CAudioDecoder* result = new CAudioDecoder(addonInfo); + if (!result->CreateDecoder() && result->CanOperateFile(file.GetPath())) { - CAudioDecoder* result = new CAudioDecoder(addonInfo); - if (!result->CreateDecoder()) - { - delete result; - return nullptr; - } - return result; + delete result; + continue; } + return result; } } diff --git a/xbmc/cores/paplayer/ICodec.h b/xbmc/cores/paplayer/ICodec.h index 4f54b891bcd8a..1b452808525c5 100644 --- a/xbmc/cores/paplayer/ICodec.h +++ b/xbmc/cores/paplayer/ICodec.h @@ -55,7 +55,7 @@ class ICodec // Decodes audio into pBuffer up to size bytes. The actual amount of returned data // is given in actualsize. Returns READ_SUCCESS on success. Returns READ_EOF when // the data has been exhausted, and READ_ERROR on error. - virtual int ReadPCM(unsigned char *pBuffer, int size, int *actualsize)=0; + virtual int ReadPCM(uint8_t* pBuffer, size_t size, size_t* actualsize) = 0; virtual int ReadRaw(uint8_t **pBuffer, int *bufferSize) { return READ_ERROR; } diff --git a/xbmc/cores/paplayer/VideoPlayerCodec.cpp b/xbmc/cores/paplayer/VideoPlayerCodec.cpp index 4a4ef13ad8ef7..7943b44d7c0a4 100644 --- a/xbmc/cores/paplayer/VideoPlayerCodec.cpp +++ b/xbmc/cores/paplayer/VideoPlayerCodec.cpp @@ -185,8 +185,8 @@ bool VideoPlayerCodec::Init(const CFileItem &file, unsigned int filecache) int nErrors = 0; for (int nPacket=0; nPacket < 10 && (m_channels == 0 || m_format.m_sampleRate == 0); nPacket++) { - unsigned char dummy[256]; - int nSize = 256; + uint8_t dummy[256]; + size_t nSize = 256; if (ReadPCM(dummy, nSize, &nSize) == READ_ERROR) ++nErrors; @@ -322,11 +322,11 @@ bool VideoPlayerCodec::Seek(int64_t iSeekTime) return ret; } -int VideoPlayerCodec::ReadPCM(unsigned char *pBuffer, int size, int *actualsize) +int VideoPlayerCodec::ReadPCM(uint8_t* pBuffer, size_t size, size_t* actualsize) { if (m_nDecodedLen > 0) { - int nLen = (size addonInfos; - CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + std::vector> addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetExtensionSupportedAddonInfos( + strExtension, addonInfos, CAudioDecoderSupportList::FilterSelect::hasTracks); for (const auto& addonInfo : addonInfos) { - if (CAudioDecoder::HasTracks(addonInfo)) + CAudioDecoder* result = new CAudioDecoder(addonInfo); + if (!result->CreateDecoder() || !result->ContainsFiles(url)) { - auto exts = StringUtils::Split(CAudioDecoder::GetExtensions(addonInfo), "|"); - if (std::find(exts.begin(), exts.end(), strExtension) != exts.end()) - { - CAudioDecoder* result = new CAudioDecoder(addonInfo); - if (!result->CreateDecoder() || !result->ContainsFiles(url)) - { - delete result; - CLog::Log(LOGINFO, - "CFileDirectoryFactory::{}: Addon '{}' support extension '{}' but creation " - "failed (seems not supported), trying other addons and Kodi", - __func__, addonInfo->ID(), strExtension); - continue; - } - return result; - } + delete result; + CLog::Log(LOGINFO, + "CFileDirectoryFactory::{}: Addon '{}' support extension '{}' but creation " + "failed (seems not supported), trying other addons and Kodi", + __func__, addonInfo->ID(), strExtension); + continue; } + return result; } } diff --git a/xbmc/games/addons/GameClient.cpp b/xbmc/games/addons/GameClient.cpp index ec5c57b153f85..fcd980891f886 100644 --- a/xbmc/games/addons/GameClient.cpp +++ b/xbmc/games/addons/GameClient.cpp @@ -78,12 +78,12 @@ std::string NormalizeExtension(const std::string& strExtension) // --- CGameClient ------------------------------------------------------------- CGameClient::CGameClient(const ADDON::AddonInfoPtr& addonInfo) - : CAddonDll(addonInfo, ADDON::ADDON_GAMEDLL), + : CAddon(addonInfo, ADDON::ADDON_GAMEDLL)/*, m_subsystems(CGameClientSubsystem::CreateSubsystems(*this, m_struct, m_critSection)), m_bSupportsAllExtensions(false), m_bIsPlaying(false), m_serializeSize(0), - m_region(GAME_REGION_UNKNOWN) + m_region(GAME_REGION_UNKNOWN)*/ { using namespace ADDON; @@ -110,13 +110,18 @@ CGameClient::~CGameClient(void) CGameClientSubsystem::DestroySubsystems(m_subsystems); } +bool CGameClient::Initialized() +{ + return m_addonInstance != nullptr; +} + std::string CGameClient::LibPath() const { // If the game client requires a proxy, load its DLL instead - if (m_struct.props->proxy_dll_count > 0) - return GetDllPath(m_struct.props->proxy_dll_paths[0]); +// if (m_struct.props->proxy_dll_count > 0) +// return GetDllPath(m_struct.props->proxy_dll_paths[0]); - return CAddonDll::LibPath(); + return CAddon::LibPath(); } ADDON::AddonPtr CGameClient::GetRunningInstance() const @@ -160,24 +165,24 @@ bool CGameClient::Initialize(void) if (!AddonProperties().InitializeProperties()) return false; - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->CloseGame = cb_close_game; - m_struct.toKodi->OpenStream = cb_open_stream; - m_struct.toKodi->GetStreamBuffer = cb_get_stream_buffer; - m_struct.toKodi->AddStreamData = cb_add_stream_data; - m_struct.toKodi->ReleaseStreamBuffer = cb_release_stream_buffer; - m_struct.toKodi->CloseStream = cb_close_stream; - m_struct.toKodi->HwGetProcAddress = cb_hw_get_proc_address; - m_struct.toKodi->InputEvent = cb_input_event; - - memset(m_struct.toAddon, 0, sizeof(KodiToAddonFuncTable_Game)); - - if (CreateInstance(ADDON_INSTANCE_GAME, this, "", &m_struct, nullptr) == ADDON_STATUS_OK) - { - Input().Initialize(); - LogAddonProperties(); - return true; - } +// m_struct.toKodi->kodiInstance = this; +// m_struct.toKodi->CloseGame = cb_close_game; +// m_struct.toKodi->OpenStream = cb_open_stream; +// m_struct.toKodi->GetStreamBuffer = cb_get_stream_buffer; +// m_struct.toKodi->AddStreamData = cb_add_stream_data; +// m_struct.toKodi->ReleaseStreamBuffer = cb_release_stream_buffer; +// m_struct.toKodi->CloseStream = cb_close_stream; +// m_struct.toKodi->HwGetProcAddress = cb_hw_get_proc_address; +// m_struct.toKodi->InputEvent = cb_input_event; + +// memset(m_struct.toAddon, 0, sizeof(KodiToAddonFuncTable_Game)); + +// if (CreateInstance(ADDON_INSTANCE_GAME, this, "", &m_struct, nullptr) == ADDON_STATUS2_OK) +// { +// Input().Initialize(); +// LogAddonProperties(); +// return true; +// } return false; } @@ -186,7 +191,7 @@ void CGameClient::Unload() { Input().Deinitialize(); - DestroyInstance(this); +// DestroyInstance(this); } bool CGameClient::OpenFile(const CFileItem& file, @@ -222,21 +227,21 @@ bool CGameClient::OpenFile(const CFileItem& file, CSingleLock lock(m_critSection); - if (!Initialized()) - return false; +// if (!Initialized()) +// return false; CloseFile(); GAME_ERROR error = GAME_ERROR_FAILED; - try - { - LogError(error = m_struct.toAddon->LoadGame(&m_struct, path.c_str()), "LoadGame()"); - } - catch (...) - { - LogException("LoadGame()"); - } +// try +// { +// LogError(error = m_struct.toAddon->LoadGame(&m_struct, path.c_str()), "LoadGame()"); +// } +// catch (...) +// { +// LogException("LoadGame()"); +// } if (error != GAME_ERROR_NO_ERROR) { @@ -258,21 +263,21 @@ bool CGameClient::OpenStandalone(RETRO::IStreamManager& streamManager, IGameInpu CSingleLock lock(m_critSection); - if (!Initialized()) - return false; +// if (!Initialized()) +// return false; CloseFile(); GAME_ERROR error = GAME_ERROR_FAILED; - try - { - LogError(error = m_struct.toAddon->LoadStandalone(&m_struct), "LoadStandalone()"); - } - catch (...) - { - LogException("LoadStandalone()"); - } +// try +// { +// LogError(error = m_struct.toAddon->LoadStandalone(&m_struct), "LoadStandalone()"); +// } +// catch (...) +// { +// LogException("LoadStandalone()"); +// } if (error != GAME_ERROR_NO_ERROR) { @@ -292,92 +297,92 @@ bool CGameClient::InitializeGameplay(const std::string& gamePath, RETRO::IStreamManager& streamManager, IGameInputCallback* input) { - if (LoadGameInfo()) - { - Streams().Initialize(streamManager); - Input().Start(input); - - m_bIsPlaying = true; - m_gamePath = gamePath; - m_input = input; - - m_inGameSaves.reset(new CGameClientInGameSaves(this, &m_struct)); - m_inGameSaves->Load(); - - return true; - } +// if (LoadGameInfo()) +// { +// Streams().Initialize(streamManager); +// Input().Start(input); +// +// m_bIsPlaying = true; +// m_gamePath = gamePath; +// m_input = input; +// +// m_inGameSaves.reset(new CGameClientInGameSaves(this, &m_struct)); +// m_inGameSaves->Load(); +// +// return true; +// } return false; } bool CGameClient::LoadGameInfo() { - bool bRequiresGameLoop; - try - { - bRequiresGameLoop = m_struct.toAddon->RequiresGameLoop(&m_struct); - } - catch (...) - { - LogException("RequiresGameLoop()"); - return false; - } - - // Get information about system timings - // Can be called only after retro_load_game() - game_system_timing timingInfo = {}; - - bool bSuccess = false; - try - { - bSuccess = LogError(m_struct.toAddon->GetGameTiming(&m_struct, &timingInfo), "GetGameTiming()"); - } - catch (...) - { - LogException("GetGameTiming()"); - } - - if (!bSuccess) - { - CLog::Log(LOGERROR, "GameClient: Failed to get timing info"); - return false; - } - - GAME_REGION region; - try - { - region = m_struct.toAddon->GetRegion(&m_struct); - } - catch (...) - { - LogException("GetRegion()"); - return false; - } - - size_t serializeSize; - try - { - serializeSize = m_struct.toAddon->SerializeSize(&m_struct); - } - catch (...) - { - LogException("SerializeSize()"); - return false; - } - - CLog::Log(LOGINFO, "GAME: ---------------------------------------"); - CLog::Log(LOGINFO, "GAME: Game loop: {}", bRequiresGameLoop ? "true" : "false"); - CLog::Log(LOGINFO, "GAME: FPS: {:f}", timingInfo.fps); - CLog::Log(LOGINFO, "GAME: Sample Rate: {:f}", timingInfo.sample_rate); - CLog::Log(LOGINFO, "GAME: Region: {}", CGameClientTranslator::TranslateRegion(region)); - CLog::Log(LOGINFO, "GAME: Savestate size: {}", serializeSize); - CLog::Log(LOGINFO, "GAME: ---------------------------------------"); - - m_bRequiresGameLoop = bRequiresGameLoop; - m_serializeSize = serializeSize; - m_framerate = timingInfo.fps; - m_samplerate = timingInfo.sample_rate; - m_region = region; +// bool bRequiresGameLoop; +// try +// { +// bRequiresGameLoop = m_struct.toAddon->RequiresGameLoop(&m_struct); +// } +// catch (...) +// { +// LogException("RequiresGameLoop()"); +// return false; +// } +// +// // Get information about system timings +// // Can be called only after retro_load_game() +// game_system_timing timingInfo = {}; +// +// bool bSuccess = false; +// try +// { +// bSuccess = LogError(m_struct.toAddon->GetGameTiming(&m_struct, &timingInfo), "GetGameTiming()"); +// } +// catch (...) +// { +// LogException("GetGameTiming()"); +// } +// +// if (!bSuccess) +// { +// CLog::Log(LOGERROR, "GameClient: Failed to get timing info"); +// return false; +// } +// +// GAME_REGION region; +// try +// { +// region = m_struct.toAddon->GetRegion(&m_struct); +// } +// catch (...) +// { +// LogException("GetRegion()"); +// return false; +// } +// +// size_t serializeSize; +// try +// { +// serializeSize = m_struct.toAddon->SerializeSize(&m_struct); +// } +// catch (...) +// { +// LogException("SerializeSize()"); +// return false; +// } +// +// CLog::Log(LOGINFO, "GAME: ---------------------------------------"); +// CLog::Log(LOGINFO, "GAME: Game loop: {}", bRequiresGameLoop ? "true" : "false"); +// CLog::Log(LOGINFO, "GAME: FPS: {:f}", timingInfo.fps); +// CLog::Log(LOGINFO, "GAME: Sample Rate: {:f}", timingInfo.sample_rate); +// CLog::Log(LOGINFO, "GAME: Region: {}", CGameClientTranslator::TranslateRegion(region)); +// CLog::Log(LOGINFO, "GAME: Savestate size: {}", serializeSize); +// CLog::Log(LOGINFO, "GAME: ---------------------------------------"); +// +// m_bRequiresGameLoop = bRequiresGameLoop; +// m_serializeSize = serializeSize; +// m_framerate = timingInfo.fps; +// m_samplerate = timingInfo.sample_rate; +// m_region = region; return true; } @@ -433,75 +438,75 @@ std::string CGameClient::GetMissingResource() void CGameClient::Reset() { - CSingleLock lock(m_critSection); - - if (m_bIsPlaying) - { - try - { - LogError(m_struct.toAddon->Reset(&m_struct), "Reset()"); - } - catch (...) - { - LogException("Reset()"); - } - } +// CSingleLock lock(m_critSection); +// +// if (m_bIsPlaying) +// { +// try +// { +// LogError(m_struct.toAddon->Reset(&m_struct), "Reset()"); +// } +// catch (...) +// { +// LogException("Reset()"); +// } +// } } void CGameClient::CloseFile() { CSingleLock lock(m_critSection); - if (m_bIsPlaying) - { - m_inGameSaves->Save(); - m_inGameSaves.reset(); - - m_bIsPlaying = false; - m_gamePath.clear(); - m_serializeSize = 0; - m_input = nullptr; - - Input().Stop(); - - try - { - LogError(m_struct.toAddon->UnloadGame(&m_struct), "UnloadGame()"); - } - catch (...) - { - LogException("UnloadGame()"); - } - - Streams().Deinitialize(); - } +// if (m_bIsPlaying) +// { +// m_inGameSaves->Save(); +// m_inGameSaves.reset(); +// +// m_bIsPlaying = false; +// m_gamePath.clear(); +// m_serializeSize = 0; +// m_input = nullptr; +// +// Input().Stop(); +// +// try +// { +// LogError(m_struct.toAddon->UnloadGame(&m_struct), "UnloadGame()"); +// } +// catch (...) +// { +// LogException("UnloadGame()"); +// } +// +// Streams().Deinitialize(); +// } } void CGameClient::RunFrame() { IGameInputCallback* input; - { - CSingleLock lock(m_critSection); - input = m_input; - } - - if (input) - input->PollInput(); - - CSingleLock lock(m_critSection); - - if (m_bIsPlaying) - { - try - { - LogError(m_struct.toAddon->RunFrame(&m_struct), "RunFrame()"); - } - catch (...) - { - LogException("RunFrame()"); - } - } +// { +// CSingleLock lock(m_critSection); +// input = m_input; +// } +// +// if (input) +// input->PollInput(); +// +// CSingleLock lock(m_critSection); +// +// if (m_bIsPlaying) +// { +// try +// { +// LogError(m_struct.toAddon->RunFrame(&m_struct), "RunFrame()"); +// } +// catch (...) +// { +// LogException("RunFrame()"); +// } +// } } bool CGameClient::Serialize(uint8_t* data, size_t size) @@ -512,17 +517,17 @@ bool CGameClient::Serialize(uint8_t* data, size_t size) CSingleLock lock(m_critSection); bool bSuccess = false; - if (m_bIsPlaying) - { - try - { - bSuccess = LogError(m_struct.toAddon->Serialize(&m_struct, data, size), "Serialize()"); - } - catch (...) - { - LogException("Serialize()"); - } - } +// if (m_bIsPlaying) +// { +// try +// { +// bSuccess = LogError(m_struct.toAddon->Serialize(&m_struct, data, size), "Serialize()"); +// } +// catch (...) +// { +// LogException("Serialize()"); +// } +// } return bSuccess; } @@ -535,17 +540,17 @@ bool CGameClient::Deserialize(const uint8_t* data, size_t size) CSingleLock lock(m_critSection); bool bSuccess = false; - if (m_bIsPlaying) - { - try - { - bSuccess = LogError(m_struct.toAddon->Deserialize(&m_struct, data, size), "Deserialize()"); - } - catch (...) - { - LogException("Deserialize()"); - } - } +// if (m_bIsPlaying) +// { +// try +// { +// bSuccess = LogError(m_struct.toAddon->Deserialize(&m_struct, data, size), "Deserialize()"); +// } +// catch (...) +// { +// LogException("Deserialize()"); +// } +// } return bSuccess; } @@ -581,7 +586,7 @@ void CGameClient::LogException(const char* strFunctionName) const } -void CGameClient::cb_close_game(KODI_HANDLE kodiInstance) +void CGameClient::cb_close_game() { using namespace MESSAGING; @@ -589,21 +594,15 @@ void CGameClient::cb_close_game(KODI_HANDLE kodiInstance) static_cast(new CAction(ACTION_STOP))); } -KODI_GAME_STREAM_HANDLE CGameClient::cb_open_stream(KODI_HANDLE kodiInstance, - const game_stream_properties* properties) +KODI_GAME_STREAM_HANDLE CGameClient::cb_open_stream(const game_stream_properties* properties) { if (properties == nullptr) return nullptr; - CGameClient* gameClient = static_cast(kodiInstance); - if (gameClient == nullptr) - return nullptr; - - return gameClient->Streams().OpenStream(*properties); + return Streams().OpenStream(*properties); } -bool CGameClient::cb_get_stream_buffer(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, +bool CGameClient::cb_get_stream_buffer(KODI_GAME_STREAM_HANDLE stream, unsigned int width, unsigned int height, game_stream_buffer* buffer) @@ -618,8 +617,7 @@ bool CGameClient::cb_get_stream_buffer(KODI_HANDLE kodiInstance, return gameClientStream->GetBuffer(width, height, *buffer); } -void CGameClient::cb_add_stream_data(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, +void CGameClient::cb_add_stream_data(KODI_GAME_STREAM_HANDLE stream, const game_stream_packet* packet) { if (packet == nullptr) @@ -632,8 +630,7 @@ void CGameClient::cb_add_stream_data(KODI_HANDLE kodiInstance, gameClientStream->AddData(*packet); } -void CGameClient::cb_release_stream_buffer(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, +void CGameClient::cb_release_stream_buffer(KODI_GAME_STREAM_HANDLE stream, game_stream_buffer* buffer) { if (buffer == nullptr) @@ -646,37 +643,25 @@ void CGameClient::cb_release_stream_buffer(KODI_HANDLE kodiInstance, gameClientStream->ReleaseBuffer(*buffer); } -void CGameClient::cb_close_stream(KODI_HANDLE kodiInstance, KODI_GAME_STREAM_HANDLE stream) +void CGameClient::cb_close_stream(KODI_GAME_STREAM_HANDLE stream) { - CGameClient* gameClient = static_cast(kodiInstance); - if (gameClient == nullptr) - return; - IGameClientStream* gameClientStream = static_cast(stream); if (gameClientStream == nullptr) return; - gameClient->Streams().CloseStream(gameClientStream); + Streams().CloseStream(gameClientStream); } -game_proc_address_t CGameClient::cb_hw_get_proc_address(KODI_HANDLE kodiInstance, const char* sym) +game_proc_address_t CGameClient::cb_hw_get_proc_address(const char* sym) { - CGameClient* gameClient = static_cast(kodiInstance); - if (!gameClient) - return nullptr; - //! @todo return nullptr; } -bool CGameClient::cb_input_event(KODI_HANDLE kodiInstance, const game_input_event* event) +bool CGameClient::cb_input_event(const game_input_event* event) { - CGameClient* gameClient = static_cast(kodiInstance); - if (!gameClient) - return false; - if (event == nullptr) return false; - return gameClient->Input().ReceiveInputEvent(*event); + return Input().ReceiveInputEvent(*event); } diff --git a/xbmc/games/addons/GameClient.h b/xbmc/games/addons/GameClient.h index 7e4e47dc84f39..95a15bf13eb74 100644 --- a/xbmc/games/addons/GameClient.h +++ b/xbmc/games/addons/GameClient.h @@ -9,8 +9,8 @@ #pragma once #include "GameClientSubsystem.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/Addon.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "threads/CriticalSection.h" #include @@ -40,26 +40,26 @@ class IGameInputCallback; * \ingroup games * \brief Helper class to have "C" struct created before other parts becomes his pointer. */ -class CGameClientStruct -{ -public: - CGameClientStruct() - { - // Create "C" interface structures, used as own parts to prevent API problems on update - m_struct.props = new AddonProps_Game(); - m_struct.toKodi = new AddonToKodiFuncTable_Game(); - m_struct.toAddon = new KodiToAddonFuncTable_Game(); - } - - ~CGameClientStruct() - { - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; - } - - AddonInstance_Game m_struct; -}; +// class CGameClientStruct +// { +// public: +// CGameClientStruct() +// { +// // Create "C" interface structures, used as own parts to prevent API problems on update +// m_struct.props = new AddonProps_Game(); +// m_struct.toKodi = new AddonToKodiFuncTable_Game(); +// m_struct.toAddon = new KodiToAddonFuncTable_Game(); +// } +// +// ~CGameClientStruct() +// { +// delete m_struct.toAddon; +// delete m_struct.toKodi; +// delete m_struct.props; +// } +// +// AddonInstance_Game m_struct; +// }; /*! * \ingroup games @@ -90,13 +90,15 @@ class CGameClientStruct * from 1,200 lines to just over 600. Reducing this further is the challenge. * You must now choose whether to accept. */ -class CGameClient : public ADDON::CAddonDll, private CGameClientStruct +class CGameClient : public ADDON::CAddon { public: explicit CGameClient(const ADDON::AddonInfoPtr& addonInfo); ~CGameClient() override; + bool Initialized(); + // Game subsystems (const) const CGameClientInput& Input() const { return *m_subsystems.Input; } const CGameClientProperties& AddonProperties() const { return *m_subsystems.AddonProperties; } @@ -143,17 +145,45 @@ class CGameClient : public ADDON::CAddonDll, private CGameClientStruct bool Serialize(uint8_t* data, size_t size); bool Deserialize(const uint8_t* data, size_t size); - /*! - * @brief To get the interface table used between addon and kodi - * @todo This function becomes removed after old callback library system - * is removed. - */ - AddonInstance_Game* GetInstanceInterface() { return &m_struct; } - // Helper functions bool LogError(GAME_ERROR error, const char* strMethod) const; void LogException(const char* strFunctionName) const; + /*! + * @brief Callback functions from addon to kodi + */ + //@{ + void cb_close_game(); + /*---AUTO_GEN_PARSE---*/ + + KODI_GAME_STREAM_HANDLE cb_open_stream(const game_stream_properties* properties); + /*---AUTO_GEN_PARSE---*/ + + bool cb_get_stream_buffer(KODI_GAME_STREAM_HANDLE stream, + unsigned int width, + unsigned int height, + game_stream_buffer* buffer); + /*---AUTO_GEN_PARSE---*/ + + void cb_add_stream_data(KODI_GAME_STREAM_HANDLE stream, + const game_stream_packet* packet); + /*---AUTO_GEN_PARSE---*/ + + void cb_release_stream_buffer(KODI_GAME_STREAM_HANDLE stream, + game_stream_buffer* buffer); + /*---AUTO_GEN_PARSE---*/ + + void cb_close_stream(KODI_GAME_STREAM_HANDLE stream); + /*---AUTO_GEN_PARSE---*/ + + game_proc_address_t cb_hw_get_proc_address(const char* sym); + /*---AUTO_GEN_PARSE---*/ + + bool cb_input_event(const game_input_event* event); + /*---AUTO_GEN_PARSE---*/ + + //@} + private: // Private gameplay functions bool InitializeGameplay(const std::string& gamePath, @@ -166,29 +196,6 @@ class CGameClient : public ADDON::CAddonDll, private CGameClientStruct // Helper functions void LogAddonProperties(void) const; - /*! - * @brief Callback functions from addon to kodi - */ - //@{ - static void cb_close_game(KODI_HANDLE kodiInstance); - static KODI_GAME_STREAM_HANDLE cb_open_stream(KODI_HANDLE kodiInstance, - const game_stream_properties* properties); - static bool cb_get_stream_buffer(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, - unsigned int width, - unsigned int height, - game_stream_buffer* buffer); - static void cb_add_stream_data(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, - const game_stream_packet* packet); - static void cb_release_stream_buffer(KODI_HANDLE kodiInstance, - KODI_GAME_STREAM_HANDLE stream, - game_stream_buffer* buffer); - static void cb_close_stream(KODI_HANDLE kodiInstance, KODI_GAME_STREAM_HANDLE stream); - static game_proc_address_t cb_hw_get_proc_address(KODI_HANDLE kodiInstance, const char* sym); - static bool cb_input_event(KODI_HANDLE kodiInstance, const game_input_event* event); - //@} - // Game subsystems GameClientSubsystems m_subsystems; @@ -213,6 +220,8 @@ class CGameClient : public ADDON::CAddonDll, private CGameClientStruct std::unique_ptr m_inGameSaves; CCriticalSection m_critSection; + + KODI_HANDLE m_addonInstance; }; } // namespace GAME diff --git a/xbmc/games/addons/GameClientInGameSaves.cpp b/xbmc/games/addons/GameClientInGameSaves.cpp index 802ebb71ff375..3a4c93ea64286 100644 --- a/xbmc/games/addons/GameClientInGameSaves.cpp +++ b/xbmc/games/addons/GameClientInGameSaves.cpp @@ -20,6 +20,7 @@ #include using namespace KODI; +using namespace KODI::ADDONS::INTERFACE; using namespace GAME; #define INGAME_SAVES_DIRECTORY "InGameSaves" @@ -27,11 +28,13 @@ using namespace GAME; #define INGAME_SAVES_EXTENSION_RTC ".rtc" CGameClientInGameSaves::CGameClientInGameSaves(CGameClient* addon, - const AddonInstance_Game* dllStruct) - : m_gameClient(addon), m_dllStruct(dllStruct) + CHdl_kodi_addoninstance_game_h* gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl) + : m_gameClient(addon), m_gameClientIfc(gameClientIfc), m_gameClientHdl(gameClientHdl) { assert(m_gameClient != nullptr); - assert(m_dllStruct != nullptr); + assert(m_gameClientIfc != nullptr); + assert(m_gameClientHdl != nullptr); } void CGameClientInGameSaves::Load() @@ -78,11 +81,11 @@ void CGameClientInGameSaves::Load(GAME_MEMORY memoryType) try { - m_dllStruct->toAddon->GetMemory(m_dllStruct, memoryType, &gameMemory, &size); + m_gameClientIfc->kodi_addon_game_get_memory_v1(m_gameClientHdl, memoryType, &gameMemory, &size); } catch (...) { - CLog::Log(LOGERROR, "GAME: {}: Exception caught in GetMemory()", m_gameClient->ID()); + CLog::Log(LOGERROR, "GAME: %s: Exception caught in kodi_addon_game_get_memory()", m_gameClient->ID()); } const std::string path = GetPath(memoryType); @@ -123,11 +126,11 @@ void CGameClientInGameSaves::Save(GAME_MEMORY memoryType) try { - m_dllStruct->toAddon->GetMemory(m_dllStruct, memoryType, &gameMemory, &size); + m_gameClientIfc->kodi_addon_game_get_memory_v1(m_gameClientHdl, memoryType, &gameMemory, &size); } catch (...) { - CLog::Log(LOGERROR, "GAME: {}: Exception caught in GetMemory()", m_gameClient->ID()); + CLog::Log(LOGERROR, "GAME: {}: Exception caught in kodi_addon_game_get_memory()", m_gameClient->ID()); } if (size > 0) diff --git a/xbmc/games/addons/GameClientInGameSaves.h b/xbmc/games/addons/GameClientInGameSaves.h index a75c155d672ae..9c23460963dd6 100644 --- a/xbmc/games/addons/GameClientInGameSaves.h +++ b/xbmc/games/addons/GameClientInGameSaves.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/interface/api/addon-instance/game.h" #include @@ -41,7 +41,9 @@ class CGameClientInGameSaves * \param addon The game client implementation. * \param dllStruct The emulator or game for which the in-game saves are processed. */ - CGameClientInGameSaves(CGameClient* addon, const AddonInstance_Game* dllStruct); + CGameClientInGameSaves(CGameClient* addon, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h* gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl); /*! * \brief Load in-game data. @@ -60,7 +62,8 @@ class CGameClientInGameSaves void Save(GAME_MEMORY memoryType); const CGameClient* const m_gameClient; - const AddonInstance_Game* const m_dllStruct; + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h* const m_gameClientIfc; + const KODI_ADDON_GAME_HDL m_gameClientHdl; }; } // namespace GAME } // namespace KODI diff --git a/xbmc/games/addons/GameClientProperties.cpp b/xbmc/games/addons/GameClientProperties.cpp index 14ef38d5b256b..0927651026dd2 100644 --- a/xbmc/games/addons/GameClientProperties.cpp +++ b/xbmc/games/addons/GameClientProperties.cpp @@ -30,8 +30,8 @@ using namespace XFILE; #define GAME_CLIENT_RESOURCES_DIRECTORY "resources" -CGameClientProperties::CGameClientProperties(const CGameClient& parent, AddonProps_Game& props) - : m_parent(parent), m_properties(props) +CGameClientProperties::CGameClientProperties(const CGameClient& parent) + : m_parent(parent) { } @@ -76,7 +76,7 @@ const char* CGameClientProperties::GetLibraryPath(void) if (m_strLibraryPath.empty()) { // Get the parent add-on's real path - std::string strLibPath = m_parent.CAddonDll::LibPath(); + std::string strLibPath = m_parent.CAddon::LibPath(); m_strLibraryPath = CSpecialProtocol::TranslatePath(strLibPath); URIUtils::RemoveSlashAtEnd(m_strLibraryPath); } diff --git a/xbmc/games/addons/GameClientProperties.h b/xbmc/games/addons/GameClientProperties.h index 83a44171c1de8..a470b117846b0 100644 --- a/xbmc/games/addons/GameClientProperties.h +++ b/xbmc/games/addons/GameClientProperties.h @@ -9,13 +9,13 @@ #pragma once #include "addons/Addon.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/GameTypes.h" #include #include -struct AddonProps_Game; +struct GAME_PROPS; namespace KODI { @@ -33,11 +33,13 @@ class CGameClient; class CGameClientProperties { public: - CGameClientProperties(const CGameClient& parent, AddonProps_Game& props); + CGameClientProperties(const CGameClient& parent); ~CGameClientProperties(void) { ReleaseResources(); } bool InitializeProperties(void); + GAME_PROPS& GetProperties() { return m_properties; } + private: // Release mutable resources void ReleaseResources(void); @@ -73,7 +75,7 @@ class CGameClientProperties // Construction parameters const CGameClient& m_parent; - AddonProps_Game& m_properties; + GAME_PROPS m_properties; // Buffers to hold the strings std::string m_strLibraryPath; diff --git a/xbmc/games/addons/GameClientSubsystem.cpp b/xbmc/games/addons/GameClientSubsystem.cpp index d3ed56878b934..16ad937d72bda 100644 --- a/xbmc/games/addons/GameClientSubsystem.cpp +++ b/xbmc/games/addons/GameClientSubsystem.cpp @@ -10,30 +10,33 @@ #include "GameClient.h" #include "GameClientProperties.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/addons/input/GameClientInput.h" #include "games/addons/streams/GameClientStreams.h" using namespace KODI; +using namespace KODI::ADDONS::INTERFACE; using namespace GAME; CGameClientSubsystem::CGameClientSubsystem(CGameClient& gameClient, - AddonInstance_Game& addonStruct, + CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess) - : m_gameClient(gameClient), m_struct(addonStruct), m_clientAccess(clientAccess) + : m_gameClient(gameClient), m_gameClientIfc(gameClientIfc), m_gameClientHdl(gameClientHdl), m_clientAccess(clientAccess) { } CGameClientSubsystem::~CGameClientSubsystem() = default; GameClientSubsystems CGameClientSubsystem::CreateSubsystems(CGameClient& gameClient, - AddonInstance_Game& gameStruct, + CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess) { GameClientSubsystems subsystems = {}; - subsystems.Input.reset(new CGameClientInput(gameClient, gameStruct, clientAccess)); - subsystems.AddonProperties.reset(new CGameClientProperties(gameClient, *gameStruct.props)); + subsystems.Input.reset(new CGameClientInput(gameClient, gameClientIfc, gameClientHdl, clientAccess)); + subsystems.AddonProperties.reset(new CGameClientProperties(gameClient)); subsystems.Streams.reset(new CGameClientStreams(gameClient)); return subsystems; diff --git a/xbmc/games/addons/GameClientSubsystem.h b/xbmc/games/addons/GameClientSubsystem.h index e9e7c91ac7ccb..0c52ca2b7f3b6 100644 --- a/xbmc/games/addons/GameClientSubsystem.h +++ b/xbmc/games/addons/GameClientSubsystem.h @@ -8,9 +8,10 @@ #pragma once +#include "addons/interface/api/addon-instance/game.h" + #include -struct AddonInstance_Game; class CCriticalSection; namespace KODI @@ -36,7 +37,8 @@ class CGameClientSubsystem { protected: CGameClientSubsystem(CGameClient& gameClient, - AddonInstance_Game& addonStruct, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess); virtual ~CGameClientSubsystem(); @@ -52,7 +54,8 @@ class CGameClientSubsystem * \return A fully-allocated GameClientSubsystems struct */ static GameClientSubsystems CreateSubsystems(CGameClient& gameClient, - AddonInstance_Game& gameStruct, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& gameStruct, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess); /*! @@ -70,7 +73,8 @@ class CGameClientSubsystem // Construction parameters CGameClient& m_gameClient; - AddonInstance_Game& m_struct; + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& m_gameClientIfc; + const KODI_ADDON_GAME_HDL m_gameClientHdl; CCriticalSection& m_clientAccess; }; diff --git a/xbmc/games/addons/GameClientTranslator.h b/xbmc/games/addons/GameClientTranslator.h index 6b6b448a2f03f..5bee806eb95bb 100644 --- a/xbmc/games/addons/GameClientTranslator.h +++ b/xbmc/games/addons/GameClientTranslator.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "cores/RetroPlayer/streams/RetroPlayerStreamTypes.h" #include "games/controllers/ControllerTypes.h" #include "input/keyboard/KeyboardTypes.h" diff --git a/xbmc/games/addons/input/GameClientController.h b/xbmc/games/addons/input/GameClientController.h index ef39e200314bc..5f50434727aa1 100644 --- a/xbmc/games/addons/input/GameClientController.h +++ b/xbmc/games/addons/input/GameClientController.h @@ -20,9 +20,10 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/controllers/ControllerTypes.h" +#include #include namespace KODI diff --git a/xbmc/games/addons/input/GameClientDevice.cpp b/xbmc/games/addons/input/GameClientDevice.cpp index 317447da5055b..d2fcf15eb380e 100644 --- a/xbmc/games/addons/input/GameClientDevice.cpp +++ b/xbmc/games/addons/input/GameClientDevice.cpp @@ -10,7 +10,7 @@ #include "GameClientPort.h" #include "ServiceBroker.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/GameServices.h" #include "games/controllers/Controller.h" #include "games/controllers/ControllerTopology.h" diff --git a/xbmc/games/addons/input/GameClientInput.cpp b/xbmc/games/addons/input/GameClientInput.cpp index 7b826b434e219..8673860fe6260 100644 --- a/xbmc/games/addons/input/GameClientInput.cpp +++ b/xbmc/games/addons/input/GameClientInput.cpp @@ -16,7 +16,6 @@ #include "GameClientPort.h" #include "GameClientTopology.h" #include "ServiceBroker.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" #include "games/GameServices.h" #include "games/addons/GameClient.h" #include "games/addons/GameClientCallbacks.h" @@ -31,12 +30,14 @@ #include using namespace KODI; +using namespace KODI::ADDONS::INTERFACE; using namespace GAME; CGameClientInput::CGameClientInput(CGameClient& gameClient, - AddonInstance_Game& addonStruct, + CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess) - : CGameClientSubsystem(gameClient, addonStruct, clientAccess), m_topology(new CGameClientTopology) + : CGameClientSubsystem(gameClient, gameClientIfc, gameClientHdl, clientAccess), m_topology(new CGameClientTopology) { } @@ -138,7 +139,7 @@ bool CGameClientInput::HasFeature(const std::string& controllerId, try { bHasFeature = - m_struct.toAddon->HasFeature(&m_struct, controllerId.c_str(), featureName.c_str()); + m_gameClientIfc.kodi_addon_game_has_feature_v1(m_gameClientHdl, controllerId.c_str(), featureName.c_str()); } catch (...) { @@ -165,7 +166,7 @@ bool CGameClientInput::InputEvent(const game_input_event& event) try { - bHandled = m_struct.toAddon->InputEvent(&m_struct, &event); + bHandled = m_gameClientIfc.kodi_addon_game_input_event_v1(m_gameClientHdl, &event); } catch (...) { @@ -183,7 +184,7 @@ void CGameClientInput::LoadTopology() { try { - topologyStruct = m_struct.toAddon->GetTopology(&m_struct); + topologyStruct = m_gameClientIfc.kodi_addon_game_get_topology_v1(m_gameClientHdl); } catch (...) { @@ -209,7 +210,7 @@ void CGameClientInput::LoadTopology() try { - m_struct.toAddon->FreeTopology(&m_struct, topologyStruct); + m_gameClientIfc.kodi_addon_game_free_topology_v1(m_gameClientHdl, topologyStruct); } catch (...) { @@ -253,7 +254,7 @@ void CGameClientInput::SetControllerLayouts(const ControllerVector& controllers) try { - m_struct.toAddon->SetControllerLayouts(&m_struct, controllerStructs.data(), + m_gameClientIfc.kodi_addon_game_set_controller_layouts_v1(m_gameClientHdl, controllerStructs.data(), static_cast(controllerStructs.size())); } catch (...) @@ -335,7 +336,7 @@ bool CGameClientInput::OpenKeyboard(const ControllerPtr& controller) { try { - bSuccess = m_struct.toAddon->EnableKeyboard(&m_struct, true, controller->ID().c_str()); + bSuccess = m_gameClientIfc.kodi_addon_game_enable_keyboard_v1(m_gameClientHdl, true, controller->ID().c_str()); } catch (...) { @@ -365,7 +366,7 @@ void CGameClientInput::CloseKeyboard() { try { - m_struct.toAddon->EnableKeyboard(&m_struct, false, ""); + m_gameClientIfc.kodi_addon_game_enable_keyboard_v1(m_gameClientHdl, false, ""); } catch (...) { @@ -400,7 +401,7 @@ bool CGameClientInput::OpenMouse(const ControllerPtr& controller) { try { - bSuccess = m_struct.toAddon->EnableMouse(&m_struct, true, controller->ID().c_str()); + bSuccess = m_gameClientIfc.kodi_addon_game_enable_mouse_v1(m_gameClientHdl, true, controller->ID().c_str()); } catch (...) { @@ -429,7 +430,7 @@ void CGameClientInput::CloseMouse() { try { - m_struct.toAddon->EnableMouse(&m_struct, false, ""); + m_gameClientIfc.kodi_addon_game_enable_mouse_v1(m_gameClientHdl, false, ""); } catch (...) { @@ -468,7 +469,7 @@ bool CGameClientInput::OpenJoystick(const std::string& portAddress, const Contro { try { - bSuccess = m_struct.toAddon->ConnectController(&m_struct, true, portAddress.c_str(), + bSuccess = m_gameClientIfc.kodi_addon_game_connect_controller_v1(m_gameClientHdl, true, portAddress.c_str(), controller->ID().c_str()); } catch (...) @@ -513,7 +514,7 @@ void CGameClientInput::CloseJoystick(const std::string& portAddress) { try { - m_struct.toAddon->ConnectController(&m_struct, false, portAddress.c_str(), ""); + m_gameClientIfc.kodi_addon_game_connect_controller_v1(m_gameClientHdl, false, portAddress.c_str(), ""); } catch (...) { diff --git a/xbmc/games/addons/input/GameClientInput.h b/xbmc/games/addons/input/GameClientInput.h index 19989f92b910c..b90ed784b8425 100644 --- a/xbmc/games/addons/input/GameClientInput.h +++ b/xbmc/games/addons/input/GameClientInput.h @@ -43,7 +43,8 @@ class CGameClientInput : protected CGameClientSubsystem, public Observer { public: CGameClientInput(CGameClient& gameClient, - AddonInstance_Game& addonStruct, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, CCriticalSection& clientAccess); ~CGameClientInput() override; diff --git a/xbmc/games/addons/input/GameClientKeyboard.cpp b/xbmc/games/addons/input/GameClientKeyboard.cpp index 7c978da3eeb63..9a8969369886d 100644 --- a/xbmc/games/addons/input/GameClientKeyboard.cpp +++ b/xbmc/games/addons/input/GameClientKeyboard.cpp @@ -9,7 +9,7 @@ #include "GameClientKeyboard.h" #include "GameClientInput.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/addons/GameClient.h" #include "games/addons/GameClientTranslator.h" #include "input/keyboard/interfaces/IKeyboardInputProvider.h" diff --git a/xbmc/games/addons/input/GameClientMouse.cpp b/xbmc/games/addons/input/GameClientMouse.cpp index dd592cdd7a5f4..4318181f899fd 100644 --- a/xbmc/games/addons/input/GameClientMouse.cpp +++ b/xbmc/games/addons/input/GameClientMouse.cpp @@ -9,7 +9,7 @@ #include "GameClientMouse.h" #include "GameClientInput.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/addons/GameClient.h" #include "input/mouse/interfaces/IMouseInputProvider.h" diff --git a/xbmc/games/addons/input/GameClientPort.cpp b/xbmc/games/addons/input/GameClientPort.cpp index edce03a16a7f9..5475d54348b06 100644 --- a/xbmc/games/addons/input/GameClientPort.cpp +++ b/xbmc/games/addons/input/GameClientPort.cpp @@ -9,7 +9,7 @@ #include "GameClientPort.h" #include "GameClientDevice.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "games/addons/GameClientTranslator.h" #include "games/controllers/Controller.h" #include "games/controllers/ControllerTopology.h" diff --git a/xbmc/games/addons/streams/GameClientStreamAudio.h b/xbmc/games/addons/streams/GameClientStreamAudio.h index d48b0a66fcbd8..928375bd74025 100644 --- a/xbmc/games/addons/streams/GameClientStreamAudio.h +++ b/xbmc/games/addons/streams/GameClientStreamAudio.h @@ -9,7 +9,7 @@ #pragma once #include "IGameClientStream.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include diff --git a/xbmc/games/addons/streams/GameClientStreamSwFramebuffer.cpp b/xbmc/games/addons/streams/GameClientStreamSwFramebuffer.cpp index 4d1e8af1283b3..db66ca418e8b3 100644 --- a/xbmc/games/addons/streams/GameClientStreamSwFramebuffer.cpp +++ b/xbmc/games/addons/streams/GameClientStreamSwFramebuffer.cpp @@ -8,7 +8,7 @@ #include "GameClientStreamSwFramebuffer.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "cores/RetroPlayer/streams/RetroPlayerVideo.h" #include "games/addons/GameClientTranslator.h" diff --git a/xbmc/games/addons/streams/GameClientStreams.h b/xbmc/games/addons/streams/GameClientStreams.h index 6f3f63993bb48..2e6b051f7b436 100644 --- a/xbmc/games/addons/streams/GameClientStreams.h +++ b/xbmc/games/addons/streams/GameClientStreams.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/kodi-dev-kit/include/kodi/addon-instance/Game.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "cores/RetroPlayer/streams/RetroPlayerStreamTypes.h" #include diff --git a/xbmc/guilib/GUIVisualisationControl.cpp b/xbmc/guilib/GUIVisualisationControl.cpp index aa008a0a3e77c..ee7b142651b5a 100644 --- a/xbmc/guilib/GUIVisualisationControl.cpp +++ b/xbmc/guilib/GUIVisualisationControl.cpp @@ -439,8 +439,8 @@ void CGUIVisualisationControl::CreateBuffers() if (m_instance) m_instance->GetInfo(&info); - m_numBuffers = info.iSyncDelay + 1; - m_wantsFreq = info.bWantsFreq; + m_numBuffers = info.sync_delay + 1; + m_wantsFreq = info.wants_freq; if (m_numBuffers > MAX_AUDIO_BUFFERS) m_numBuffers = MAX_AUDIO_BUFFERS; if (m_numBuffers < 1) diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp index 7731d35b6b1f5..a03e9b8443785 100644 --- a/xbmc/guilib/GUIWindowManager.cpp +++ b/xbmc/guilib/GUIWindowManager.cpp @@ -17,7 +17,7 @@ #include "WindowIDs.h" #include "addons/Skin.h" #include "addons/gui/GUIWindowAddonBrowser.h" -#include "addons/interfaces/gui/Window.h" +#include "addons/interface/api/gui/window.h" #include "events/windows/GUIWindowEventLog.h" #include "favourites/GUIDialogFavourites.h" #include "input/Key.h" @@ -993,7 +993,7 @@ void CGUIWindowManager::OnApplicationMessage(ThreadMessage* pMsg) { if (pMsg->lpVoid) { - static_cast(pMsg->lpVoid)->Show_Internal(pMsg->param2 > 0); + static_cast(pMsg->lpVoid)->Show_Internal(pMsg->param2 > 0); } } break; diff --git a/xbmc/guilib/WindowIDs.h b/xbmc/guilib/WindowIDs.h index e8d302cc073f8..0a228386e30c9 100644 --- a/xbmc/guilib/WindowIDs.h +++ b/xbmc/guilib/WindowIDs.h @@ -92,6 +92,7 @@ #define WINDOW_DIALOG_INFOPROVIDER_SETTINGS 10158 #define WINDOW_DIALOG_SUBTITLE_OSD_SETTINGS 10159 #define WINDOW_DIALOG_BUSY_NOCANCEL 10160 +#define WINDOW_DIALOG_ADDON_CRASH_REPORTER 10161 #define WINDOW_MUSIC_PLAYLIST 10500 #define WINDOW_MUSIC_NAV 10502 diff --git a/xbmc/guilib/imagefactory.cpp b/xbmc/guilib/imagefactory.cpp index 277985e9e5bba..8516e4c8aace1 100644 --- a/xbmc/guilib/imagefactory.cpp +++ b/xbmc/guilib/imagefactory.cpp @@ -45,8 +45,12 @@ IImage* ImageFactory::CreateLoaderFromMimeType(const std::string& strMimeType) if (std::find(mime.begin(), mime.end(), strMimeType) != mime.end()) { CSingleLock lock(m_createSec); - CImageDecoder* result = new CImageDecoder(addonInfo); - result->Create(strMimeType); + CImageDecoder* result = new CImageDecoder(addonInfo, strMimeType); + if (!result->Create()) + { + delete result; + result = nullptr; + } return result; } } diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp index 76f6d5de4b0e7..6260fce9f3049 100644 --- a/xbmc/music/MusicDatabase.cpp +++ b/xbmc/music/MusicDatabase.cpp @@ -23,6 +23,7 @@ #include "addons/AddonManager.h" #include "addons/AddonSystemSettings.h" #include "addons/Scraper.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/audiodecoder.h" #include "dbwrappers/dataset.h" #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogProgress.h" @@ -4102,10 +4103,11 @@ bool CMusicDatabase::CleanupSongsByIds(const std::string& strSongIds) std::string strFileName = URIUtils::AddFileToFolder( m_pDS->fv("path.strPath").get_asString(), m_pDS->fv("song.strFileName").get_asString()); - // Special case for streams inside an ogg file. (oggstream) - // The last dir in the path is the ogg file that + // Special case for streams inside an audio decoder package file. + // The last dir in the path is the audio file that // contains the stream, so test if its there - if (URIUtils::HasExtension(strFileName, ".oggstream|.nsfstream")) + if (StringUtils::EndsWith(URIUtils::GetExtension(strFileName), + KODI_ADDON_AUDIODECODER_TRACK_EXT)) { strFileName = URIUtils::GetDirectory(strFileName); // we are dropping back to a file, so remove the slash at end diff --git a/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp b/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp index ee2050342f79c..4ba879a491594 100644 --- a/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp +++ b/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp @@ -44,41 +44,28 @@ IMusicInfoTagLoader* CMusicInfoTagLoaderFactory::CreateLoader(const CFileItem& i if (strExtension.empty()) return NULL; - std::vector addonInfos; - CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + std::vector> addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetExtensionSupportedAddonInfos( + "." + strExtension, addonInfos, CAudioDecoderSupportList::FilterSelect::hasTags); for (const auto& addonInfo : addonInfos) { - if (CAudioDecoder::HasTags(addonInfo)) + CAudioDecoder* result = new CAudioDecoder(addonInfo); + if (!result->CreateDecoder() && result->CanOperateFile(item.GetPath())) { - auto exts = StringUtils::Split(CAudioDecoder::GetExtensions(addonInfo), "|"); - if (std::find(exts.begin(), exts.end(), "." + strExtension) != exts.end()) - { - CAudioDecoder* result = new CAudioDecoder(addonInfo); - if (!result->CreateDecoder()) - { - delete result; - return nullptr; - } - return result; - } + delete result; + continue; } + return result; } - if (strExtension == "aac" || - strExtension == "ape" || strExtension == "mac" || - strExtension == "mp3" || - strExtension == "wma" || - strExtension == "flac" || + if (strExtension == "aac" || strExtension == "ape" || strExtension == "mac" || + strExtension == "mp3" || strExtension == "wma" || strExtension == "flac" || strExtension == "m4a" || strExtension == "mp4" || strExtension == "m4b" || - strExtension == "m4v" || - strExtension == "mpc" || strExtension == "mpp" || strExtension == "mp+" || - strExtension == "ogg" || strExtension == "oga" || strExtension == "oggstream" || - strExtension == "opus" || - strExtension == "aif" || strExtension == "aiff" || - strExtension == "wav" || - strExtension == "mod" || - strExtension == "s3m" || strExtension == "it" || strExtension == "xm" || - strExtension == "wv") + strExtension == "m4v" || strExtension == "mpc" || strExtension == "mpp" || + strExtension == "mp+" || strExtension == "ogg" || strExtension == "oga" || + strExtension == "opus" || strExtension == "aif" || strExtension == "aiff" || + strExtension == "wav" || strExtension == "mod" || strExtension == "s3m" || + strExtension == "it" || strExtension == "xm" || strExtension == "wv") { CTagLoaderTagLib *pTagLoader = new CTagLoaderTagLib(); return pTagLoader; diff --git a/xbmc/peripherals/addons/PeripheralAddon.cpp b/xbmc/peripherals/addons/PeripheralAddon.cpp index 7c32d726e0850..6f48bf3ddcc08 100644 --- a/xbmc/peripherals/addons/PeripheralAddon.cpp +++ b/xbmc/peripherals/addons/PeripheralAddon.cpp @@ -10,6 +10,7 @@ #include "PeripheralAddonTranslator.h" #include "addons/AddonManager.h" +#include "addons/interface/api/addon-instance/peripheral.h" #include "filesystem/Directory.h" #include "filesystem/SpecialProtocol.h" #include "games/controllers/Controller.h" @@ -57,63 +58,32 @@ CPeripheralAddon::CPeripheralAddon(const ADDON::AddonInfoPtr& addonInfo, CPeriph addonInfo->Type(ADDON::ADDON_PERIPHERALDLL)->GetValue("@provides_joysticks").asBoolean(); m_bProvidesButtonMaps = addonInfo->Type(ADDON::ADDON_PERIPHERALDLL)->GetValue("@provides_buttonmaps").asBoolean(); - - // Create "C" interface structures, used as own parts to prevent API problems on update - m_struct.props = new AddonProps_Peripheral(); - m_struct.toAddon = new KodiToAddonFuncTable_Peripheral(); - m_struct.toKodi = new AddonToKodiFuncTable_Peripheral(); - - ResetProperties(); } CPeripheralAddon::~CPeripheralAddon(void) { DestroyAddon(); - - delete m_struct.toAddon; - delete m_struct.toKodi; - delete m_struct.props; -} - -void CPeripheralAddon::ResetProperties(void) -{ - // Initialise members - m_strUserPath = CSpecialProtocol::TranslatePath(Profile()); - m_strClientPath = CSpecialProtocol::TranslatePath(Path()); - - m_struct.props->user_path = m_strUserPath.c_str(); - m_struct.props->addon_path = m_strClientPath.c_str(); - - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->feature_count = cb_feature_count; - m_struct.toKodi->feature_type = cb_feature_type; - m_struct.toKodi->refresh_button_maps = cb_refresh_button_maps; - m_struct.toKodi->trigger_scan = cb_trigger_scan; - - memset(m_struct.toAddon, 0, sizeof(KodiToAddonFuncTable_Peripheral)); } bool CPeripheralAddon::CreateAddon(void) { CExclusiveLock lock(m_dllSection); - // Reset all properties to defaults - ResetProperties(); - // Create directory for user data - if (!CDirectory::Exists(m_strUserPath)) - CDirectory::Create(m_strUserPath); + const std::string strUserPath = CSpecialProtocol::TranslatePath(Profile()); + if (!CDirectory::Exists(strUserPath)) + CDirectory::Create(strUserPath); // Initialise the add-on CLog::Log(LOGDEBUG, "PERIPHERAL - {} - creating peripheral add-on instance '{}'", __FUNCTION__, Name()); - if (CreateInstance(&m_struct) != ADDON_STATUS_OK) + if (CreateInstance(this, m_addonInstance) != ADDON_STATUS_OK) return false; if (!GetAddonProperties()) { - DestroyInstance(); + DestroyInstance(m_addonInstance); return false; } @@ -136,7 +106,7 @@ void CPeripheralAddon::DestroyAddon() { CExclusiveLock lock(m_dllSection); - DestroyInstance(); + DestroyInstance(m_addonInstance); } } @@ -145,7 +115,7 @@ bool CPeripheralAddon::GetAddonProperties(void) PERIPHERAL_CAPABILITIES addonCapabilities = {}; // Get the capabilities - m_struct.toAddon->get_capabilities(&m_struct, &addonCapabilities); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_capabilities_v1(m_addonInstance, &addonCapabilities); // Verify capabilities against addon.xml if (m_bProvidesJoysticks != addonCapabilities.provides_joysticks) @@ -353,22 +323,19 @@ void CPeripheralAddon::GetDirectory(const std::string& strPath, CFileItemList& i bool CPeripheralAddon::PerformDeviceScan(PeripheralScanResults& results) { - unsigned int peripheralCount; + size_t peripheralCount; PERIPHERAL_INFO* pScanResults; PERIPHERAL_ERROR retVal; CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->perform_device_scan) - return false; - LogError(retVal = - m_struct.toAddon->perform_device_scan(&m_struct, &peripheralCount, &pScanResults), + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_perform_device_scan_v1(m_addonInstance, &pScanResults, &peripheralCount), "PerformDeviceScan()"); if (retVal == PERIPHERAL_NO_ERROR) { - for (unsigned int i = 0; i < peripheralCount; i++) + for (size_t i = 0; i < peripheralCount; i++) { kodi::addon::Peripheral peripheral(pScanResults[i]); PeripheralScanResult result(PERIPHERAL_BUS_ADDON); @@ -393,7 +360,7 @@ bool CPeripheralAddon::PerformDeviceScan(PeripheralScanResults& results) results.m_results.push_back(result); } - m_struct.toAddon->free_scan_results(&m_struct, peripheralCount, pScanResults); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_scan_results_v1(m_addonInstance, pScanResults, peripheralCount); return true; } @@ -408,18 +375,15 @@ bool CPeripheralAddon::ProcessEvents(void) CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->get_events) - return false; - PERIPHERAL_ERROR retVal; - unsigned int eventCount = 0; + size_t eventCount = 0; PERIPHERAL_EVENT* pEvents = nullptr; - LogError(retVal = m_struct.toAddon->get_events(&m_struct, &eventCount, &pEvents), "GetEvents()"); + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_events_v1(m_addonInstance, &pEvents, &eventCount), "GetEvents()"); if (retVal == PERIPHERAL_NO_ERROR) { - for (unsigned int i = 0; i < eventCount; i++) + for (size_t i = 0; i < eventCount; i++) { kodi::addon::PeripheralEvent event(pEvents[i]); PeripheralPtr device = GetPeripheral(event.PeripheralIndex()); @@ -469,7 +433,7 @@ bool CPeripheralAddon::ProcessEvents(void) std::static_pointer_cast(it.second)->ProcessAxisMotions(); } - m_struct.toAddon->free_events(&m_struct, eventCount, pEvents); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_events_v1(m_addonInstance, pEvents, eventCount); return true; } @@ -486,9 +450,6 @@ bool CPeripheralAddon::SendRumbleEvent(unsigned int peripheralIndex, CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->send_event) - return false; - PERIPHERAL_EVENT eventStruct = {}; eventStruct.peripheral_index = peripheralIndex; @@ -496,7 +457,7 @@ bool CPeripheralAddon::SendRumbleEvent(unsigned int peripheralIndex, eventStruct.driver_index = driverIndex; eventStruct.motor_state = magnitude; - return m_struct.toAddon->send_event(&m_struct, &eventStruct); + return m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_send_event_v1(m_addonInstance, &eventStruct); } bool CPeripheralAddon::GetJoystickProperties(unsigned int index, CPeripheralJoystick& joystick) @@ -506,21 +467,18 @@ bool CPeripheralAddon::GetJoystickProperties(unsigned int index, CPeripheralJoys CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->get_joystick_info) - return false; - PERIPHERAL_ERROR retVal; JOYSTICK_INFO joystickStruct; - LogError(retVal = m_struct.toAddon->get_joystick_info(&m_struct, index, &joystickStruct), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_joystick_info_v1(m_addonInstance, index, &joystickStruct), "GetJoystickInfo()"); if (retVal == PERIPHERAL_NO_ERROR) { kodi::addon::Joystick addonJoystick(joystickStruct); SetJoystickInfo(joystick, addonJoystick); - m_struct.toAddon->free_joystick_info(&m_struct, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_joystick_info_v1(m_addonInstance, &joystickStruct); return true; } @@ -537,9 +495,6 @@ bool CPeripheralAddon::GetFeatures(const CPeripheral* device, CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->get_features) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -548,25 +503,25 @@ bool CPeripheralAddon::GetFeatures(const CPeripheral* device, JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - unsigned int featureCount = 0; + size_t featureCount = 0; JOYSTICK_FEATURE* pFeatures = nullptr; - LogError(retVal = m_struct.toAddon->get_features( - &m_struct, &joystickStruct, strControllerId.c_str(), &featureCount, &pFeatures), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_features_v1( + m_addonInstance, &joystickStruct, strControllerId.c_str(), &pFeatures, &featureCount), "GetFeatures()"); kodi::addon::Joystick::FreeStruct(joystickStruct); if (retVal == PERIPHERAL_NO_ERROR) { - for (unsigned int i = 0; i < featureCount; i++) + for (size_t i = 0; i < featureCount; i++) { kodi::addon::JoystickFeature feature(pFeatures[i]); if (feature.Type() != JOYSTICK_FEATURE_TYPE_UNKNOWN) features[feature.Name()] = feature; } - m_struct.toAddon->free_features(&m_struct, featureCount, pFeatures); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_features_v1(m_addonInstance, pFeatures, featureCount); return true; } @@ -583,9 +538,6 @@ bool CPeripheralAddon::MapFeature(const CPeripheral* device, CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->map_features) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -597,8 +549,8 @@ bool CPeripheralAddon::MapFeature(const CPeripheral* device, JOYSTICK_FEATURE addonFeature; feature.ToStruct(addonFeature); - LogError(retVal = m_struct.toAddon->map_features(&m_struct, &joystickStruct, - strControllerId.c_str(), 1, &addonFeature), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_map_features_v1(m_addonInstance, &joystickStruct, + strControllerId.c_str(), &addonFeature, 1), "MapFeatures()"); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -614,9 +566,6 @@ bool CPeripheralAddon::GetIgnoredPrimitives(const CPeripheral* device, Primitive CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->get_ignored_primitives) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -625,21 +574,21 @@ bool CPeripheralAddon::GetIgnoredPrimitives(const CPeripheral* device, Primitive JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - unsigned int primitiveCount = 0; + size_t primitiveCount = 0; JOYSTICK_DRIVER_PRIMITIVE* pPrimitives = nullptr; - LogError(retVal = m_struct.toAddon->get_ignored_primitives(&m_struct, &joystickStruct, - &primitiveCount, &pPrimitives), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_ignored_primitives_v1(m_addonInstance, &joystickStruct, + &pPrimitives, &primitiveCount), "GetIgnoredPrimitives()"); kodi::addon::Joystick::FreeStruct(joystickStruct); if (retVal == PERIPHERAL_NO_ERROR) { - for (unsigned int i = 0; i < primitiveCount; i++) + for (size_t i = 0; i < primitiveCount; i++) primitives.emplace_back(pPrimitives[i]); - m_struct.toAddon->free_primitives(&m_struct, primitiveCount, pPrimitives); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_primitives_v1(m_addonInstance, pPrimitives, primitiveCount); return true; } @@ -655,9 +604,6 @@ bool CPeripheralAddon::SetIgnoredPrimitives(const CPeripheral* device, CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->set_ignored_primitives) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -668,14 +614,14 @@ bool CPeripheralAddon::SetIgnoredPrimitives(const CPeripheral* device, JOYSTICK_DRIVER_PRIMITIVE* addonPrimitives = nullptr; kodi::addon::DriverPrimitives::ToStructs(primitives, &addonPrimitives); - const unsigned int primitiveCount = static_cast(primitives.size()); + const size_t primitiveCount = static_cast(primitives.size()); - LogError(retVal = m_struct.toAddon->set_ignored_primitives(&m_struct, &joystickStruct, - primitiveCount, addonPrimitives), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_set_ignored_primitives_v1(m_addonInstance, &joystickStruct, + addonPrimitives, primitiveCount), "SetIgnoredPrimitives()"); kodi::addon::Joystick::FreeStruct(joystickStruct); - kodi::addon::DriverPrimitives::FreeStructs(primitiveCount, addonPrimitives); + kodi::addon::DriverPrimitives::FreeStructs(addonPrimitives, primitiveCount); return retVal == PERIPHERAL_NO_ERROR; } @@ -687,16 +633,13 @@ void CPeripheralAddon::SaveButtonMap(const CPeripheral* device) CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->save_button_map) - return; - kodi::addon::Joystick joystickInfo; GetJoystickInfo(device, joystickInfo); JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_struct.toAddon->save_button_map(&m_struct, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_save_button_map_v1(m_addonInstance, &joystickStruct); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -711,16 +654,13 @@ void CPeripheralAddon::RevertButtonMap(const CPeripheral* device) CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->revert_button_map) - return; - kodi::addon::Joystick joystickInfo; GetJoystickInfo(device, joystickInfo); JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_struct.toAddon->revert_button_map(&m_struct, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_revert_button_map_v1(m_addonInstance, &joystickStruct); kodi::addon::Joystick::FreeStruct(joystickStruct); } @@ -736,7 +676,7 @@ void CPeripheralAddon::ResetButtonMap(const CPeripheral* device, const std::stri JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_struct.toAddon->reset_button_map(&m_struct, &joystickStruct, strControllerId.c_str()); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_reset_button_map_v1(m_addonInstance, &joystickStruct, strControllerId.c_str()); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -754,10 +694,7 @@ void CPeripheralAddon::PowerOffJoystick(unsigned int index) CSharedLock lock(m_dllSection); - if (!m_struct.toAddon->power_off_joystick) - return; - - m_struct.toAddon->power_off_joystick(&m_struct, index); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_power_off_joystick_v1(m_addonInstance, index); } void CPeripheralAddon::RegisterButtonMap(CPeripheral* device, IButtonMap* buttonMap) @@ -794,7 +731,7 @@ void CPeripheralAddon::UnregisterButtonMap(CPeripheral* device) m_buttonMaps.end()); } -void CPeripheralAddon::RefreshButtonMaps(const std::string& strDeviceName /* = "" */) +void CPeripheralAddon::RefreshButtonMaps(const std::string& strDeviceName, const std::string& controllerId) { CSingleLock lock(m_buttonMapMutex); @@ -923,41 +860,3 @@ std::string CPeripheralAddon::GetProvider(PeripheralType type) return ""; } - -void CPeripheralAddon::cb_trigger_scan(void* kodiInstance) -{ - if (kodiInstance == nullptr) - return; - - static_cast(kodiInstance)->TriggerDeviceScan(); -} - -void CPeripheralAddon::cb_refresh_button_maps(void* kodiInstance, - const char* deviceName, - const char* controllerId) -{ - if (!kodiInstance) - return; - - static_cast(kodiInstance)->RefreshButtonMaps(deviceName ? deviceName : ""); -} - -unsigned int CPeripheralAddon::cb_feature_count(void* kodiInstance, - const char* controllerId, - JOYSTICK_FEATURE_TYPE type) -{ - if (kodiInstance == nullptr || controllerId == nullptr) - return 0; - - return static_cast(kodiInstance)->FeatureCount(controllerId, type); -} - -JOYSTICK_FEATURE_TYPE CPeripheralAddon::cb_feature_type(void* kodiInstance, - const char* controllerId, - const char* featureName) -{ - if (kodiInstance == nullptr || controllerId == nullptr || featureName == nullptr) - return JOYSTICK_FEATURE_TYPE_UNKNOWN; - - return static_cast(kodiInstance)->FeatureType(controllerId, featureName); -} diff --git a/xbmc/peripherals/addons/PeripheralAddon.h b/xbmc/peripherals/addons/PeripheralAddon.h index d8cfcb45422f8..c88f3675e7919 100644 --- a/xbmc/peripherals/addons/PeripheralAddon.h +++ b/xbmc/peripherals/addons/PeripheralAddon.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" +#include "addons/interface/InstanceHandler.h" #include "addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h" #include "input/joysticks/JoystickTypes.h" #include "peripherals/PeripheralTypes.h" @@ -39,7 +39,7 @@ class CPeripherals; typedef std::vector PrimitiveVector; typedef std::map FeatureMap; -class CPeripheralAddon : public ADDON::IAddonInstanceHandler +class CPeripheralAddon : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: explicit CPeripheralAddon(const ADDON::AddonInfoPtr& addonInfo, CPeripherals& manager); @@ -109,15 +109,23 @@ class CPeripheralAddon : public ADDON::IAddonInstanceHandler .asBoolean(); } -private: - void UnregisterButtonMap(CPeripheral* device); - - // Binary add-on callbacks + /*! + * @brief Callback functions from addon to kodi + */ + //@{ void TriggerDeviceScan(); - void RefreshButtonMaps(const std::string& strDeviceName = ""); + /*---AUTO_GEN_PARSE---*/ + void RefreshButtonMaps(const std::string& strDeviceName, const std::string& controllerId = ""); + /*---AUTO_GEN_PARSE---*/ unsigned int FeatureCount(const std::string& controllerId, JOYSTICK_FEATURE_TYPE type) const; + /*---AUTO_GEN_PARSE---*/ JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId, const std::string& featureName) const; + /*---AUTO_GEN_PARSE---*/ + //@} + +private: + void UnregisterButtonMap(CPeripheral* device); /*! * @brief Helper functions @@ -128,11 +136,6 @@ class CPeripheralAddon : public ADDON::IAddonInstanceHandler static void SetJoystickInfo(CPeripheralJoystick& joystick, const kodi::addon::Joystick& joystickInfo); - /*! - * @brief Reset all class members to their defaults. Called by the constructors - */ - void ResetProperties(void); - /*! * @brief Retrieve add-on properties from the add-on */ @@ -146,26 +149,6 @@ class CPeripheralAddon : public ADDON::IAddonInstanceHandler // Construction parameters CPeripherals& m_manager; - /* @brief Cache for const char* members in PERIPHERAL_PROPERTIES */ - std::string m_strUserPath; /*!< @brief translated path to the user profile */ - std::string m_strClientPath; /*!< @brief translated path to this add-on */ - - /*! - * @brief Callback functions from addon to kodi - */ - //@{ - static void cb_trigger_scan(void* kodiInstance); - static void cb_refresh_button_maps(void* kodiInstance, - const char* deviceName, - const char* controllerId); - static unsigned int cb_feature_count(void* kodiInstance, - const char* controllerId, - JOYSTICK_FEATURE_TYPE type); - static JOYSTICK_FEATURE_TYPE cb_feature_type(void* kodiInstance, - const char* controllerId, - const char* featureName); - //@} - /* @brief Add-on properties */ bool m_bProvidesJoysticks; bool m_bSupportsJoystickRumble; @@ -182,7 +165,7 @@ class CPeripheralAddon : public ADDON::IAddonInstanceHandler /* @brief Thread synchronization */ mutable CCriticalSection m_critSection; - AddonInstance_Peripheral m_struct; + KODI_HANDLE m_addonInstance; CSharedSection m_dllSection; }; diff --git a/xbmc/pvr/addons/PVRClient.cpp b/xbmc/pvr/addons/PVRClient.cpp index 6b60ea7b6c980..f698cb6d59bd8 100644 --- a/xbmc/pvr/addons/PVRClient.cpp +++ b/xbmc/pvr/addons/PVRClient.cpp @@ -9,7 +9,7 @@ #include "PVRClient.h" #include "ServiceBroker.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h" // added for compile test on related sources only! +#include "addons/interface/api/addon-instance/pvr.h" #include "cores/VideoPlayer/DVDDemuxers/DVDDemuxUtils.h" #include "dialogs/GUIDialogKaiToast.h" #include "events/EventLog.h" @@ -53,6 +53,7 @@ extern "C" } using namespace ADDON; +using namespace KODI::ADDONS::INTERFACE; namespace PVR { @@ -62,22 +63,12 @@ namespace PVR CPVRClient::CPVRClient(const ADDON::AddonInfoPtr& addonInfo) : IAddonInstanceHandler(ADDON_INSTANCE_PVR, addonInfo) { - // Create all interface parts independent to make API changes easier if - // something is added - m_struct.props = new AddonProperties_PVR(); - m_struct.toKodi = new AddonToKodiFuncTable_PVR(); - m_struct.toAddon = new KodiToAddonFuncTable_PVR(); - ResetProperties(); } CPVRClient::~CPVRClient() { Destroy(); - - delete m_struct.props; - delete m_struct.toKodi; - delete m_struct.toAddon; } void CPVRClient::StopRunningInstance() @@ -123,38 +114,6 @@ void CPVRClient::ResetProperties(int iClientId /* = PVR_INVALID_CLIENT_ID */) m_menuhooks.reset(); m_timertypes.clear(); m_clientCapabilities.clear(); - - m_struct.props->strUserPath = m_strUserPath.c_str(); - m_struct.props->strClientPath = m_strClientPath.c_str(); - m_struct.props->iEpgMaxPastDays = - CServiceBroker::GetPVRManager().EpgContainer().GetPastDaysToDisplay(); - m_struct.props->iEpgMaxFutureDays = - CServiceBroker::GetPVRManager().EpgContainer().GetFutureDaysToDisplay(); - - m_struct.toKodi->kodiInstance = this; - m_struct.toKodi->TransferEpgEntry = cb_transfer_epg_entry; - m_struct.toKodi->TransferChannelEntry = cb_transfer_channel_entry; - m_struct.toKodi->TransferProviderEntry = cb_transfer_provider_entry; - m_struct.toKodi->TransferTimerEntry = cb_transfer_timer_entry; - m_struct.toKodi->TransferRecordingEntry = cb_transfer_recording_entry; - m_struct.toKodi->AddMenuHook = cb_add_menu_hook; - m_struct.toKodi->RecordingNotification = cb_recording_notification; - m_struct.toKodi->TriggerChannelUpdate = cb_trigger_channel_update; - m_struct.toKodi->TriggerProvidersUpdate = cb_trigger_provider_update; - m_struct.toKodi->TriggerChannelGroupsUpdate = cb_trigger_channel_groups_update; - m_struct.toKodi->TriggerTimerUpdate = cb_trigger_timer_update; - m_struct.toKodi->TriggerRecordingUpdate = cb_trigger_recording_update; - m_struct.toKodi->TriggerEpgUpdate = cb_trigger_epg_update; - m_struct.toKodi->FreeDemuxPacket = cb_free_demux_packet; - m_struct.toKodi->AllocateDemuxPacket = cb_allocate_demux_packet; - m_struct.toKodi->TransferChannelGroup = cb_transfer_channel_group; - m_struct.toKodi->TransferChannelGroupMember = cb_transfer_channel_group_member; - m_struct.toKodi->ConnectionStateChange = cb_connection_state_change; - m_struct.toKodi->EpgEventStateChange = cb_epg_event_state_change; - m_struct.toKodi->GetCodecByName = cb_get_codec_by_name; - - // Clear function addresses to have NULL if not set by addon - memset(m_struct.toAddon, 0, sizeof(KodiToAddonFuncTable_PVR)); } ADDON_STATUS CPVRClient::Create(int iClientId) @@ -168,7 +127,7 @@ ADDON_STATUS CPVRClient::Create(int iClientId) /* initialise the add-on */ bool bReadyToUse(false); CLog::LogFC(LOGDEBUG, LOGPVR, "Creating PVR add-on instance '{}'", Name()); - if ((status = CreateInstance(&m_struct)) == ADDON_STATUS_OK) + if ((status = CreateInstance(this, m_addonInstance)) == ADDON_STATUS_OK) bReadyToUse = GetAddonProperties(); m_bReadyToUse = bReadyToUse; @@ -187,7 +146,7 @@ void CPVRClient::Destroy() m_bBlockAddonCalls = true; m_allAddonCallsFinished.Wait(); - DestroyInstance(); + DestroyInstance(m_addonInstance); CLog::LogFC(LOGDEBUG, LOGPVR, "PVR add-on instance '{}' destroyed", GetFriendlyName()); @@ -424,8 +383,8 @@ bool CPVRClient::GetAddonProperties() /* get the capabilities */ PVR_ERROR retVal = DoAddonCall( __func__, - [&addonCapabilities](const AddonInstance* addon) { - return addon->toAddon->GetCapabilities(addon, &addonCapabilities); + [this, &addonCapabilities](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_capabilities_v1(addon, &addonCapabilities); }, true, false); @@ -435,8 +394,8 @@ bool CPVRClient::GetAddonProperties() /* get the name of the backend */ retVal = DoAddonCall( __func__, - [&strBackendName](const AddonInstance* addon) { - return addon->toAddon->GetBackendName(addon, strBackendName, sizeof(strBackendName)); + [this, &strBackendName](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_backend_name_v1(addon, strBackendName, sizeof(strBackendName)); }, true, false); @@ -446,8 +405,8 @@ bool CPVRClient::GetAddonProperties() /* get the connection string */ retVal = DoAddonCall( __func__, - [&strConnectionString](const AddonInstance* addon) { - return addon->toAddon->GetConnectionString(addon, strConnectionString, + [this, &strConnectionString](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_connection_string_v1(addon, strConnectionString, sizeof(strConnectionString)); }, true, false); @@ -461,8 +420,8 @@ bool CPVRClient::GetAddonProperties() /* backend version number */ retVal = DoAddonCall( __func__, - [&strBackendVersion](const AddonInstance* addon) { - return addon->toAddon->GetBackendVersion(addon, strBackendVersion, + [this, &strBackendVersion](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_backend_version_v1(addon, strBackendVersion, sizeof(strBackendVersion)); }, true, false); @@ -473,8 +432,8 @@ bool CPVRClient::GetAddonProperties() /* backend hostname */ retVal = DoAddonCall( __func__, - [&strBackendHostname](const AddonInstance* addon) { - return addon->toAddon->GetBackendHostname(addon, strBackendHostname, + [this, &strBackendHostname](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_backend_hostname_v1(addon, strBackendHostname, sizeof(strBackendHostname)); }, true, false); @@ -485,12 +444,12 @@ bool CPVRClient::GetAddonProperties() /* timer types */ retVal = DoAddonCall( __func__, - [this, strFriendlyName, &addonCapabilities, &timerTypes](const AddonInstance* addon) { + [this, strFriendlyName, &addonCapabilities, &timerTypes](KODI_ADDON_PVR_HDL addon) { std::unique_ptr types_array( new PVR_TIMER_TYPE[PVR_ADDON_TIMERTYPE_ARRAY_SIZE]); - int size = PVR_ADDON_TIMERTYPE_ARRAY_SIZE; + size_t size = PVR_ADDON_TIMERTYPE_ARRAY_SIZE; - PVR_ERROR retval = addon->toAddon->GetTimerTypes(addon, types_array.get(), &size); + PVR_ERROR retval = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_timer_types_v1(addon, types_array.get(), &size); if (retval == PVR_ERROR_NOT_IMPLEMENTED) { @@ -550,7 +509,7 @@ bool CPVRClient::GetAddonProperties() if (retval == PVR_ERROR_NO_ERROR) { timerTypes.reserve(size); - for (int i = 0; i < size; ++i) + for (size_t i = 0; i < size; ++i) { if (types_array[i].iId == PVR_TIMER_TYPE_NONE) { @@ -615,10 +574,10 @@ PVR_ERROR CPVRClient::GetDriveSpace(uint64_t& iTotal, uint64_t& iUsed) iTotal = 0; iUsed = 0; - return DoAddonCall(__func__, [&iTotal, &iUsed](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &iTotal, &iUsed](KODI_ADDON_PVR_HDL addon) { uint64_t iTotalSpace = 0; uint64_t iUsedSpace = 0; - PVR_ERROR error = addon->toAddon->GetDriveSpace(addon, &iTotalSpace, &iUsedSpace); + PVR_ERROR error = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_drive_space_v1(addon, &iTotalSpace, &iUsedSpace); if (error == PVR_ERROR_NO_ERROR) { iTotal = iTotalSpace; @@ -632,7 +591,7 @@ PVR_ERROR CPVRClient::StartChannelScan() { return DoAddonCall( __func__, - [](const AddonInstance* addon) { return addon->toAddon->OpenDialogChannelScan(addon); }, + [this](KODI_ADDON_PVR_HDL addon) { return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_open_dialog_channel_scan_v1(addon); }, m_clientCapabilities.SupportsChannelScan()); } @@ -640,10 +599,10 @@ PVR_ERROR CPVRClient::OpenDialogChannelAdd(const std::shared_ptr& c { return DoAddonCall( __func__, - [channel](const AddonInstance* addon) { + [this, channel](KODI_ADDON_PVR_HDL addon) { PVR_CHANNEL addonChannel; WriteClientChannelInfo(channel, addonChannel); - return addon->toAddon->OpenDialogChannelAdd(addon, &addonChannel); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_open_dialog_channel_add_v1(addon, &addonChannel); }, m_clientCapabilities.SupportsChannelSettings()); } @@ -652,10 +611,10 @@ PVR_ERROR CPVRClient::OpenDialogChannelSettings(const std::shared_ptrtoAddon->OpenDialogChannelSettings(addon, &addonChannel); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_open_dialog_channel_settings_v1(addon, &addonChannel); }, m_clientCapabilities.SupportsChannelSettings()); } @@ -664,10 +623,10 @@ PVR_ERROR CPVRClient::DeleteChannel(const std::shared_ptr& channel) { return DoAddonCall( __func__, - [channel](const AddonInstance* addon) { + [this, channel](KODI_ADDON_PVR_HDL addon) { PVR_CHANNEL addonChannel; WriteClientChannelInfo(channel, addonChannel); - return addon->toAddon->DeleteChannel(addon, &addonChannel); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_delete_channel_v1(addon, &addonChannel); }, m_clientCapabilities.SupportsChannelSettings()); } @@ -676,12 +635,12 @@ PVR_ERROR CPVRClient::RenameChannel(const std::shared_ptr& channel) { return DoAddonCall( __func__, - [channel](const AddonInstance* addon) { + [this, channel](KODI_ADDON_PVR_HDL addon) { PVR_CHANNEL addonChannel; WriteClientChannelInfo(channel, addonChannel); strncpy(addonChannel.strChannelName, channel->ChannelName().c_str(), sizeof(addonChannel.strChannelName) - 1); - return addon->toAddon->RenameChannel(addon, &addonChannel); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_rename_channel_v1(addon, &addonChannel); }, m_clientCapabilities.SupportsChannelSettings()); } @@ -690,16 +649,12 @@ PVR_ERROR CPVRClient::GetEPGForChannel(int iChannelUid, CPVREpg* epg, time_t sta { return DoAddonCall( __func__, - [this, iChannelUid, epg, start, end](const AddonInstance* addon) + [this, iChannelUid, epg, start, end](KODI_ADDON_PVR_HDL addon) { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = epg; - int iPVRTimeCorrection = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_iPVRTimeCorrection; - return addon->toAddon->GetEPGForChannel(addon, &handle, iChannelUid, + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_epg_for_channel_v1(addon, epg, iChannelUid, start ? start - iPVRTimeCorrection : 0, end ? end - iPVRTimeCorrection : 0); }, @@ -710,8 +665,8 @@ PVR_ERROR CPVRClient::SetEPGMaxPastDays(int iPastDays) { return DoAddonCall( __func__, - [iPastDays](const AddonInstance* addon) { - return addon->toAddon->SetEPGMaxPastDays(addon, iPastDays); + [this, iPastDays](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_set_epg_max_past_days_v1(addon, iPastDays); }, m_clientCapabilities.SupportsEPG()); } @@ -720,8 +675,8 @@ PVR_ERROR CPVRClient::SetEPGMaxFutureDays(int iFutureDays) { return DoAddonCall( __func__, - [iFutureDays](const AddonInstance* addon) { - return addon->toAddon->SetEPGMaxFutureDays(addon, iFutureDays); + [this, iFutureDays](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_set_epg_max_future_days_v1(addon, iFutureDays); }, m_clientCapabilities.SupportsEPG()); } @@ -812,9 +767,9 @@ PVR_ERROR CPVRClient::IsRecordable(const std::shared_ptr& { return DoAddonCall( __func__, - [tag, &bIsRecordable](const AddonInstance* addon) { + [this, tag, &bIsRecordable](KODI_ADDON_PVR_HDL addon) { CAddonEpgTag addonTag(tag); - return addon->toAddon->IsEPGTagRecordable(addon, &addonTag, &bIsRecordable); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_is_epg_tag_recordable_v1(addon, &addonTag, &bIsRecordable); }, m_clientCapabilities.SupportsRecordings() && m_clientCapabilities.SupportsEPG()); } @@ -824,9 +779,9 @@ PVR_ERROR CPVRClient::IsPlayable(const std::shared_ptr& ta { return DoAddonCall( __func__, - [tag, &bIsPlayable](const AddonInstance* addon) { + [this, tag, &bIsPlayable](KODI_ADDON_PVR_HDL addon) { CAddonEpgTag addonTag(tag); - return addon->toAddon->IsEPGTagPlayable(addon, &addonTag, &bIsPlayable); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_is_epg_tag_playable_v1(addon, &addonTag, &bIsPlayable); }, m_clientCapabilities.SupportsEPG()); } @@ -844,14 +799,14 @@ void CPVRClient::WriteStreamProperties(const PVR_NAMED_VALUE* properties, PVR_ERROR CPVRClient::GetEpgTagStreamProperties(const std::shared_ptr& tag, CPVRStreamProperties& props) { - return DoAddonCall(__func__, [&tag, &props](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &tag, &props](KODI_ADDON_PVR_HDL addon) { CAddonEpgTag addonTag(tag); - unsigned int iPropertyCount = STREAM_MAX_PROPERTY_COUNT; + size_t iPropertyCount = STREAM_MAX_PROPERTY_COUNT; std::unique_ptr properties(new PVR_NAMED_VALUE[iPropertyCount]); memset(properties.get(), 0, iPropertyCount * sizeof(PVR_NAMED_VALUE)); - PVR_ERROR error = addon->toAddon->GetEPGTagStreamProperties(addon, &addonTag, properties.get(), + PVR_ERROR error = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_epg_tag_stream_properties_v1(addon, &addonTag, properties.get(), &iPropertyCount); if (error == PVR_ERROR_NO_ERROR) WriteStreamProperties(properties.get(), iPropertyCount, props); @@ -866,16 +821,16 @@ PVR_ERROR CPVRClient::GetEpgTagEdl(const std::shared_ptr& edls.clear(); return DoAddonCall( __func__, - [&epgTag, &edls](const AddonInstance* addon) { + [this, &epgTag, &edls](KODI_ADDON_PVR_HDL addon) { CAddonEpgTag addonTag(epgTag); PVR_EDL_ENTRY edl_array[PVR_ADDON_EDL_LENGTH]; - int size = PVR_ADDON_EDL_LENGTH; - PVR_ERROR error = addon->toAddon->GetEPGTagEdl(addon, &addonTag, edl_array, &size); + size_t size = PVR_ADDON_EDL_LENGTH; + PVR_ERROR error = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_epg_tag_edl_v1(addon, &addonTag, edl_array, &size); if (error == PVR_ERROR_NO_ERROR) { edls.reserve(size); - for (int i = 0; i < size; ++i) + for (size_t i = 0; i < size; ++i) edls.emplace_back(edl_array[i]); } return error; @@ -888,8 +843,8 @@ PVR_ERROR CPVRClient::GetChannelGroupsAmount(int& iGroups) iGroups = -1; return DoAddonCall( __func__, - [&iGroups](const AddonInstance* addon) { - return addon->toAddon->GetChannelGroupsAmount(addon, &iGroups); + [this, &iGroups](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channel_groups_amount_v1(addon, &iGroups); }, m_clientCapabilities.SupportsChannelGroups()); } @@ -898,12 +853,8 @@ PVR_ERROR CPVRClient::GetChannelGroups(CPVRChannelGroups* groups) { return DoAddonCall( __func__, - [this, groups](const AddonInstance* addon) - { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = groups; - return addon->toAddon->GetChannelGroups(addon, &handle, groups->IsRadio()); + [this, groups](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channel_groups_v1(addon, groups, groups->IsRadio()); }, m_clientCapabilities.SupportsChannelGroups()); } @@ -913,14 +864,10 @@ PVR_ERROR CPVRClient::GetChannelGroupMembers( { return DoAddonCall( __func__, - [this, group, &groupMembers](const AddonInstance* addon) { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = &groupMembers; - + [this, group, &groupMembers](KODI_ADDON_PVR_HDL addon) { PVR_CHANNEL_GROUP tag; WriteClientGroupInfo(*group, tag); - return addon->toAddon->GetChannelGroupMembers(addon, &handle, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channel_group_members_v1(addon, group, &tag); }, m_clientCapabilities.SupportsChannelGroups()); } @@ -928,20 +875,15 @@ PVR_ERROR CPVRClient::GetChannelGroupMembers( PVR_ERROR CPVRClient::GetProvidersAmount(int& iProviders) { iProviders = -1; - return DoAddonCall(__func__, [&iProviders](const AddonInstance* addon) { - return addon->toAddon->GetProvidersAmount(addon, &iProviders); + return DoAddonCall(__func__, [this, &iProviders](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_providers_amount_v1(addon, &iProviders); }); } PVR_ERROR CPVRClient::GetProviders(CPVRProvidersContainer& providers) { - return DoAddonCall( - __func__, - [this, &providers](const AddonInstance* addon) { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = &providers; - return addon->toAddon->GetProviders(addon, &handle); + return DoAddonCall(__func__, [this, &providers](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_providers_v1(addon, &providers); }, m_clientCapabilities.SupportsProviders()); } @@ -949,8 +891,8 @@ PVR_ERROR CPVRClient::GetProviders(CPVRProvidersContainer& providers) PVR_ERROR CPVRClient::GetChannelsAmount(int& iChannels) { iChannels = -1; - return DoAddonCall(__func__, [&iChannels](const AddonInstance* addon) { - return addon->toAddon->GetChannelsAmount(addon, &iChannels); + return DoAddonCall(__func__, [this, &iChannels](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channels_amount_v1(addon, &iChannels); }); } @@ -958,11 +900,8 @@ PVR_ERROR CPVRClient::GetChannels(bool radio, std::vectortoAddon->GetChannels(addon, &handle, radio); + [this, radio, &channels](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channels_v1(addon, &channels, radio); }, (radio && m_clientCapabilities.SupportsRadio()) || (!radio && m_clientCapabilities.SupportsTV())); @@ -973,8 +912,8 @@ PVR_ERROR CPVRClient::GetRecordingsAmount(bool deleted, int& iRecordings) iRecordings = -1; return DoAddonCall( __func__, - [deleted, &iRecordings](const AddonInstance* addon) { - return addon->toAddon->GetRecordingsAmount(addon, deleted, &iRecordings); + [this, deleted, &iRecordings](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recordings_amount_v1(addon, deleted, &iRecordings); }, m_clientCapabilities.SupportsRecordings() && (!deleted || m_clientCapabilities.SupportsRecordingsUndelete())); @@ -984,12 +923,8 @@ PVR_ERROR CPVRClient::GetRecordings(CPVRRecordings* results, bool deleted) { return DoAddonCall( __func__, - [this, results, deleted](const AddonInstance* addon) - { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = results; - return addon->toAddon->GetRecordings(addon, &handle, deleted); + [this, results, deleted](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recordings_v1(addon, results, deleted); }, m_clientCapabilities.SupportsRecordings() && (!deleted || m_clientCapabilities.SupportsRecordingsUndelete())); @@ -999,10 +934,10 @@ PVR_ERROR CPVRClient::DeleteRecording(const CPVRRecording& recording) { return DoAddonCall( __func__, - [&recording](const AddonInstance* addon) { + [this, &recording](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->DeleteRecording(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_delete_recording_v1(addon, &tag); }, m_clientCapabilities.SupportsRecordings() && m_clientCapabilities.SupportsRecordingsDelete()); } @@ -1011,10 +946,10 @@ PVR_ERROR CPVRClient::UndeleteRecording(const CPVRRecording& recording) { return DoAddonCall( __func__, - [&recording](const AddonInstance* addon) { + [this, &recording](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->UndeleteRecording(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_undelete_recording_v1(addon, &tag); }, m_clientCapabilities.SupportsRecordingsUndelete()); } @@ -1023,8 +958,8 @@ PVR_ERROR CPVRClient::DeleteAllRecordingsFromTrash() { return DoAddonCall( __func__, - [](const AddonInstance* addon) { - return addon->toAddon->DeleteAllRecordingsFromTrash(addon); + [this](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_delete_all_recordings_from_trash_v1(addon); }, m_clientCapabilities.SupportsRecordingsUndelete()); } @@ -1033,10 +968,10 @@ PVR_ERROR CPVRClient::RenameRecording(const CPVRRecording& recording) { return DoAddonCall( __func__, - [&recording](const AddonInstance* addon) { + [this, &recording](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->RenameRecording(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_rename_recording_v1(addon, &tag); }, m_clientCapabilities.SupportsRecordings()); } @@ -1045,10 +980,10 @@ PVR_ERROR CPVRClient::SetRecordingLifetime(const CPVRRecording& recording) { return DoAddonCall( __func__, - [&recording](const AddonInstance* addon) { + [this, &recording](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->SetRecordingLifetime(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_set_recording_lifetime_v1(addon, &tag); }, m_clientCapabilities.SupportsRecordingsLifetimeChange()); } @@ -1057,10 +992,10 @@ PVR_ERROR CPVRClient::SetRecordingPlayCount(const CPVRRecording& recording, int { return DoAddonCall( __func__, - [&recording, count](const AddonInstance* addon) { + [this, &recording, count](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->SetRecordingPlayCount(addon, &tag, count); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_set_recording_play_count_v1(addon, &tag, count); }, m_clientCapabilities.SupportsRecordingsPlayCount()); } @@ -1070,10 +1005,10 @@ PVR_ERROR CPVRClient::SetRecordingLastPlayedPosition(const CPVRRecording& record { return DoAddonCall( __func__, - [&recording, lastplayedposition](const AddonInstance* addon) { + [this, &recording, lastplayedposition](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->SetRecordingLastPlayedPosition(addon, &tag, lastplayedposition); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_set_recording_last_played_position_v1(addon, &tag, lastplayedposition); }, m_clientCapabilities.SupportsRecordingsLastPlayedPosition()); } @@ -1083,10 +1018,10 @@ PVR_ERROR CPVRClient::GetRecordingLastPlayedPosition(const CPVRRecording& record iPosition = -1; return DoAddonCall( __func__, - [&recording, &iPosition](const AddonInstance* addon) { + [this, &recording, &iPosition](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->GetRecordingLastPlayedPosition(addon, &tag, &iPosition); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recording_last_played_position_v1(addon, &tag, &iPosition); }, m_clientCapabilities.SupportsRecordingsLastPlayedPosition()); } @@ -1097,17 +1032,17 @@ PVR_ERROR CPVRClient::GetRecordingEdl(const CPVRRecording& recording, edls.clear(); return DoAddonCall( __func__, - [&recording, &edls](const AddonInstance* addon) { + [this, &recording, &edls](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); PVR_EDL_ENTRY edl_array[PVR_ADDON_EDL_LENGTH]; - int size = PVR_ADDON_EDL_LENGTH; - PVR_ERROR error = addon->toAddon->GetRecordingEdl(addon, &tag, edl_array, &size); + size_t size = PVR_ADDON_EDL_LENGTH; + PVR_ERROR error = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recording_edl_v1(addon, &tag, edl_array, &size); if (error == PVR_ERROR_NO_ERROR) { edls.reserve(size); - for (int i = 0; i < size; ++i) + for (size_t i = 0; i < size; ++i) edls.emplace_back(edl_array[i]); } return error; @@ -1119,10 +1054,10 @@ PVR_ERROR CPVRClient::GetRecordingSize(const CPVRRecording& recording, int64_t& { return DoAddonCall( __func__, - [&recording, &sizeInBytes](const AddonInstance* addon) { + [this, &recording, &sizeInBytes](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(recording, tag); - return addon->toAddon->GetRecordingSize(addon, &tag, &sizeInBytes); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recording_size_v1(addon, &tag, &sizeInBytes); }, m_clientCapabilities.SupportsRecordingsSize()); } @@ -1132,8 +1067,8 @@ PVR_ERROR CPVRClient::GetTimersAmount(int& iTimers) iTimers = -1; return DoAddonCall( __func__, - [&iTimers](const AddonInstance* addon) { - return addon->toAddon->GetTimersAmount(addon, &iTimers); + [this, &iTimers](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_timers_amount_v1(addon, &iTimers); }, m_clientCapabilities.SupportsTimers()); } @@ -1142,12 +1077,8 @@ PVR_ERROR CPVRClient::GetTimers(CPVRTimersContainer* results) { return DoAddonCall( __func__, - [this, results](const AddonInstance* addon) - { - ADDON_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = results; - return addon->toAddon->GetTimers(addon, &handle); + [this, results](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_timers_v1(addon, results); }, m_clientCapabilities.SupportsTimers()); } @@ -1156,10 +1087,10 @@ PVR_ERROR CPVRClient::AddTimer(const CPVRTimerInfoTag& timer) { return DoAddonCall( __func__, - [&timer](const AddonInstance* addon) { + [this, &timer](KODI_ADDON_PVR_HDL addon) { PVR_TIMER tag; WriteClientTimerInfo(timer, tag); - return addon->toAddon->AddTimer(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_add_timer_v1(addon, &tag); }, m_clientCapabilities.SupportsTimers()); } @@ -1168,10 +1099,10 @@ PVR_ERROR CPVRClient::DeleteTimer(const CPVRTimerInfoTag& timer, bool bForce /* { return DoAddonCall( __func__, - [&timer, bForce](const AddonInstance* addon) { + [this, &timer, bForce](KODI_ADDON_PVR_HDL addon) { PVR_TIMER tag; WriteClientTimerInfo(timer, tag); - return addon->toAddon->DeleteTimer(addon, &tag, bForce); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_delete_timer_v1(addon, &tag, bForce); }, m_clientCapabilities.SupportsTimers()); } @@ -1180,10 +1111,10 @@ PVR_ERROR CPVRClient::UpdateTimer(const CPVRTimerInfoTag& timer) { return DoAddonCall( __func__, - [&timer](const AddonInstance* addon) { + [this, &timer](KODI_ADDON_PVR_HDL addon) { PVR_TIMER tag; WriteClientTimerInfo(timer, tag); - return addon->toAddon->UpdateTimer(addon, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_update_timer_v1(addon, &tag); }, m_clientCapabilities.SupportsTimers()); } @@ -1195,84 +1126,10 @@ PVR_ERROR CPVRClient::GetTimerTypes(std::vector>& return PVR_ERROR_NO_ERROR; } -PVR_ERROR CPVRClient::GetStreamReadChunkSize(int& iChunkSize) -{ - return DoAddonCall( - __func__, - [&iChunkSize](const AddonInstance* addon) { - return addon->toAddon->GetStreamReadChunkSize(addon, &iChunkSize); - }, - m_clientCapabilities.SupportsRecordings() || m_clientCapabilities.HandlesInputStream()); -} - -PVR_ERROR CPVRClient::ReadLiveStream(void* lpBuf, int64_t uiBufSize, int& iRead) -{ - iRead = -1; - return DoAddonCall(__func__, [&lpBuf, uiBufSize, &iRead](const AddonInstance* addon) { - iRead = addon->toAddon->ReadLiveStream(addon, static_cast(lpBuf), - static_cast(uiBufSize)); - return (iRead == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::ReadRecordedStream(void* lpBuf, int64_t uiBufSize, int& iRead) -{ - iRead = -1; - return DoAddonCall(__func__, [&lpBuf, uiBufSize, &iRead](const AddonInstance* addon) { - iRead = addon->toAddon->ReadRecordedStream(addon, static_cast(lpBuf), - static_cast(uiBufSize)); - return (iRead == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::SeekLiveStream(int64_t iFilePosition, int iWhence, int64_t& iPosition) -{ - iPosition = -1; - return DoAddonCall(__func__, [iFilePosition, iWhence, &iPosition](const AddonInstance* addon) { - iPosition = addon->toAddon->SeekLiveStream(addon, iFilePosition, iWhence); - return (iPosition == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::SeekRecordedStream(int64_t iFilePosition, int iWhence, int64_t& iPosition) -{ - iPosition = -1; - return DoAddonCall(__func__, [iFilePosition, iWhence, &iPosition](const AddonInstance* addon) { - iPosition = addon->toAddon->SeekRecordedStream(addon, iFilePosition, iWhence); - return (iPosition == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::SeekTime(double time, bool backwards, double* startpts) -{ - return DoAddonCall(__func__, [time, backwards, &startpts](const AddonInstance* addon) { - return addon->toAddon->SeekTime(addon, time, backwards, startpts) ? PVR_ERROR_NO_ERROR - : PVR_ERROR_NOT_IMPLEMENTED; - }); -} - -PVR_ERROR CPVRClient::GetLiveStreamLength(int64_t& iLength) -{ - iLength = -1; - return DoAddonCall(__func__, [&iLength](const AddonInstance* addon) { - iLength = addon->toAddon->LengthLiveStream(addon); - return (iLength == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::GetRecordedStreamLength(int64_t& iLength) -{ - iLength = -1; - return DoAddonCall(__func__, [&iLength](const AddonInstance* addon) { - iLength = addon->toAddon->LengthRecordedStream(addon); - return (iLength == -1) ? PVR_ERROR_NOT_IMPLEMENTED : PVR_ERROR_NO_ERROR; - }); -} - PVR_ERROR CPVRClient::SignalQuality(int channelUid, PVR_SIGNAL_STATUS& qualityinfo) { - return DoAddonCall(__func__, [channelUid, &qualityinfo](const AddonInstance* addon) { - return addon->toAddon->GetSignalStatus(addon, channelUid, &qualityinfo); + return DoAddonCall(__func__, [this, channelUid, &qualityinfo](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_signal_status_v1(addon, channelUid, &qualityinfo); }); } @@ -1280,8 +1137,8 @@ PVR_ERROR CPVRClient::GetDescrambleInfo(int channelUid, PVR_DESCRAMBLE_INFO& des { return DoAddonCall( __func__, - [channelUid, &descrambleinfo](const AddonInstance* addon) { - return addon->toAddon->GetDescrambleInfo(addon, channelUid, &descrambleinfo); + [this, channelUid, &descrambleinfo](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_descramble_info_v1(addon, channelUid, &descrambleinfo); }, m_clientCapabilities.SupportsDescrambleInfo()); } @@ -1289,19 +1146,19 @@ PVR_ERROR CPVRClient::GetDescrambleInfo(int channelUid, PVR_DESCRAMBLE_INFO& des PVR_ERROR CPVRClient::GetChannelStreamProperties(const std::shared_ptr& channel, CPVRStreamProperties& props) { - return DoAddonCall(__func__, [this, &channel, &props](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &channel, &props](KODI_ADDON_PVR_HDL addon) { if (!CanPlayChannel(channel)) return PVR_ERROR_NO_ERROR; // no error, but no need to obtain the values from the addon PVR_CHANNEL tag = {}; WriteClientChannelInfo(channel, tag); - unsigned int iPropertyCount = STREAM_MAX_PROPERTY_COUNT; + size_t iPropertyCount = STREAM_MAX_PROPERTY_COUNT; std::unique_ptr properties(new PVR_NAMED_VALUE[iPropertyCount]); memset(properties.get(), 0, iPropertyCount * sizeof(PVR_NAMED_VALUE)); PVR_ERROR error = - addon->toAddon->GetChannelStreamProperties(addon, &tag, properties.get(), &iPropertyCount); + m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channel_stream_properties_v1(addon, &tag, properties.get(), &iPropertyCount); if (error == PVR_ERROR_NO_ERROR) WriteStreamProperties(properties.get(), iPropertyCount, props); @@ -1312,18 +1169,18 @@ PVR_ERROR CPVRClient::GetChannelStreamProperties(const std::shared_ptr& recording, CPVRStreamProperties& props) { - return DoAddonCall(__func__, [this, &recording, &props](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &recording, &props](KODI_ADDON_PVR_HDL addon) { if (!m_clientCapabilities.SupportsRecordings()) return PVR_ERROR_NO_ERROR; // no error, but no need to obtain the values from the addon PVR_RECORDING tag = {}; WriteClientRecordingInfo(*recording, tag); - unsigned int iPropertyCount = STREAM_MAX_PROPERTY_COUNT; + size_t iPropertyCount = STREAM_MAX_PROPERTY_COUNT; std::unique_ptr properties(new PVR_NAMED_VALUE[iPropertyCount]); memset(properties.get(), 0, iPropertyCount * sizeof(PVR_NAMED_VALUE)); - PVR_ERROR error = addon->toAddon->GetRecordingStreamProperties(addon, &tag, properties.get(), + PVR_ERROR error = m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_recording_stream_properties_v1(addon, &tag, properties.get(), &iPropertyCount); if (error == PVR_ERROR_NO_ERROR) WriteStreamProperties(properties.get(), iPropertyCount, props); @@ -1332,57 +1189,6 @@ PVR_ERROR CPVRClient::GetRecordingStreamProperties(const std::shared_ptrtoAddon->GetStreamProperties(addon, props); - }); -} - -PVR_ERROR CPVRClient::DemuxReset() -{ - return DoAddonCall( - __func__, - [](const AddonInstance* addon) { - addon->toAddon->DemuxReset(addon); - return PVR_ERROR_NO_ERROR; - }, - m_clientCapabilities.HandlesDemuxing()); -} - -PVR_ERROR CPVRClient::DemuxAbort() -{ - return DoAddonCall( - __func__, - [](const AddonInstance* addon) { - addon->toAddon->DemuxAbort(addon); - return PVR_ERROR_NO_ERROR; - }, - m_clientCapabilities.HandlesDemuxing()); -} - -PVR_ERROR CPVRClient::DemuxFlush() -{ - return DoAddonCall( - __func__, - [](const AddonInstance* addon) { - addon->toAddon->DemuxFlush(addon); - return PVR_ERROR_NO_ERROR; - }, - m_clientCapabilities.HandlesDemuxing()); -} - -PVR_ERROR CPVRClient::DemuxRead(DemuxPacket*& packet) -{ - return DoAddonCall( - __func__, - [&packet](const AddonInstance* addon) { - packet = static_cast(addon->toAddon->DemuxRead(addon)); - return packet ? PVR_ERROR_NO_ERROR : PVR_ERROR_NOT_IMPLEMENTED; - }, - m_clientCapabilities.HandlesDemuxing()); -} - const char* CPVRClient::ToString(const PVR_ERROR error) { switch (error) @@ -1412,7 +1218,7 @@ const char* CPVRClient::ToString(const PVR_ERROR error) } PVR_ERROR CPVRClient::DoAddonCall(const char* strFunctionName, - const std::function& function, + const std::function& function, bool bIsImplemented /* = true */, bool bCheckReadyToUse /* = true */) const { @@ -1430,7 +1236,7 @@ PVR_ERROR CPVRClient::DoAddonCall(const char* strFunctionName, m_allAddonCallsFinished.Reset(); m_iAddonCalls++; - const PVR_ERROR error = function(&m_struct); + const PVR_ERROR error = function(m_addonInstance); m_iAddonCalls--; if (m_iAddonCalls == 0) @@ -1450,147 +1256,29 @@ bool CPVRClient::CanPlayChannel(const std::shared_ptr& channel) con (m_clientCapabilities.SupportsRadio() && channel->IsRadio()))); } -PVR_ERROR CPVRClient::OpenLiveStream(const std::shared_ptr& channel) -{ - if (!channel) - return PVR_ERROR_INVALID_PARAMETERS; - - return DoAddonCall(__func__, [this, channel](const AddonInstance* addon) { - CloseLiveStream(); - - if (!CanPlayChannel(channel)) - { - CLog::LogFC(LOGDEBUG, LOGPVR, "Add-on '{}' can not play channel '{}'", GetFriendlyName(), - channel->ChannelName()); - return PVR_ERROR_SERVER_ERROR; - } - else - { - CLog::LogFC(LOGDEBUG, LOGPVR, "Opening live stream for channel '{}'", channel->ChannelName()); - PVR_CHANNEL tag; - WriteClientChannelInfo(channel, tag); - return addon->toAddon->OpenLiveStream(addon, &tag) ? PVR_ERROR_NO_ERROR - : PVR_ERROR_NOT_IMPLEMENTED; - } - }); -} - -PVR_ERROR CPVRClient::OpenRecordedStream(const std::shared_ptr& recording) -{ - if (!recording) - return PVR_ERROR_INVALID_PARAMETERS; - - return DoAddonCall( - __func__, - [this, recording](const AddonInstance* addon) { - CloseRecordedStream(); - - PVR_RECORDING tag; - WriteClientRecordingInfo(*recording, tag); - CLog::LogFC(LOGDEBUG, LOGPVR, "Opening stream for recording '{}'", recording->m_strTitle); - return addon->toAddon->OpenRecordedStream(addon, &tag) ? PVR_ERROR_NO_ERROR - : PVR_ERROR_NOT_IMPLEMENTED; - }, - m_clientCapabilities.SupportsRecordings()); -} - -PVR_ERROR CPVRClient::CloseLiveStream() -{ - return DoAddonCall(__func__, [](const AddonInstance* addon) { - addon->toAddon->CloseLiveStream(addon); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::CloseRecordedStream() -{ - return DoAddonCall(__func__, [](const AddonInstance* addon) { - addon->toAddon->CloseRecordedStream(addon); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::PauseStream(bool bPaused) -{ - return DoAddonCall(__func__, [bPaused](const AddonInstance* addon) { - addon->toAddon->PauseStream(addon, bPaused); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::SetSpeed(int speed) -{ - return DoAddonCall(__func__, [speed](const AddonInstance* addon) { - addon->toAddon->SetSpeed(addon, speed); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::FillBuffer(bool mode) -{ - return DoAddonCall(__func__, [mode](const AddonInstance* addon) { - addon->toAddon->FillBuffer(addon, mode); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::CanPauseStream(bool& bCanPause) const -{ - bCanPause = false; - return DoAddonCall(__func__, [&bCanPause](const AddonInstance* addon) { - bCanPause = addon->toAddon->CanPauseStream(addon); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::CanSeekStream(bool& bCanSeek) const -{ - bCanSeek = false; - return DoAddonCall(__func__, [&bCanSeek](const AddonInstance* addon) { - bCanSeek = addon->toAddon->CanSeekStream(addon); - return PVR_ERROR_NO_ERROR; - }); -} - -PVR_ERROR CPVRClient::GetStreamTimes(PVR_STREAM_TIMES* times) -{ - return DoAddonCall(__func__, [×](const AddonInstance* addon) { - return addon->toAddon->GetStreamTimes(addon, times); - }); -} - -PVR_ERROR CPVRClient::IsRealTimeStream(bool& bRealTime) const -{ - bRealTime = false; - return DoAddonCall(__func__, [&bRealTime](const AddonInstance* addon) { - bRealTime = addon->toAddon->IsRealTimeStream(addon); - return PVR_ERROR_NO_ERROR; - }); -} - PVR_ERROR CPVRClient::OnSystemSleep() { return DoAddonCall( - __func__, [](const AddonInstance* addon) { return addon->toAddon->OnSystemSleep(addon); }); + __func__, [this](KODI_ADDON_PVR_HDL addon) { return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_on_system_sleep_v1(addon); }); } PVR_ERROR CPVRClient::OnSystemWake() { return DoAddonCall( - __func__, [](const AddonInstance* addon) { return addon->toAddon->OnSystemWake(addon); }); + __func__, [this](KODI_ADDON_PVR_HDL addon) { return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_on_system_wake_v1(addon); }); } PVR_ERROR CPVRClient::OnPowerSavingActivated() { - return DoAddonCall(__func__, [](const AddonInstance* addon) { - return addon->toAddon->OnPowerSavingActivated(addon); + return DoAddonCall(__func__, [this](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_on_power_saving_activated_v1(addon); }); } PVR_ERROR CPVRClient::OnPowerSavingDeactivated() { - return DoAddonCall(__func__, [](const AddonInstance* addon) { - return addon->toAddon->OnPowerSavingDeactivated(addon); + return DoAddonCall(__func__, [this](KODI_ADDON_PVR_HDL addon) { + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_on_power_saving_deactivated_v1(addon); }); } @@ -1605,7 +1293,7 @@ std::shared_ptr CPVRClient::GetMenuHooks() PVR_ERROR CPVRClient::CallEpgTagMenuHook(const CPVRClientMenuHook& hook, const std::shared_ptr& tag) { - return DoAddonCall(__func__, [&hook, &tag](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &hook, &tag](KODI_ADDON_PVR_HDL addon) { CAddonEpgTag addonTag(tag); PVR_MENUHOOK menuHook; @@ -1613,14 +1301,14 @@ PVR_ERROR CPVRClient::CallEpgTagMenuHook(const CPVRClientMenuHook& hook, menuHook.iHookId = hook.GetId(); menuHook.iLocalizedStringId = hook.GetLabelId(); - return addon->toAddon->CallEPGMenuHook(addon, &menuHook, &addonTag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_call_epg_menu_hook_v1(addon, &menuHook, &addonTag); }); } PVR_ERROR CPVRClient::CallChannelMenuHook(const CPVRClientMenuHook& hook, const std::shared_ptr& channel) { - return DoAddonCall(__func__, [&hook, &channel](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &hook, &channel](KODI_ADDON_PVR_HDL addon) { PVR_CHANNEL tag; WriteClientChannelInfo(channel, tag); @@ -1629,7 +1317,7 @@ PVR_ERROR CPVRClient::CallChannelMenuHook(const CPVRClientMenuHook& hook, menuHook.iHookId = hook.GetId(); menuHook.iLocalizedStringId = hook.GetLabelId(); - return addon->toAddon->CallChannelMenuHook(addon, &menuHook, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_call_channel_menu_hook_v1(addon, &menuHook, &tag); }); } @@ -1637,7 +1325,7 @@ PVR_ERROR CPVRClient::CallRecordingMenuHook(const CPVRClientMenuHook& hook, const std::shared_ptr& recording, bool bDeleted) { - return DoAddonCall(__func__, [&hook, &recording, &bDeleted](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &hook, &recording, &bDeleted](KODI_ADDON_PVR_HDL addon) { PVR_RECORDING tag; WriteClientRecordingInfo(*recording, tag); @@ -1646,14 +1334,14 @@ PVR_ERROR CPVRClient::CallRecordingMenuHook(const CPVRClientMenuHook& hook, menuHook.iHookId = hook.GetId(); menuHook.iLocalizedStringId = hook.GetLabelId(); - return addon->toAddon->CallRecordingMenuHook(addon, &menuHook, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_call_recording_menu_hook_v1(addon, &menuHook, &tag); }); } PVR_ERROR CPVRClient::CallTimerMenuHook(const CPVRClientMenuHook& hook, const std::shared_ptr& timer) { - return DoAddonCall(__func__, [&hook, &timer](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &hook, &timer](KODI_ADDON_PVR_HDL addon) { PVR_TIMER tag; WriteClientTimerInfo(*timer, tag); @@ -1662,19 +1350,19 @@ PVR_ERROR CPVRClient::CallTimerMenuHook(const CPVRClientMenuHook& hook, menuHook.iHookId = hook.GetId(); menuHook.iLocalizedStringId = hook.GetLabelId(); - return addon->toAddon->CallTimerMenuHook(addon, &menuHook, &tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_call_timer_menu_hook_v1(addon, &menuHook, &tag); }); } PVR_ERROR CPVRClient::CallSettingsMenuHook(const CPVRClientMenuHook& hook) { - return DoAddonCall(__func__, [&hook](const AddonInstance* addon) { + return DoAddonCall(__func__, [this, &hook](KODI_ADDON_PVR_HDL addon) { PVR_MENUHOOK menuHook; menuHook.category = PVR_MENUHOOK_SETTING; menuHook.iHookId = hook.GetId(); menuHook.iLocalizedStringId = hook.GetLabelId(); - return addon->toAddon->CallSettingsMenuHook(addon, &menuHook); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_call_settings_menu_hook_v1(addon, &menuHook); }); } @@ -1704,34 +1392,45 @@ int CPVRClient::GetPriority() const } void CPVRClient::HandleAddonCallback(const char* strFunctionName, - void* kodiInstance, - const std::function& function, + const std::function& function, bool bForceCall /* = false */) { // Check preconditions. - CPVRClient* client = static_cast(kodiInstance); - if (!client) - { - CLog::LogFunction(LOGERROR, strFunctionName, "No instance pointer given!"); - return; - } - - if (!bForceCall && client->m_bBlockAddonCalls && client->m_iAddonCalls == 0) + if (!bForceCall && m_bBlockAddonCalls && m_iAddonCalls == 0) { CLog::LogFunction(LOGWARNING, strFunctionName, LOGPVR, "Ignoring callback from PVR client '{}'", - client->GetFriendlyName()); + GetFriendlyName()); return; } // Call. - function(client); + function(); } -void CPVRClient::cb_transfer_channel_group(void* kodiInstance, - const ADDON_HANDLE handle, +int CPVRClient::cb_get_epg_max_future_days() +{ + int result = -1; + HandleAddonCallback(__func__, [&]() { + // update channels in the next iteration of the pvrmanager's main loop + result = CServiceBroker::GetPVRManager().EpgContainer().GetFutureDaysToDisplay(); + }); + return result; +} + +int CPVRClient::cb_get_epg_max_past_days() +{ + int result = -1; + HandleAddonCallback(__func__, [&]() { + // update channels in the next iteration of the pvrmanager's main loop + result = CServiceBroker::GetPVRManager().EpgContainer().GetPastDaysToDisplay(); + }); + return result; +} + +void CPVRClient::cb_transfer_channel_group(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_CHANNEL_GROUP* group) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !group) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1745,18 +1444,17 @@ void CPVRClient::cb_transfer_channel_group(void* kodiInstance, } // transfer this entry to the groups container - CPVRChannelGroups* kodiGroups = static_cast(handle->dataAddress); + CPVRChannelGroups* kodiGroups = static_cast(handle); const auto transferGroup = std::make_shared(*group, kodiGroups->GetGroupAll()); kodiGroups->UpdateFromClient(transferGroup); }); } -void CPVRClient::cb_transfer_channel_group_member(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_channel_group_member(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_CHANNEL_GROUP_MEMBER* member) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !member) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1765,7 +1463,7 @@ void CPVRClient::cb_transfer_channel_group_member(void* kodiInstance, const std::shared_ptr channel = CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID(member->iChannelUniqueId, - client->GetID()); + GetID()); if (!channel) { CLog::LogF(LOGERROR, "Cannot find group '{}' or channel '{}'", member->strGroupName, @@ -1774,7 +1472,7 @@ void CPVRClient::cb_transfer_channel_group_member(void* kodiInstance, else { auto* groupMembers = - static_cast>*>(handle->dataAddress); + static_cast>*>(handle); groupMembers->emplace_back( std::make_shared(-1, // real id will be added later member->strGroupName, channel)); @@ -1782,11 +1480,10 @@ void CPVRClient::cb_transfer_channel_group_member(void* kodiInstance, }); } -void CPVRClient::cb_transfer_epg_entry(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_epg_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const EPG_TAG* epgentry) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !epgentry) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1794,56 +1491,48 @@ void CPVRClient::cb_transfer_epg_entry(void* kodiInstance, } // transfer this entry to the epg - CPVREpg* epg = static_cast(handle->dataAddress); - epg->UpdateEntry(epgentry, client->GetID()); + CPVREpg* epg = static_cast(handle); + epg->UpdateEntry(epgentry, GetID()); }); } -void CPVRClient::cb_transfer_provider_entry(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_provider_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_PROVIDER* provider) { - if (!handle) - { - CLog::LogF(LOGERROR, "Invalid handler data"); - return; - } - - CPVRClient* client = static_cast(kodiInstance); - CPVRProvidersContainer* kodiProviders = static_cast(handle->dataAddress); - if (!provider || !client || !kodiProviders) - { - CLog::LogF(LOGERROR, "Invalid handler data"); - return; - } + HandleAddonCallback(__func__, [&]() { + if (!handle || !provider) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } - /* transfer this entry to the internal channels group */ - std::shared_ptr transferProvider( - std::make_shared(*provider, client->GetID())); - kodiProviders->UpdateFromClient(transferProvider); + /* transfer this entry to the internal channels group */ + std::shared_ptr transferProvider( + std::make_shared(*provider, GetID())); + CPVRProvidersContainer* kodiProviders = static_cast(handle); + kodiProviders->UpdateFromClient(transferProvider); + }); } -void CPVRClient::cb_transfer_channel_entry(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_channel_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_CHANNEL* channel) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !channel) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); return; } - auto* channels = static_cast>*>(handle->dataAddress); - channels->emplace_back(std::make_shared(*channel, client->GetID())); + auto* channels = static_cast>*>(handle); + channels->emplace_back(std::make_shared(*channel, GetID())); }); } -void CPVRClient::cb_transfer_recording_entry(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_recording_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_RECORDING* recording) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !recording) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1852,17 +1541,16 @@ void CPVRClient::cb_transfer_recording_entry(void* kodiInstance, // transfer this entry to the recordings container const std::shared_ptr transferRecording = - std::make_shared(*recording, client->GetID()); - CPVRRecordings* recordings = static_cast(handle->dataAddress); - recordings->UpdateFromClient(transferRecording, *client); + std::make_shared(*recording, GetID()); + CPVRRecordings* recordings = static_cast(handle); + recordings->UpdateFromClient(transferRecording, *this); }); } -void CPVRClient::cb_transfer_timer_entry(void* kodiInstance, - const ADDON_HANDLE handle, +void CPVRClient::cb_transfer_timer_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_TIMER* timer) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!handle || !timer) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1873,35 +1561,34 @@ void CPVRClient::cb_transfer_timer_entry(void* kodiInstance, // ("record on any channel" condition) const std::shared_ptr channel = CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID(timer->iClientChannelUid, - client->GetID()); + GetID()); // transfer this entry to the timers container const std::shared_ptr transferTimer = - std::make_shared(*timer, channel, client->GetID()); - CPVRTimersContainer* timers = static_cast(handle->dataAddress); + std::make_shared(*timer, channel, GetID()); + CPVRTimersContainer* timers = static_cast(handle); timers->UpdateFromClient(transferTimer); }); } -void CPVRClient::cb_add_menu_hook(void* kodiInstance, const PVR_MENUHOOK* hook) +void CPVRClient::cb_add_menu_hook(const PVR_MENUHOOK* hook) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!hook) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); return; } - client->GetMenuHooks()->AddHook(*hook); + GetMenuHooks()->AddHook(*hook); }); } -void CPVRClient::cb_recording_notification(void* kodiInstance, - const char* strName, +void CPVRClient::cb_recording_notification(const char* strName, const char* strFileName, bool bOnOff) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!strFileName) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -1909,7 +1596,7 @@ void CPVRClient::cb_recording_notification(void* kodiInstance, } const std::string strLine1 = - StringUtils::Format(g_localizeStrings.Get(bOnOff ? 19197 : 19198), client->Name()); + StringUtils::Format(g_localizeStrings.Get(bOnOff ? 19197 : 19198), Name()); std::string strLine2; if (strName) strLine2 = strName; @@ -1920,114 +1607,94 @@ void CPVRClient::cb_recording_notification(void* kodiInstance, CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strLine1, strLine2, 5000, false); CServiceBroker::GetEventLog().Add( - EventPtr(new CNotificationEvent(client->Name(), strLine1, client->Icon(), strLine2))); + EventPtr(new CNotificationEvent(Name(), strLine1, Icon(), strLine2))); CLog::LogFC(LOGDEBUG, LOGPVR, "Recording {} on client '{}'. name='{}' filename='{}'", - bOnOff ? "started" : "finished", client->Name(), strName, strFileName); + bOnOff ? "started" : "finished", Name(), strName, strFileName); }); } -void CPVRClient::cb_trigger_channel_update(void* kodiInstance) +void CPVRClient::cb_trigger_channel_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { // update channels in the next iteration of the pvrmanager's main loop CServiceBroker::GetPVRManager().TriggerChannelsUpdate(); }); } -void CPVRClient::cb_trigger_provider_update(void* kodiInstance) +void CPVRClient::cb_trigger_provider_update() { - /* update the providers table in the next iteration of the pvrmanager's main loop */ - CServiceBroker::GetPVRManager().TriggerProvidersUpdate(); + HandleAddonCallback(__func__, [&]() { + /* update the providers table in the next iteration of the pvrmanager's main loop */ + CServiceBroker::GetPVRManager().TriggerProvidersUpdate(); + }); } -void CPVRClient::cb_trigger_timer_update(void* kodiInstance) +void CPVRClient::cb_trigger_timer_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { // update timers in the next iteration of the pvrmanager's main loop CServiceBroker::GetPVRManager().TriggerTimersUpdate(); }); } -void CPVRClient::cb_trigger_recording_update(void* kodiInstance) +void CPVRClient::cb_trigger_recording_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { // update recordings in the next iteration of the pvrmanager's main loop CServiceBroker::GetPVRManager().TriggerRecordingsUpdate(); }); } -void CPVRClient::cb_trigger_channel_groups_update(void* kodiInstance) +void CPVRClient::cb_trigger_channel_groups_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { // update all channel groups in the next iteration of the pvrmanager's main loop CServiceBroker::GetPVRManager().TriggerChannelGroupsUpdate(); }); } -void CPVRClient::cb_trigger_epg_update(void* kodiInstance, unsigned int iChannelUid) +void CPVRClient::cb_trigger_epg_update(unsigned int iChannelUid) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - CServiceBroker::GetPVRManager().EpgContainer().UpdateRequest(client->GetID(), iChannelUid); + HandleAddonCallback(__func__, [&]() { + CServiceBroker::GetPVRManager().EpgContainer().UpdateRequest(GetID(), iChannelUid); }); } -void CPVRClient::cb_free_demux_packet(void* kodiInstance, DEMUX_PACKET* pPacket) -{ - HandleAddonCallback(__func__, kodiInstance, - [&](CPVRClient* client) { - CDVDDemuxUtils::FreeDemuxPacket(static_cast(pPacket)); - }, - true); -} - -DEMUX_PACKET* CPVRClient::cb_allocate_demux_packet(void* kodiInstance, int iDataSize) -{ - DEMUX_PACKET* result = nullptr; - - HandleAddonCallback( - __func__, kodiInstance, - [&](CPVRClient* client) { result = CDVDDemuxUtils::AllocateDemuxPacket(iDataSize); }, true); - - return result; -} - -void CPVRClient::cb_connection_state_change(void* kodiInstance, - const char* strConnectionString, +void CPVRClient::cb_connection_state_change(const char* strConnectionString, PVR_CONNECTION_STATE newState, const char* strMessage) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!strConnectionString) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); return; } - const PVR_CONNECTION_STATE prevState(client->GetConnectionState()); + const PVR_CONNECTION_STATE prevState(GetConnectionState()); if (prevState == newState) return; CLog::LogFC(LOGDEBUG, LOGPVR, "State for connection '{}' on client '{}' changed from '{}' to '{}'", - strConnectionString, client->Name(), prevState, newState); + strConnectionString, Name(), prevState, newState); - client->SetConnectionState(newState); + SetConnectionState(newState); std::string msg; if (strMessage) msg = strMessage; - CServiceBroker::GetPVRManager().ConnectionStateChange(client, std::string(strConnectionString), + CServiceBroker::GetPVRManager().ConnectionStateChange(this, std::string(strConnectionString), newState, msg); }); } -void CPVRClient::cb_epg_event_state_change(void* kodiInstance, - EPG_TAG* tag, +void CPVRClient::cb_epg_event_state_change(EPG_TAG* tag, EPG_EVENT_STATE newState) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { + HandleAddonCallback(__func__, [&]() { if (!tag) { CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); @@ -2036,85 +1703,11 @@ void CPVRClient::cb_epg_event_state_change(void* kodiInstance, // Note: channel data and epg id may not yet be available. Tag will be fully initialized later. const std::shared_ptr epgTag = - std::make_shared(*tag, client->GetID(), nullptr, -1); + std::make_shared(*tag, GetID(), nullptr, -1); CServiceBroker::GetPVRManager().EpgContainer().UpdateFromClient(epgTag, newState); }); } -class CCodecIds -{ -public: - virtual ~CCodecIds() = default; - - static CCodecIds& GetInstance() - { - static CCodecIds _instance; - return _instance; - } - - PVR_CODEC GetCodecByName(const char* strCodecName) - { - PVR_CODEC retVal = PVR_INVALID_CODEC; - if (strlen(strCodecName) == 0) - return retVal; - - std::string strUpperCodecName = strCodecName; - StringUtils::ToUpper(strUpperCodecName); - - std::map::const_iterator it = m_lookup.find(strUpperCodecName); - if (it != m_lookup.end()) - retVal = it->second; - - return retVal; - } - -private: - CCodecIds() - { - // get ids and names - const AVCodec* codec = nullptr; - void* i = nullptr; - PVR_CODEC tmp; - while ((codec = av_codec_iterate(&i))) - { - if (av_codec_is_decoder(codec)) - { - tmp.codec_type = static_cast(codec->type); - tmp.codec_id = codec->id; - - std::string strUpperCodecName = codec->name; - StringUtils::ToUpper(strUpperCodecName); - - m_lookup.insert(std::make_pair(strUpperCodecName, tmp)); - } - } - - // teletext is not returned by av_codec_next. we got our own decoder - tmp.codec_type = PVR_CODEC_TYPE_SUBTITLE; - tmp.codec_id = AV_CODEC_ID_DVB_TELETEXT; - m_lookup.insert(std::make_pair("TELETEXT", tmp)); - - // rds is not returned by av_codec_next. we got our own decoder - tmp.codec_type = PVR_CODEC_TYPE_RDS; - tmp.codec_id = AV_CODEC_ID_NONE; - m_lookup.insert(std::make_pair("RDS", tmp)); - } - - std::map m_lookup; -}; - -PVR_CODEC CPVRClient::cb_get_codec_by_name(const void* kodiInstance, const char* strCodecName) -{ - PVR_CODEC result = PVR_INVALID_CODEC; - - HandleAddonCallback( - __func__, const_cast(kodiInstance), - [&](CPVRClient* client) { result = CCodecIds::GetInstance().GetCodecByName(strCodecName); }, - true); - - return result; -} - CPVRClientCapabilities::CPVRClientCapabilities(const CPVRClientCapabilities& other) { if (other.m_addonCapabilities) diff --git a/xbmc/pvr/addons/PVRClient.h b/xbmc/pvr/addons/PVRClient.h index 582f52f071c9f..24d6ef9a19d13 100644 --- a/xbmc/pvr/addons/PVRClient.h +++ b/xbmc/pvr/addons/PVRClient.h @@ -8,7 +8,7 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" +#include "addons/interface/InstanceHandler.h" #include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h" #include "threads/Event.h" @@ -25,6 +25,7 @@ namespace PVR { class CPVRChannel; class CPVRChannelGroup; +class CPVRChannelGroupMember; class CPVRChannelGroups; class CPVRProvider; class CPVRProvidersContainer; @@ -302,7 +303,7 @@ class CPVRClientCapabilities * * Also translates Kodi's C++ structures to the add-on's C structures. */ -class CPVRClient : public ADDON::IAddonInstanceHandler +class CPVRClient : public KODI::ADDONS::INTERFACE::IAddonInstanceHandler { public: explicit CPVRClient(const ADDON::AddonInfoPtr& addonInfo); @@ -592,6 +593,22 @@ class CPVRClient : public ADDON::IAddonInstanceHandler */ PVR_ERROR GetProviders(CPVRProvidersContainer& providers); + /*! + * @brief Get the signal quality of the stream that's currently open. + * @param channelUid Channel unique identifier + * @param qualityinfo The signal quality. + * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. + */ + PVR_ERROR SignalQuality(int channelUid, PVR_SIGNAL_STATUS& qualityinfo); + + /*! + * @brief Get the descramble information of the stream that's currently open. + * @param channelUid Channel unique identifier + * @param descrambleinfo The descramble information. + * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. + */ + PVR_ERROR GetDescrambleInfo(int channelUid, PVR_DESCRAMBLE_INFO& descrambleinfo) const; + //@} /** @name PVR recording methods */ //@{ @@ -746,67 +763,6 @@ class CPVRClient : public ADDON::IAddonInstanceHandler /** @name PVR live stream methods */ //@{ - /*! - * @brief Open a live stream on the server. - * @param channel The channel to stream. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR OpenLiveStream(const std::shared_ptr& channel); - - /*! - * @brief Close an open live stream. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR CloseLiveStream(); - - /*! - * @brief Read from an open live stream. - * @param lpBuf The buffer to store the data in. - * @param uiBufSize The amount of bytes to read. - * @param iRead The amount of bytes that were actually read from the stream. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR ReadLiveStream(void* lpBuf, int64_t uiBufSize, int& iRead); - - /*! - * @brief Seek in a live stream on a backend. - * @param iFilePosition The position to seek to. - * @param iWhence ? - * @param iPosition The new position or -1 on error. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR SeekLiveStream(int64_t iFilePosition, int iWhence, int64_t& iPosition); - - /*! - * @brief Get the lenght of the currently playing live stream, if any. - * @param iLength The total length of the stream that's currently being read or -1 on error. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR GetLiveStreamLength(int64_t& iLength); - - /*! - * @brief (Un)Pause a stream. - * @param bPaused True to pause the stream, false to unpause. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR PauseStream(bool bPaused); - - /*! - * @brief Get the signal quality of the stream that's currently open. - * @param channelUid Channel unique identifier - * @param qualityinfo The signal quality. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR SignalQuality(int channelUid, PVR_SIGNAL_STATUS& qualityinfo); - - /*! - * @brief Get the descramble information of the stream that's currently open. - * @param channelUid Channel unique identifier - * @param descrambleinfo The descramble information. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR GetDescrambleInfo(int channelUid, PVR_DESCRAMBLE_INFO& descrambleinfo) const; - /*! * @brief Fill the given container with the properties required for playback of the given channel. Values are obtained from the PVR backend. * @param channel The channel. @@ -816,88 +772,10 @@ class CPVRClient : public ADDON::IAddonInstanceHandler PVR_ERROR GetChannelStreamProperties(const std::shared_ptr& channel, CPVRStreamProperties& props); - /*! - * @brief Check whether PVR backend supports pausing the currently playing stream - * @param bCanPause True if the stream can be paused, false otherwise. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR CanPauseStream(bool& bCanPause) const; - - /*! - * @brief Check whether PVR backend supports seeking for the currently playing stream - * @param bCanSeek True if the stream can be seeked, false otherwise. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR CanSeekStream(bool& bCanSeek) const; - - /*! - * @brief Notify the pvr addon/demuxer that Kodi wishes to seek the stream by time - * @param time The absolute time since stream start - * @param backwards True to seek to keyframe BEFORE time, else AFTER - * @param startpts can be updated to point to where display should start - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - * @remarks Optional, and only used if addon has its own demuxer. - */ - PVR_ERROR SeekTime(double time, bool backwards, double* startpts); - - /*! - * @brief Notify the pvr addon/demuxer that Kodi wishes to change playback speed - * @param speed The requested playback speed - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - * @remarks Optional, and only used if addon has its own demuxer. - */ - PVR_ERROR SetSpeed(int speed); - - /*! - * @brief Notify the pvr addon/demuxer that Kodi wishes to fill demux queue - * @param mode for setting on/off - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - * @remarks Optional, and only used if addon has its own demuxer. - */ - PVR_ERROR FillBuffer(bool mode); - //@} /** @name PVR recording stream methods */ //@{ - /*! - * @brief Open a recording on the server. - * @param recording The recording to open. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR OpenRecordedStream(const std::shared_ptr& recording); - - /*! - * @brief Close an open recording stream. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR CloseRecordedStream(); - - /*! - * @brief Read from an open recording stream. - * @param lpBuf The buffer to store the data in. - * @param uiBufSize The amount of bytes to read. - * @param iRead The amount of bytes that were actually read from the stream. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR ReadRecordedStream(void* lpBuf, int64_t uiBufSize, int& iRead); - - /*! - * @brief Seek in a recording stream on a backend. - * @param iFilePosition The position to seek to. - * @param iWhence ? - * @param iPosition The new position or -1 on error. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR SeekRecordedStream(int64_t iFilePosition, int iWhence, int64_t& iPosition); - - /*! - * @brief Get the lenght of the currently playing recording stream, if any. - * @param iLength The total length of the stream that's currently being read or -1 on error. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR GetRecordedStreamLength(int64_t& iLength); - /*! * @brief Fill the given container with the properties required for playback of the given recording. Values are obtained from the PVR backend. * @param recording The recording. @@ -908,49 +786,7 @@ class CPVRClient : public ADDON::IAddonInstanceHandler CPVRStreamProperties& props); //@} - /** @name PVR demultiplexer methods */ - //@{ - - /*! - * @brief Reset the demultiplexer in the add-on. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR DemuxReset(); - - /*! - * @brief Abort the demultiplexer thread in the add-on. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR DemuxAbort(); - - /*! - * @brief Flush all data that's currently in the demultiplexer buffer in the add-on. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR DemuxFlush(); - - /*! - * @brief Read a packet from the demultiplexer. - * @param packet The packet read. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR DemuxRead(DemuxPacket*& packet); - - static const char* ToString(const PVR_ERROR error); - - /*! - * @brief Check whether the currently playing stream, if any, is a real-time stream. - * @param bRealTime True if real-time, false otherwise. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR IsRealTimeStream(bool& bRealTime) const; - /*! - * @brief Get Stream times for the currently playing stream, if any (will be moved to inputstream). - * @param times The stream times. - * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. - */ - PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES* times); /*! * @brief Get the client's menu hooks. @@ -1031,117 +867,26 @@ class CPVRClient : public ADDON::IAddonInstanceHandler */ PVR_ERROR GetStreamReadChunkSize(int& iChunkSize); - /*! - * @brief Get the interface table used between addon and Kodi. - * @todo This function will be removed after old callback library system is removed. - */ - AddonInstance_PVR* GetInstanceInterface() { return &m_struct; } - -private: - /*! - * @brief Resets all class members to their defaults. Called by the constructors. - */ - void ResetProperties(int iClientId = PVR_INVALID_CLIENT_ID); - - /*! - * @brief reads the client's properties. - * @return True on success, false otherwise. - */ - bool GetAddonProperties(); - - /*! - * @brief Copy over group info from xbmcGroup to addonGroup. - * @param xbmcGroup The group on XBMC's side. - * @param addonGroup The group on the addon's side. - */ - static void WriteClientGroupInfo(const CPVRChannelGroup& xbmcGroup, - PVR_CHANNEL_GROUP& addonGroup); - - /*! - * @brief Copy over recording info from xbmcRecording to addonRecording. - * @param xbmcRecording The recording on XBMC's side. - * @param addonRecording The recording on the addon's side. - */ - static void WriteClientRecordingInfo(const CPVRRecording& xbmcRecording, - PVR_RECORDING& addonRecording); - - /*! - * @brief Copy over timer info from xbmcTimer to addonTimer. - * @param xbmcTimer The timer on XBMC's side. - * @param addonTimer The timer on the addon's side. - */ - static void WriteClientTimerInfo(const CPVRTimerInfoTag& xbmcTimer, PVR_TIMER& addonTimer); - - /*! - * @brief Copy over channel info from xbmcChannel to addonClient. - * @param xbmcChannel The channel on XBMC's side. - * @param addonChannel The channel on the addon's side. - */ - static void WriteClientChannelInfo(const std::shared_ptr& xbmcChannel, - PVR_CHANNEL& addonChannel); - - /*! - * @brief Write the given addon properties to the given properties container. - * @param properties Pointer to an array of addon properties. - * @param iPropertyCount The number of properties contained in the addon properties array. - * @param props The container the addon properties shall be written to. - */ - static void WriteStreamProperties(const PVR_NAMED_VALUE* properties, - unsigned int iPropertyCount, - CPVRStreamProperties& props); - - /*! - * @brief Whether a channel can be played by this add-on - * @param channel The channel to check. - * @return True when it can be played, false otherwise. - */ - bool CanPlayChannel(const std::shared_ptr& channel) const; - - /*! - * @brief Stop this instance, if it is currently running. - */ - void StopRunningInstance(); - - /*! - * @brief Wraps an addon function call in order to do common pre and post function invocation actions. - * @param strFunctionName The function name, for logging purposes. - * @param function The function to wrap. It has to have return type PVR_ERROR and must take one parameter of type const AddonInstance*. - * @param bIsImplemented If false, this method will return PVR_ERROR_NOT_IMPLEMENTED. - * @param bCheckReadyToUse If true, this method will check whether this instance is ready for use and return PVR_ERROR_SERVER_ERROR if it is not. - * @return PVR_ERROR_NO_ERROR on success, any other PVR_ERROR_* value otherwise. - */ - typedef AddonInstance_PVR AddonInstance; - PVR_ERROR DoAddonCall(const char* strFunctionName, - const std::function& function, - bool bIsImplemented = true, - bool bCheckReadyToUse = true) const; - - /*! - * @brief Wraps an addon callback function call in order to do common pre and post function invocation actions. - * @param strFunctionName The function name, for logging purposes. - * @param kodiInstance The addon instance pointer. - * @param function The function to wrap. It must take one parameter of type CPVRClient*. - * @param bForceCall If true, make the call, ignoring client's state. - */ - static void HandleAddonCallback(const char* strFunctionName, - void* kodiInstance, - const std::function& function, - bool bForceCall = false); - /*! * @brief Callback functions from addon to kodi */ //@{ + int cb_get_epg_max_future_days(); + /*---AUTO_GEN_PARSE---*/ + + int cb_get_epg_max_past_days(); + /*---AUTO_GEN_PARSE---*/ + /*! * @brief Transfer a channel group from the add-on to Kodi. The group will be created if it doesn't exist. * @param kodiInstance Pointer to Kodi's CPVRClient class * @param handle The handle parameter that Kodi used when requesting the channel groups list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_channel_group(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_CHANNEL_GROUP* entry); + void cb_transfer_channel_group(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_CHANNEL_GROUP* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer a channel group member entry from the add-on to Kodi. The channel will be added to the group if the group can be found. @@ -1149,9 +894,9 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the channel group members list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_channel_group_member(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_CHANNEL_GROUP_MEMBER* entry); + void cb_transfer_channel_group_member(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_CHANNEL_GROUP_MEMBER* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer an EPG tag from the add-on to Kodi @@ -1159,9 +904,9 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the EPG data * @param entry The entry to transfer to Kodi */ - static void cb_transfer_epg_entry(void* kodiInstance, - const ADDON_HANDLE handle, - const EPG_TAG* entry); + void cb_transfer_epg_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const EPG_TAG* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer a channel entry from the add-on to Kodi @@ -1169,9 +914,9 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the channel list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_channel_entry(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_CHANNEL* entry); + void cb_transfer_channel_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_CHANNEL* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer a provider entry from the add-on to Kodi @@ -1179,9 +924,9 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the channel list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_provider_entry(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_PROVIDER* entry); + void cb_transfer_provider_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_PROVIDER* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer a timer entry from the add-on to Kodi @@ -1189,9 +934,9 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the timers list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_timer_entry(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_TIMER* entry); + void cb_transfer_timer_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_TIMER* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Transfer a recording entry from the add-on to Kodi @@ -1199,16 +944,17 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param handle The handle parameter that Kodi used when requesting the recordings list * @param entry The entry to transfer to Kodi */ - static void cb_transfer_recording_entry(void* kodiInstance, - const ADDON_HANDLE handle, - const PVR_RECORDING* entry); + void cb_transfer_recording_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_RECORDING* entry); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Add or replace a menu hook for the context menu for this add-on * @param kodiInstance Pointer to Kodi's CPVRClient class * @param hook The hook to add. */ - static void cb_add_menu_hook(void* kodiInstance, const PVR_MENUHOOK* hook); + void cb_add_menu_hook(const PVR_MENUHOOK* hook); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Display a notification in Kodi that a recording started or stopped on the server @@ -1217,62 +963,53 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param strFileName The filename of the recording * @param bOnOff True when recording started, false when it stopped */ - static void cb_recording_notification(void* kodiInstance, - const char* strName, - const char* strFileName, - bool bOnOff); + void cb_recording_notification(const char* strName, + const char* strFileName, + bool bOnOff); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Request Kodi to update it's list of channels * @param kodiInstance Pointer to Kodi's CPVRClient class */ - static void cb_trigger_channel_update(void* kodiInstance); + void cb_trigger_channel_update(); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Request Kodi to update it's list of providers * @param kodiInstance Pointer to Kodi's CPVRClient class */ - static void cb_trigger_provider_update(void* kodiInstance); + void cb_trigger_provider_update(); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Request Kodi to update it's list of timers * @param kodiInstance Pointer to Kodi's CPVRClient class */ - static void cb_trigger_timer_update(void* kodiInstance); + void cb_trigger_timer_update(); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Request Kodi to update it's list of recordings * @param kodiInstance Pointer to Kodi's CPVRClient class */ - static void cb_trigger_recording_update(void* kodiInstance); + void cb_trigger_recording_update(); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Request Kodi to update it's list of channel groups * @param kodiInstance Pointer to Kodi's CPVRClient class */ - static void cb_trigger_channel_groups_update(void* kodiInstance); + void cb_trigger_channel_groups_update(); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Schedule an EPG update for the given channel channel * @param kodiInstance A pointer to the add-on * @param iChannelUid The unique id of the channel for this add-on */ - static void cb_trigger_epg_update(void* kodiInstance, unsigned int iChannelUid); - - /*! - * @brief Free a packet that was allocated with AllocateDemuxPacket - * @param kodiInstance Pointer to Kodi's CPVRClient class - * @param pPacket The packet to free. - */ - static void cb_free_demux_packet(void* kodiInstance, DEMUX_PACKET* pPacket); - - /*! - * @brief Allocate a demux packet. Free with FreeDemuxPacket - * @param kodiInstance Pointer to Kodi's CPVRClient class. - * @param iDataSize The size of the data that will go into the packet - * @return The allocated packet. - */ - static DEMUX_PACKET* cb_allocate_demux_packet(void* kodiInstance, int iDataSize = 0); + void cb_trigger_epg_update(unsigned int iChannelUid); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Notify a state change for a PVR backend connection @@ -1282,10 +1019,10 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param strMessage A localized addon-defined string representing the new state, that can be displayed * in the UI or NULL if the Kodi-defined default string for the new state shall be displayed. */ - static void cb_connection_state_change(void* kodiInstance, - const char* strConnectionString, - PVR_CONNECTION_STATE newState, - const char* strMessage); + void cb_connection_state_change(const char* strConnectionString, + PVR_CONNECTION_STATE newState, + const char* strMessage); + /*---AUTO_GEN_PARSE---*/ /*! * @brief Notify a state change for an EPG event @@ -1295,13 +1032,99 @@ class CPVRClient : public ADDON::IAddonInstanceHandler * @param newState The new state. For EPG_EVENT_CREATED and EPG_EVENT_UPDATED, tag must be filled with all available * event data, not just a delta. For EPG_EVENT_DELETED, it is sufficient to fill EPG_TAG.iUniqueBroadcastId */ - static void cb_epg_event_state_change(void* kodiInstance, EPG_TAG* tag, EPG_EVENT_STATE newState); + void cb_epg_event_state_change(EPG_TAG* tag, EPG_EVENT_STATE newState); + /*---AUTO_GEN_PARSE---*/ + //@} - /*! @todo remove the use complete from them, or add as generl function?! - * Returns the ffmpeg codec id from given ffmpeg codec string name + static const char* ToString(const PVR_ERROR error); + +private: + /*! + * @brief Resets all class members to their defaults. Called by the constructors. */ - static PVR_CODEC cb_get_codec_by_name(const void* kodiInstance, const char* strCodecName); - //@} + void ResetProperties(int iClientId = PVR_INVALID_CLIENT_ID); + + /*! + * @brief reads the client's properties. + * @return True on success, false otherwise. + */ + bool GetAddonProperties(); + + /*! + * @brief Copy over group info from xbmcGroup to addonGroup. + * @param xbmcGroup The group on XBMC's side. + * @param addonGroup The group on the addon's side. + */ + static void WriteClientGroupInfo(const CPVRChannelGroup& xbmcGroup, + PVR_CHANNEL_GROUP& addonGroup); + + /*! + * @brief Copy over recording info from xbmcRecording to addonRecording. + * @param xbmcRecording The recording on XBMC's side. + * @param addonRecording The recording on the addon's side. + */ + static void WriteClientRecordingInfo(const CPVRRecording& xbmcRecording, + PVR_RECORDING& addonRecording); + + /*! + * @brief Copy over timer info from xbmcTimer to addonTimer. + * @param xbmcTimer The timer on XBMC's side. + * @param addonTimer The timer on the addon's side. + */ + static void WriteClientTimerInfo(const CPVRTimerInfoTag& xbmcTimer, PVR_TIMER& addonTimer); + + /*! + * @brief Copy over channel info from xbmcChannel to addonClient. + * @param xbmcChannel The channel on XBMC's side. + * @param addonChannel The channel on the addon's side. + */ + static void WriteClientChannelInfo(const std::shared_ptr& xbmcChannel, + PVR_CHANNEL& addonChannel); + + /*! + * @brief Write the given addon properties to the given properties container. + * @param properties Pointer to an array of addon properties. + * @param iPropertyCount The number of properties contained in the addon properties array. + * @param props The container the addon properties shall be written to. + */ + static void WriteStreamProperties(const PVR_NAMED_VALUE* properties, + unsigned int iPropertyCount, + CPVRStreamProperties& props); + + /*! + * @brief Whether a channel can be played by this add-on + * @param channel The channel to check. + * @return True when it can be played, false otherwise. + */ + bool CanPlayChannel(const std::shared_ptr& channel) const; + + /*! + * @brief Stop this instance, if it is currently running. + */ + void StopRunningInstance(); + + /*! + * @brief Wraps an addon function call in order to do common pre and post function invocation actions. + * @param strFunctionName The function name, for logging purposes. + * @param function The function to wrap. It has to have return type PVR_ERROR and must take one parameter of type const AddonInstance*. + * @param bIsImplemented If false, this method will return PVR_ERROR_NOT_IMPLEMENTED. + * @param bCheckReadyToUse If true, this method will check whether this instance is ready for use and return PVR_ERROR_SERVER_ERROR if it is not. + * @return PVR_ERROR_NO_ERROR on success, any other PVR_ERROR_* value otherwise. + */ + PVR_ERROR DoAddonCall(const char* strFunctionName, + const std::function& function, + bool bIsImplemented = true, + bool bCheckReadyToUse = true) const; + + /*! + * @brief Wraps an addon callback function call in order to do common pre and post function invocation actions. + * @param strFunctionName The function name, for logging purposes. + * @param function The function to wrap. It must take one parameter of type CPVRClient*. + * @param bForceCall If true, make the call, ignoring client's state. + */ + void HandleAddonCallback(const char* strFunctionName, + const std::function& function, + bool bForceCall = false); std::atomic m_bReadyToUse; /*!< true if this add-on is initialised (ADDON_Create returned true), false otherwise */ @@ -1333,6 +1156,6 @@ class CPVRClient : public ADDON::IAddonInstanceHandler mutable CCriticalSection m_critSection; - AddonInstance_PVR m_struct; + KODI_ADDON_PVR_HDL m_addonInstance; }; } // namespace PVR diff --git a/xbmc/utils/FileExtensionProvider.cpp b/xbmc/utils/FileExtensionProvider.cpp index e869fa8571592..d6d23cf1d8c5c 100644 --- a/xbmc/utils/FileExtensionProvider.cpp +++ b/xbmc/utils/FileExtensionProvider.cpp @@ -97,8 +97,7 @@ std::string CFileExtensionProvider::GetFileFolderExtensions() const bool CFileExtensionProvider::CanOperateExtension(const std::string& path) const { /*! - * @todo Improve this function to support all cases and not only audio decoder - * with tracks inside. + * @todo Improve this function to support all cases and not only audio decoder. */ // Get file extensions to find addon related to it. @@ -106,37 +105,41 @@ bool CFileExtensionProvider::CanOperateExtension(const std::string& path) const StringUtils::ToLower(strExtension); if (!strExtension.empty() && CServiceBroker::IsBinaryAddonCacheUp()) { - std::vector addonInfos; - m_addonManager.GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); + std::vector> supportList; + + std::vector> addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetExtensionSupportedAddonInfos( + strExtension, addonInfos, CAudioDecoderSupportList::FilterSelect::all); for (const auto& addonInfo : addonInfos) { - if (CAudioDecoder::HasTracks(addonInfo)) - { - const auto exts = StringUtils::Split(CAudioDecoder::GetExtensions(addonInfo), "|"); - if (std::find(exts.begin(), exts.end(), strExtension) != exts.end()) - { - /* Call addon to start a dir read about given file, if success, return - * as true. - */ - CAudioDecoder result(addonInfo); - if (result.CreateDecoder() && result.ContainsFiles(CURL(path))) - return true; - - /* If extension is supported and addon creation failed, we expect the - * file is not usable and return false here. - */ - return false; - } - } + supportList.emplace_back(new CAudioDecoder(addonInfo)); } /*! - * We expect that VFS addons can support the file, and return true. + * We expect that other addons can support the file, and return true if + * list empty. * - * @todo Check VFS addons can also be types in conflict with Kodi's + * @todo Check addons can also be types in conflict with Kodi's * supported parts! + * + * @warning This part is really big ugly at the moment and as soon as possible + * add about other addons where works with extensions!!! + * Due to @ref GetFileFolderExtensions() call from outside place before here, becomes + * it usable in this way, as there limited to AudioDecoder and VFS addons. */ - return true; + if (supportList.empty()) + { + return true; + } + + /*! + * Check all found addons about support of asked file. + */ + for (const auto& addon : supportList) + { + if (addon->CanOperateFile(path)) + return true; + } } /*! @@ -156,8 +159,8 @@ std::string CFileExtensionProvider::GetAddonExtensions(const TYPE &type) const std::string CFileExtensionProvider::GetAddonFileFolderExtensions(const TYPE &type) const { - auto it = m_addonExtensions.find(type); - if (it != m_addonExtensions.end()) + auto it = m_addonFileFolderExtensions.find(type); + if (it != m_addonFileFolderExtensions.end()) return it->second; return ""; @@ -175,23 +178,35 @@ void CFileExtensionProvider::SetAddonExtensions(const TYPE& type) { std::vector extensions; std::vector fileFolderExtensions; - std::vector addonInfos; - m_addonManager.GetAddonInfos(addonInfos, true, type); - for (const auto& addonInfo : addonInfos) + + if (type == ADDON_AUDIODECODER) { - std::string info = ADDON_VFS == type ? "@extensions" : "@extension"; - std::string ext = addonInfo->Type(type)->GetValue(info).asString(); - if (!ext.empty()) + std::vector addonInfos; + CServiceBroker::GetAudioDecoderSupportList().GetSupportedAddonInfos( + addonInfos, CAudioDecoderSupportList::FilterSelect::all); + for (const auto& addonInfo : addonInfos) { - extensions.push_back(ext); - if (type == ADDON_VFS || type == ADDON_AUDIODECODER) + for (const auto& ext : addonInfo.m_supportedExtensions) { - std::string info2 = ADDON_VFS == type ? "@filedirectories" : "@tracks"; - if (addonInfo->Type(type)->GetValue(info2).asBoolean()) - fileFolderExtensions.push_back(ext); + extensions.push_back(ext.first); + if (addonInfo.m_hasTracks) + fileFolderExtensions.push_back(ext.first); } - if (type == ADDON_VFS) + } + } + else if (type == ADDON_VFS) + { + std::vector addonInfos; + m_addonManager.GetAddonInfos(addonInfos, true, type); + for (const auto& addonInfo : addonInfos) + { + std::string ext = addonInfo->Type(type)->GetValue("@extensions").asString(); + if (!ext.empty()) { + extensions.push_back(ext); + if (addonInfo->Type(type)->GetValue("@filedirectories").asBoolean()) + fileFolderExtensions.push_back(ext); + if (addonInfo->Type(type)->GetValue("@encodedhostname").asBoolean()) { std::string prot = addonInfo->Type(type)->GetValue("@protocols").asString(); @@ -203,9 +218,8 @@ void CFileExtensionProvider::SetAddonExtensions(const TYPE& type) } } - m_addonExtensions.insert(make_pair(type, StringUtils::Join(extensions, "|"))); - if (!fileFolderExtensions.empty()) - m_addonFileFolderExtensions.insert(make_pair(type, StringUtils::Join(fileFolderExtensions, "|"))); + m_addonExtensions[type] = StringUtils::Join(extensions, "|"); + m_addonFileFolderExtensions[type] = StringUtils::Join(fileFolderExtensions, "|"); } void CFileExtensionProvider::OnAddonEvent(const AddonEvent& event) diff --git a/xbmc/windows/GUIWindowSystemInfo.cpp b/xbmc/windows/GUIWindowSystemInfo.cpp index 45dd787dee888..0a172368ab127 100644 --- a/xbmc/windows/GUIWindowSystemInfo.cpp +++ b/xbmc/windows/GUIWindowSystemInfo.cpp @@ -8,8 +8,10 @@ #include "GUIWindowSystemInfo.h" +#include "FileItem.h" #include "GUIInfoManager.h" #include "ServiceBroker.h" +#include "addons/interface/Controller.h" #include "guilib/GUIComponent.h" #include "guilib/GUIMessage.h" #include "guilib/LocalizeStrings.h" @@ -20,8 +22,10 @@ #include "utils/CPUInfo.h" #include "utils/StringUtils.h" #include "utils/SystemInfo.h" +#include "utils/Variant.h" #define CONTROL_TB_POLICY 30 +#define CONTROL_TB_ADDONS 29 #define CONTROL_BT_STORAGE 94 #define CONTROL_BT_DEFAULT 95 #define CONTROL_BT_NETWORK 96 @@ -29,18 +33,23 @@ #define CONTROL_BT_HARDWARE 98 #define CONTROL_BT_PVR 99 #define CONTROL_BT_POLICY 100 +#define CONTROL_BT_ADDONS 101 #define CONTROL_START CONTROL_BT_STORAGE -#define CONTROL_END CONTROL_BT_POLICY +#define CONTROL_END CONTROL_BT_ADDONS CGUIWindowSystemInfo::CGUIWindowSystemInfo(void) : - CGUIWindow(WINDOW_SYSTEM_INFORMATION, "SettingsSystemInfo.xml") + CGUIWindow(WINDOW_SYSTEM_INFORMATION, "SettingsSystemInfo.xml"), + m_addonProcessInfo(new CFileItemList) { m_section = CONTROL_BT_DEFAULT; m_loadType = KEEP_IN_MEMORY; } -CGUIWindowSystemInfo::~CGUIWindowSystemInfo(void) = default; +CGUIWindowSystemInfo::~CGUIWindowSystemInfo(void) +{ + delete m_addonProcessInfo; +} bool CGUIWindowSystemInfo::OnMessage(CGUIMessage& message) { @@ -74,12 +83,21 @@ bool CGUIWindowSystemInfo::OnMessage(CGUIMessage& message) m_section = focusedControl; } if (m_section >= CONTROL_BT_STORAGE && m_section <= CONTROL_BT_PVR) + { + SET_CONTROL_HIDDEN(CONTROL_TB_ADDONS); SET_CONTROL_HIDDEN(CONTROL_TB_POLICY); + } else if (m_section == CONTROL_BT_POLICY) { + SET_CONTROL_HIDDEN(CONTROL_TB_ADDONS); SET_CONTROL_LABEL(CONTROL_TB_POLICY, CServiceBroker::GetGUI()->GetInfoManager().GetLabel(SYSTEM_PRIVACY_POLICY)); SET_CONTROL_VISIBLE(CONTROL_TB_POLICY); } + else if (m_section == CONTROL_BT_ADDONS) + { + SET_CONTROL_HIDDEN(CONTROL_TB_POLICY); + SET_CONTROL_VISIBLE(CONTROL_TB_ADDONS); + } return true; } break; @@ -226,6 +244,11 @@ void CGUIWindowSystemInfo::FrameMove() SetControlLabel(i++, "{}: {}", 19025, PVR_BACKEND_TIMERS); } + else if (m_section == CONTROL_BT_ADDONS) + { + UpdateAddonProcessInfos(); + } + else if (m_section == CONTROL_BT_POLICY) { SET_CONTROL_LABEL(40, g_localizeStrings.Get(12389)); @@ -249,3 +272,111 @@ void CGUIWindowSystemInfo::SetControlLabel(int id, const char *format, int label CServiceBroker::GetGUI()->GetInfoManager().GetLabel(info)); SET_CONTROL_LABEL(id, tmpStr); } + +void CGUIWindowSystemInfo::OnInitWindow() +{ + UpdateAddonProcessInfos(); + CGUIWindow::OnInitWindow(); +} + +void CGUIWindowSystemInfo::OnWindowLoaded() +{ + CGUIWindow::OnWindowLoaded(); + m_viewControl.Reset(); + m_viewControl.SetParentWindow(GetID()); + m_viewControl.AddView(GetControl(CONTROL_TB_ADDONS)); +} + +void CGUIWindowSystemInfo::OnDeinitWindow(int nextWindowID) +{ + m_viewControl.Clear(); + m_addonProcessInfo->Clear(); + CGUIWindow::OnDeinitWindow(nextWindowID); +} + +void CGUIWindowSystemInfo::OnWindowUnload() +{ + m_viewControl.Reset(); + + CGUIWindow::OnWindowUnload(); +} + +void CGUIWindowSystemInfo::UpdateAddonProcessInfos() +{ + using namespace KODI::ADDONS::INTERFACE; + + /* + * Get info about running processes + */ + auto data = CServiceBroker::GetAddonIfcCtrl().GetProcessInfoData(); + + bool changed = false; + + /* + * Check now the active file list contains no more present addon processes, + * if yes remove them. + */ + for (int i = 0; i < m_addonProcessInfo->Size(); i++) + { + const std::string addonId = m_addonProcessInfo->Get(i)->GetLabel(); + auto it = std::find_if(data.begin(), data.end(), [addonId](const ProcessInfoData& data) { + return addonId == data.m_addon->ID(); + }); + if (it == data.end()) + { + m_addonProcessInfo->Remove(i); + --i; // don't confuse loop + changed = true; + } + } + + /* + * Now update the list of active processes to show in GUI. + */ + for (const auto& entry : data) + { + const std::string addonId = entry.m_addon->ID(); + CFileItemPtr item = FindAddonProcess(addonId); + if (!item) + { + item = std::make_shared(addonId); + + item->SetProperty("addon_id", addonId); + const std::string icon = entry.m_addon->Icon(); + if (!icon.empty()) + item->SetArt("icon", entry.m_addon->Icon()); + else + item->SetArt("icon", "DefaultFile.png"); + + m_addonProcessInfo->Add(item); + changed = true; + } + + item->SetLabel2(entry.m_addon->Name()); + item->SetProperty("cpuusagetext", StringUtils::Format("%d%%", entry.m_usedCPUPercentage)); + item->SetProperty("cpuusage", entry.m_usedCPUPercentage); + item->SetProperty("physicalmemoryusage", StringUtils::FormatFileSize(entry.m_usedPhysicalMemoryAmount)); + item->SetProperty("virtualmemoryusage", StringUtils::FormatFileSize(entry.m_usedVirtualMemoryAmount)); + item->SetProperty("sharedmemoryusage", StringUtils::FormatFileSize(entry.m_usedSharedMemoryAmount)); + item->SetProperty("threads", entry.m_usedThreadsAmount); + item->SetProperty("pid", entry.m_pid); + } + + if (changed) + { + m_viewControl.SetItems(*m_addonProcessInfo); + m_viewControl.SetCurrentView(CONTROL_TB_ADDONS, true); + } +} + +CFileItemPtr CGUIWindowSystemInfo::FindAddonProcess(const std::string& addonId) +{ + for (int i = 0; i < m_addonProcessInfo->Size(); i++) + { + CFileItemPtr item = m_addonProcessInfo->Get(i); + if (item->GetLabel() == addonId) + return item; + } + + return CFileItemPtr(); +} diff --git a/xbmc/windows/GUIWindowSystemInfo.h b/xbmc/windows/GUIWindowSystemInfo.h index e2fc50aed5b62..557b6cd3440b2 100644 --- a/xbmc/windows/GUIWindowSystemInfo.h +++ b/xbmc/windows/GUIWindowSystemInfo.h @@ -9,10 +9,13 @@ #pragma once #include "guilib/GUIWindow.h" +#include "view/GUIViewControl.h" #include #include +class CFileItemList; + class CGUIWindowSystemInfo : public CGUIWindow { public: @@ -20,10 +23,22 @@ class CGUIWindowSystemInfo : public CGUIWindow ~CGUIWindowSystemInfo(void) override; bool OnMessage(CGUIMessage& message) override; void FrameMove() override; + +protected: + void OnInitWindow() override; + void OnWindowLoaded() override; + void OnDeinitWindow(int nextWindowID) override; + void OnWindowUnload() override; + private: int m_section; void ResetLabels(); void SetControlLabel(int id, const char *format, int label, int info); + void UpdateAddonProcessInfos(); + CFileItemPtr FindAddonProcess(const std::string& addonId); + std::vector m_diskUsage; + CFileItemList* m_addonProcessInfo; + CGUIViewControl m_viewControl; };